diff --git a/Assets/01_Scenes/BossScene.unity b/Assets/01_Scenes/BossScene.unity index d3d36be..2663ada 100644 --- a/Assets/01_Scenes/BossScene.unity +++ b/Assets/01_Scenes/BossScene.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:283e74c5afcf8eef64badc969dc9886c0b72efda21f60fea04931d0a29779a3c -size 188514 +oid sha256:b59243d6bdb637313b84e7bc9ec2a0995e0bc68aaadf4435d03428b13291608b +size 185790 diff --git a/Assets/02_Scripts/Enemy/Skills/EarthquakeSkill.cs b/Assets/02_Scripts/Enemy/Skills/EarthquakeSkill.cs index 580a462..c700668 100644 --- a/Assets/02_Scripts/Enemy/Skills/EarthquakeSkill.cs +++ b/Assets/02_Scripts/Enemy/Skills/EarthquakeSkill.cs @@ -8,6 +8,9 @@ public class EarthquakeSkill : BossSkill [SerializeField] private float _activeDuration = 1.5f; // 피해 판정 유지 시간 [SerializeField] private float _recovery = 0.6f; // 판정 OFF 후 후딜 [SerializeField] private int _damage = 15; + [Header("Camera Shake")] + [SerializeField] private float _cameraShakeDuration = 0.5f; + [SerializeField] private float _cameraShakeStrength = 0.5f; [SerializeField] private float _liftForce = 0.5f; // 지면 피격 시 띄우는 세기 protected override async Awaitable RunSkill(CancellationToken token) @@ -33,6 +36,8 @@ private void Earthquake() PlayerController player = GameManager.Instance.LocalPlayer; if (player == null) return; + ShakeCamera(); + // 플레이어가 지면에 닿아 있을 때만 발동. 공중이면 아무 효과 없음. if (!player.IsGrounded) return; @@ -40,4 +45,37 @@ private void Earthquake() player.Launch(new Vector2(0f, _liftForce)); player.TakeDamage(_damage); } + + private async void ShakeCamera() + { + if (_cameraShakeDuration <= 0f || _cameraShakeStrength <= 0f) return; + + Camera mainCamera = Camera.main; + if (mainCamera == null) return; + + Transform cameraTransform = mainCamera.transform; + Vector3 previousOffset = Vector3.zero; + float elapsed = 0f; + + try + { + while (elapsed < _cameraShakeDuration) + { + float fade = 1f - elapsed / _cameraShakeDuration; + Vector2 offset = Random.insideUnitCircle * (_cameraShakeStrength * fade); + Vector3 currentOffset = new Vector3(offset.x, offset.y, 0f); + cameraTransform.localPosition += currentOffset - previousOffset; + previousOffset = currentOffset; + + await Awaitable.NextFrameAsync(destroyCancellationToken); + elapsed += Time.deltaTime; + } + } + catch (System.OperationCanceledException) { } + finally + { + if (cameraTransform != null) + cameraTransform.localPosition -= previousOffset; + } + } } diff --git a/Assets/03_Character/ColorMan/Animations/Animator/ColorManAnimator.controller b/Assets/03_Character/ColorMan/Animations/Animator/ColorManAnimator.controller index e7181b1..1ee9a89 100644 --- a/Assets/03_Character/ColorMan/Animations/Animator/ColorManAnimator.controller +++ b/Assets/03_Character/ColorMan/Animations/Animator/ColorManAnimator.controller @@ -1972,6 +1972,32 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1102 &2586254138909662861 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: GroundSlam2 + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 1ceaa33c995f9ba4fa4e981a1ad755ba, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1102 &2669098690014596114 AnimatorState: serializedVersion: 6 @@ -3237,6 +3263,9 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: -9013432840856765531} m_Position: {x: 2900, y: 440, z: 0} + - serializedVersion: 1 + m_State: {fileID: 2586254138909662861} + m_Position: {x: 2480, y: 360, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] diff --git a/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim b/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim new file mode 100644 index 0000000..1e0a908 --- /dev/null +++ b/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef397c503dc78349c44691b2e272c57c5277691228d8c7aed66b9be91260c55b +size 3025 diff --git a/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim.meta b/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim.meta new file mode 100644 index 0000000..26cf3e2 --- /dev/null +++ b/Assets/03_Character/WhiteMan/Animations/GroundSlam_Cast.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ceaa33c995f9ba4fa4e981a1ad755ba +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/08_Objects/BossSkills/EarthquakeSkill/EarthquakeSkill.prefab b/Assets/08_Objects/BossSkills/EarthquakeSkill/EarthquakeSkill.prefab index ec425ea..ace67fb 100644 --- a/Assets/08_Objects/BossSkills/EarthquakeSkill/EarthquakeSkill.prefab +++ b/Assets/08_Objects/BossSkills/EarthquakeSkill/EarthquakeSkill.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:12592007b31b53ee3bc56ad37194d5f856d4267b1508361f91aa63d7660ceb13 -size 1541 +oid sha256:29338c604ef720ad60b4f3cb4b125ce19c048d134f9196fc36322d4cdc5ac29c +size 1598