diff --git a/Assets/Prefabs/Bullet.prefab b/Assets/Prefabs/Bullet.prefab index b42b467..2f835b7 100644 --- a/Assets/Prefabs/Bullet.prefab +++ b/Assets/Prefabs/Bullet.prefab @@ -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 diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity index 80c845f..0eada5a 100644 --- a/Assets/Scenes/MainScene.unity +++ b/Assets/Scenes/MainScene.unity @@ -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} diff --git a/Assets/Scripts/Enemy.cs b/Assets/Scripts/Enemy.cs new file mode 100644 index 0000000..ddbce8b --- /dev/null +++ b/Assets/Scripts/Enemy.cs @@ -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(); + _spriteRenderer = GetComponent(); + } + + 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; + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Enemy.cs.meta b/Assets/Scripts/Enemy.cs.meta new file mode 100644 index 0000000..1490540 --- /dev/null +++ b/Assets/Scripts/Enemy.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 625c2fb5b495454296dab3fbfa13b65c +timeCreated: 1776450504 \ No newline at end of file diff --git a/Assets/Scripts/LivingEntity.cs b/Assets/Scripts/LivingEntity.cs index 0739e69..9eb6897 100644 --- a/Assets/Scripts/LivingEntity.cs +++ b/Assets/Scripts/LivingEntity.cs @@ -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); } } } diff --git a/Assets/Scripts/Player.cs b/Assets/Scripts/Player.cs index ed31d10..27c9486 100644 --- a/Assets/Scripts/Player.cs +++ b/Assets/Scripts/Player.cs @@ -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 _bulletPool = new Queue(); @@ -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(); _camera = Camera.main; // 처음 클릭 시 즉시 발사되도록 타이머 초기화 @@ -40,7 +44,7 @@ public class Player : MonoBehaviour private void FixedUpdate() { var readValue = InputManager.InputSystem.Player.Move.ReadValue(); - 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; + } } \ No newline at end of file diff --git a/ProjectSettings/ProjectAuditorSettings.asset b/ProjectSettings/ProjectAuditorSettings.asset new file mode 100644 index 0000000..1687f42 --- /dev/null +++ b/ProjectSettings/ProjectAuditorSettings.asset @@ -0,0 +1,70 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: + m_EditorClassIdentifier: UnityEditor.ProjectAuditorModule:Unity.ProjectAuditor.Editor:ProjectAuditorSettings + Rules: + rules: [] + DiagnosticParams: + paramsStack: + - PlatformGroup: + m_String: Unknown + m_SerializedParams: + - Key: StreamingAssetsFolderSizeLimit + Value: 50 + - Key: SpriteAtlasEmptySpaceLimit + Value: 50 + - Key: TextureStreamingMipmapsSizeLimit + Value: 4000 + - Key: StreamingClipThresholdBytes + Value: 218294 + - Key: LongDecompressedClipThresholdBytes + Value: 204800 + - Key: LongCompressedMobileClipThresholdBytes + Value: 204800 + - Key: LoadInBackGroundClipSizeThresholdBytes + Value: 204800 + - PlatformGroup: + m_String: Standalone + m_SerializedParams: + - Key: StreamingAssetsFolderSizeLimit + Value: 50 + - Key: SpriteAtlasEmptySpaceLimit + Value: 50 + - Key: TextureStreamingMipmapsSizeLimit + Value: 4000 + - Key: StreamingClipThresholdBytes + Value: 218294 + - Key: LongDecompressedClipThresholdBytes + Value: 204800 + - Key: LongCompressedMobileClipThresholdBytes + Value: 204800 + - Key: LoadInBackGroundClipSizeThresholdBytes + Value: 204800 + - PlatformGroup: + m_String: WebGL + m_SerializedParams: + - Key: StreamingAssetsFolderSizeLimit + Value: 50 + - Key: SpriteAtlasEmptySpaceLimit + Value: 50 + - Key: TextureStreamingMipmapsSizeLimit + Value: 4000 + - Key: StreamingClipThresholdBytes + Value: 218294 + - Key: LongDecompressedClipThresholdBytes + Value: 204800 + - Key: LongCompressedMobileClipThresholdBytes + Value: 204800 + - Key: LoadInBackGroundClipSizeThresholdBytes + Value: 204800 + CurrentParamsIndex: 0