2026-05-22 카메라 쉐이크

This commit is contained in:
2026-05-22 16:45:10 +09:00
parent d95eb9df1d
commit 430a638a16
6 changed files with 82 additions and 4 deletions

View File

@@ -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;
}
}
}