적군 구현

This commit is contained in:
김도환
2026-04-18 17:30:41 +09:00
parent 00b52e8b79
commit aec5dfbcf6
7 changed files with 421 additions and 7 deletions

View File

@@ -12,6 +12,7 @@ GameObject:
- component: {fileID: 128695639235310656}
- component: {fileID: 6310722883206932060}
- component: {fileID: 1818131859172166424}
- component: {fileID: -6154192002757220230}
m_Layer: 7
m_Name: Bullet
m_TagString: Untagged
@@ -153,3 +154,30 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 1, y: 1}
m_EdgeRadius: 0
--- !u!50 &-6154192002757220230
Rigidbody2D:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3217186003837015034}
m_BodyType: 1
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0

View File

@@ -464,6 +464,97 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &622190602
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 622190603}
- component: {fileID: 622190604}
m_Layer: 6
m_Name: Square
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &622190603
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 622190602}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1, y: 0, z: 0}
m_LocalScale: {x: 0.25, y: 0.25, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1011056640}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &622190604
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 622190602}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!1 &779260763
GameObject:
m_ObjectHideFlags: 0
@@ -650,6 +741,161 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!1 &1011056638
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1011056640}
- component: {fileID: 1011056639}
- component: {fileID: 1011056641}
- component: {fileID: 1011056642}
m_Layer: 6
m_Name: Enemy
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!212 &1011056639
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1011056638}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
m_Color: {r: 1, g: 0.5330188, b: 0.5330188, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!4 &1011056640
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1011056638}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -2.53537, y: 0.67099, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 622190603}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1011056641
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1011056638}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 625c2fb5b495454296dab3fbfa13b65c, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Enemy
health: 0
speed: 1.5
damage: 1
--- !u!61 &1011056642
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1011056638}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0.75, y: 0}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Size: {x: 0.5, y: 1}
m_EdgeRadius: 0
--- !u!1 &1146100368
GameObject:
m_ObjectHideFlags: 0
@@ -663,7 +909,7 @@ GameObject:
- component: {fileID: 1146100371}
m_Layer: 0
m_Name: Player
m_TagString: Untagged
m_TagString: Player
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@@ -755,6 +1001,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 888d5e9b7a6b20447979a287da28b419, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Player
health: 0
bulletPrefab: {fileID: 3217186003837015034, guid: 204cdd5e6f663694d8d6e719543b2018, type: 3}
bulletCount: 21
backGround: {fileID: 903255911}
@@ -814,3 +1061,4 @@ SceneRoots:
- {fileID: 1777497060}
- {fileID: 779260765}
- {fileID: 903255912}
- {fileID: 1011056640}

42
Assets/Scripts/Enemy.cs Normal file
View File

@@ -0,0 +1,42 @@
using System;
using UnityEngine;
public class Enemy: LivingEntity
{
private SpriteRenderer _spriteRenderer;
private GameObject _player;
private Player _playerScript;
public float speed = 20f;
public int attackDamage = 1;
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
_playerScript.Damage(attackDamage);
}
}
private void Start()
{
_player = GameObject.FindGameObjectsWithTag("Player")[0];
_playerScript = _player.GetComponent<Player>();
_spriteRenderer = GetComponent<SpriteRenderer>();
}
private void Update()
{
Vector2 direction = transform.position - _player.transform.position;
var rad2Deg = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0, 0, rad2Deg + 180);
transform.Translate(direction.normalized * (Time.deltaTime * speed * -1));
}
protected override void OnDamaged(float damage)
{
var spriteRenderer = _spriteRenderer;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 625c2fb5b495454296dab3fbfa13b65c
timeCreated: 1776450504

View File

@@ -1,11 +1,14 @@
using System;
using UnityEngine;
public class LivingEntity : MonoBehaviour
public abstract class LivingEntity : MonoBehaviour
{
public float health;
protected abstract void OnDamaged(float damage);
public void Damage(float amount)
{
OnDamaged(amount);
health -= amount;
if (health <= 0)
{
@@ -16,8 +19,7 @@ public class LivingEntity : MonoBehaviour
{
if (other.gameObject.layer == LayerMask.NameToLayer("Bullet"))
{
Destroy(gameObject);
other.gameObject.SetActive(false);
Damage(5);
}
}
}

View File

@@ -1,9 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
public class Player : LivingEntity
{
private Camera _camera;
private Queue<GameObject> _bulletPool = new Queue<GameObject>();
@@ -17,9 +18,12 @@ public class Player : MonoBehaviour
public float fireRate = 0.1f; // 총알 발사 간격 (0.1초마다 1발)
private float _fireTimer; // 발사 타이머
private bool _isShooting; // 발사 버튼을 누르고 있는지 여부
private SpriteRenderer _spriteRenderer;
void Start()
private void Start()
{
health = 20.0f;
_spriteRenderer = GetComponent<SpriteRenderer>();
_camera = Camera.main;
// 처음 클릭 시 즉시 발사되도록 타이머 초기화
@@ -40,7 +44,7 @@ public class Player : MonoBehaviour
private void FixedUpdate()
{
var readValue = InputManager.InputSystem.Player.Move.ReadValue<Vector2>();
var moveDir = new Vector3(readValue.x, readValue.y, 0);
var moveDir = new Vector3(readValue.x, readValue.y, 0).normalized;
transform.position += moveDir * (Time.fixedDeltaTime * moveSpeed);
backGround.transform.position = transform.position;
}
@@ -111,4 +115,21 @@ public class Player : MonoBehaviour
InputManager.InputSystem.Player.Click.canceled -= OnShootCanceled;
}
}
protected override void OnDamaged(float damage)
{
StartCoroutine(DamageEffect());
}
private IEnumerator DamageEffect()
{
var originalColor = _spriteRenderer.color;
var alphaEdited = _spriteRenderer.color;
alphaEdited.a = 0.5f;
_spriteRenderer.color = alphaEdited;
moveSpeed = 50;
yield return new WaitForSeconds(0.5f); // 0.1초 동안 유지
_spriteRenderer.color = originalColor; // 원래 색상으로 복원
moveSpeed = 20;
}
}