From 241a2fc51d4dd19dcbe576351ba655d9246815a4 Mon Sep 17 00:00:00 2001 From: Jeonghyeon Ha Date: Tue, 15 Jul 2025 16:49:41 +0900 Subject: [PATCH] =?UTF-8?q?DDD-43=20=ED=8C=8C=EB=8F=84=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EB=B0=B0=20=EC=98=A4=ED=94=84=EC=85=8B=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/0_Voyage/Ship/Player/PlayerShip.prefab | 6 ++ .../_Scripts/Ship/VoyagePlayerShipMovement.cs | 83 ++++++++++++++----- 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/Assets/0_Voyage/Ship/Player/PlayerShip.prefab b/Assets/0_Voyage/Ship/Player/PlayerShip.prefab index 51681ccde..56a377e75 100644 --- a/Assets/0_Voyage/Ship/Player/PlayerShip.prefab +++ b/Assets/0_Voyage/Ship/Player/PlayerShip.prefab @@ -125,6 +125,12 @@ MonoBehaviour: accelTiltSpeed: 10 springStiffness: 30 springDamping: 15 + minSpeedWaveHeight: 0.2 + maxSpeedWaveHeight: 0.05 + baseWaveFrequency: 1 + speedWaveMultiplier: 5 + randomWaveOffset: 0.5 + waveUnitSpeed: 10 meshObjectName: Ship_Mesh --- !u!1 &6407855916708530114 GameObject: diff --git a/Assets/0_Voyage/_Scripts/Ship/VoyagePlayerShipMovement.cs b/Assets/0_Voyage/_Scripts/Ship/VoyagePlayerShipMovement.cs index 43950d9a9..af37b2d01 100644 --- a/Assets/0_Voyage/_Scripts/Ship/VoyagePlayerShipMovement.cs +++ b/Assets/0_Voyage/_Scripts/Ship/VoyagePlayerShipMovement.cs @@ -10,12 +10,15 @@ public class VoyagePlayerShipMovement : MonoBehaviour [SerializeField] private float accelerationRate = 1f; [SerializeField] private float minSpeedThreshold = 0.1f; [SerializeField] private float dragFactor = 0.98f; - + private Vector3 currentVelocity; + private Vector2 currentInput; + private float targetSpeed; + private float currentSpeed; + [Header("Turn Settings")] [SerializeField] private float turnSpeedPenalty = 0.5f; // 선회 시 감속 정도 (0: 감속 없음, 1: 완전 정지) [SerializeField] private float maxTurnAngle = 180f; // 최대 감속이 적용되는 각도 - - + #if UNITY_EDITOR [Header("Debug Settings")] [SerializeField] private bool showDebugLines = true; @@ -28,18 +31,18 @@ public class VoyagePlayerShipMovement : MonoBehaviour private LineRenderer inputDirectionLine; private bool lineRendererCreated = false; #endif - - private Vector3 currentVelocity; - private Vector2 currentInput; - private float targetSpeed; - private float currentSpeed; + // Rotation Tilt [Header("Rotation Tilt Settings")] [SerializeField] private float maxRotationTiltAngle = 15f; [SerializeField] private float rotationTiltSpeed = 5f; [SerializeField] private float RotationTiltReturnSpeed = 3f; // 원래 자세로 돌아오는 속도 [SerializeField] private float angularVelocityMultiplier = 2f; // 각속도 영향력 + private float _currentRotationTilt = 0f; + private float _lastRotationY; // 이전 프레임의 Y축 회전값 + private float _currentAngularVelocity; // 현재 각속도 + // Acceleration Tilt [Header("Acceleration Tilt Settings")] [SerializeField] private float maxAccelTiltAngle = 15f; // 최대 가속 틸트 각도 [SerializeField] private float accelTiltForce = 15f; // 틸트 강도 @@ -47,21 +50,31 @@ public class VoyagePlayerShipMovement : MonoBehaviour [SerializeField] private float accelTiltSpeed = 10f; // 스프링 보간속도 [SerializeField] private float springStiffness = 30f; // 스프링 강성 [SerializeField] private float springDamping = 15f; // 스프링 감쇠 - - [Header("Mesh Settings")] - [SerializeField] private string meshObjectName = "Ship_Mesh"; - - private Transform _meshTransform; - // Rotation Tilt - private float _currentRotationTilt = 0f; - private float _lastRotationY; // 이전 프레임의 Y축 회전값 - private float _currentAngularVelocity; // 현재 각속도 - // Acceleration Tilt private float _currentAccelTilt; private float _accelTiltVelocity; private float _prevSpeed; + // Wave offset + [Header("Wave Settings")] + [SerializeField] private float minSpeedWaveHeight = 0.2f; // 기본 파도 높이 + [SerializeField] private float maxSpeedWaveHeight = 0.05f; // 기준 속력일때 파도 높이 + + [SerializeField] private float baseWaveFrequency = 1f; // 기본 파도 주기 + [SerializeField] private float speedWaveMultiplier = 5f; // 속도에 따른 주기 증가 계수 + [SerializeField] private float randomWaveOffset = 0.5f; // 랜덤 오프셋 범위 + [SerializeField] private float waveUnitSpeed = 10f; // 기준 속력 + private float _waveTime; + private float _waveRandomOffset; + private float currentWaveHeight; + + + [Header("Mesh Settings")] + [SerializeField] private string meshObjectName = "Ship_Mesh"; + private Transform _meshTransform; + + private Quaternion _originalMeshRotation; + private Vector3 _originalMeshPosition; private void Start() { @@ -72,9 +85,12 @@ public class VoyagePlayerShipMovement : MonoBehaviour enabled = false; return; } - + + _originalMeshPosition = _meshTransform.localPosition; _originalMeshRotation = _meshTransform.localRotation; _lastRotationY = transform.eulerAngles.y; + _waveTime = 0f; + _waveRandomOffset = Random.Range(-randomWaveOffset, randomWaveOffset); } private void FixedUpdate() @@ -92,10 +108,13 @@ public class VoyagePlayerShipMovement : MonoBehaviour ApplyDrag(); ApplyMovement(); - // Cosmetic Mesh Tilting + // Cosmetic mesh tilting UpdateMeshRotationTilt(); UpdateAccelerationTilt(); ApplyMeshTilt(); + // Cosmetic mesh wave offset + UpdateWaveMotion(); + ApplyMeshOffset(); #if UNITY_EDITOR if (showDebugLines) @@ -207,7 +226,6 @@ public class VoyagePlayerShipMovement : MonoBehaviour _currentAccelTilt = Mathf.Clamp(_currentAccelTilt, -maxAccelTiltAngle, maxAccelTiltAngle); _prevSpeed = currentSpeed; - } private void ApplyMeshTilt() @@ -223,7 +241,28 @@ public class VoyagePlayerShipMovement : MonoBehaviour ); } - + private void UpdateWaveMotion() + { + if (_meshTransform is null) return; + + // 현재 속도에 비례하여 파도 주기 조절 + float waveSpeedFactor = 1f + (currentSpeed / waveUnitSpeed) * speedWaveMultiplier; + _waveTime += Time.fixedDeltaTime * baseWaveFrequency * waveSpeedFactor; + float currentSpeedByUnit = currentSpeed / waveUnitSpeed; + currentSpeedByUnit = Mathf.Clamp01(currentSpeedByUnit); + float waveHeight = Mathf.Lerp(minSpeedWaveHeight, maxSpeedWaveHeight, currentSpeedByUnit); + + currentWaveHeight = waveHeight * Mathf.Sin(_waveTime + _waveRandomOffset); + } + + private void ApplyMeshOffset() + { + if (_meshTransform is null) return; + + Vector3 position = _originalMeshPosition + (Vector3.up * currentWaveHeight); + _meshTransform.localPosition = position; + } + private void ApplyDrag() { currentSpeed *= dragFactor;