using System; using UnityEngine; using WaveHarmonic.Crest; namespace NBF { public class Boat : MonoBehaviour { [Tooltip("移动力应施加于质心的垂直偏移量。")] [SerializeField] float _ForceHeightOffset; [Tooltip("水船因推力而移动的速度有多快。")] [SerializeField] float _ThrustPower = 10f; [Tooltip("船舵一转,船身就迅速转向。")] [SerializeField] float _SteerPower = 1f; [Tooltip("转弯时要转动船只。")] [Range(0, 1)] [SerializeField] float _TurningHeel = 0.35f; [Tooltip("对浮力变化应用曲线处理。")] [SerializeField] AnimationCurve _BuoyancyCurveFactor = new(new Keyframe[] { new(0, 0, 0.01267637f, 0.01267637f), new(0.6626424f, 0.1791001f, 0.8680198f, 0.8680198f), new(1, 1, 3.38758f, 3.38758f) }); /// /// 使用中 /// public bool IsUse; /// /// 船站立位置 /// public Transform standPlace; /// /// 浮力组件 /// private FloatingObject _floatingObject; private float _BuoyancyFactor = 1f; private void Awake() { if (_floatingObject == null) _floatingObject = GetComponent(); } private void FixedUpdate() { if (!IsUse) return; if (!_floatingObject.InWater) return; var input = Vector3.zero; Vector2 moveInput = InputManager.GetMovementInput(); input.x = moveInput.x; // 水平转向(x轴) input.z = moveInput.y; // 前后移动(y轴映射到z轴) var rb = _floatingObject.RigidBody; // Thrust var forcePosition = rb.worldCenterOfMass + _ForceHeightOffset * Vector3.up; rb.AddForceAtPosition(_ThrustPower * input.z * transform.forward, forcePosition, ForceMode.Acceleration); // Steer var rotation = transform.up + _TurningHeel * transform.forward; rb.AddTorque(_SteerPower * input.x * rotation, ForceMode.Acceleration); if (input.y > 0f) { if (_BuoyancyFactor < 1f) { _BuoyancyFactor += Time.deltaTime * 0.1f; _BuoyancyFactor = Mathf.Clamp(_BuoyancyFactor, 0f, 1f); _floatingObject.BuoyancyForceStrength = _BuoyancyCurveFactor.Evaluate(_BuoyancyFactor); } } else if (input.y < 0f) { if (_BuoyancyFactor > 0f) { _BuoyancyFactor -= Time.deltaTime * 0.1f; _BuoyancyFactor = Mathf.Clamp(_BuoyancyFactor, 0f, 1f); _floatingObject.BuoyancyForceStrength = _BuoyancyCurveFactor.Evaluate(_BuoyancyFactor); } } } } }