PlayerMove.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using Cinemachine.Utility;
  3. using UnityEngine;
  4. public class PlayerMove : MonoBehaviour
  5. {
  6. public float Speed;
  7. public float VelocityDamping;
  8. public float JumpTime;
  9. public enum ForwardMode { Camera, Player, World };
  10. public ForwardMode InputForward;
  11. public bool RotatePlayer = true;
  12. public Action SpaceAction;
  13. public Action EnterAction;
  14. Vector3 m_currentVleocity;
  15. float m_currentJumpSpeed;
  16. float m_restY;
  17. private void Reset()
  18. {
  19. Speed = 5;
  20. InputForward = ForwardMode.Camera;
  21. RotatePlayer = true;
  22. VelocityDamping = 0.5f;
  23. m_currentVleocity = Vector3.zero;
  24. JumpTime = 1;
  25. m_currentJumpSpeed = 0;
  26. }
  27. private void OnEnable()
  28. {
  29. m_currentJumpSpeed = 0;
  30. m_restY = transform.position.y;
  31. SpaceAction -= Jump;
  32. SpaceAction += Jump;
  33. }
  34. void Update()
  35. {
  36. Vector3 fwd;
  37. switch (InputForward)
  38. {
  39. case ForwardMode.Camera: fwd = Camera.main.transform.forward; break;
  40. case ForwardMode.Player: fwd = transform.forward; break;
  41. case ForwardMode.World: default: fwd = Vector3.forward; break;
  42. }
  43. fwd.y = 0;
  44. fwd = fwd.normalized;
  45. if (fwd.sqrMagnitude < 0.01f)
  46. return;
  47. Quaternion inputFrame = Quaternion.LookRotation(fwd, Vector3.up);
  48. Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
  49. input = inputFrame * input;
  50. var dt = Time.deltaTime;
  51. var desiredVelocity = input * Speed;
  52. var deltaVel = desiredVelocity - m_currentVleocity;
  53. m_currentVleocity += Damper.Damp(deltaVel, VelocityDamping, dt);
  54. transform.position += m_currentVleocity * dt;
  55. if (RotatePlayer && m_currentVleocity.sqrMagnitude > 0.01f)
  56. {
  57. var qA = transform.rotation;
  58. var qB = Quaternion.LookRotation(
  59. (InputForward == ForwardMode.Player && Vector3.Dot(fwd, m_currentVleocity) < 0)
  60. ? -m_currentVleocity : m_currentVleocity);
  61. transform.rotation = Quaternion.Slerp(qA, qB, Damper.Damp(1, VelocityDamping, dt));
  62. }
  63. // Process jump
  64. if (m_currentJumpSpeed != 0)
  65. m_currentJumpSpeed -= 10 * dt;
  66. var p = transform.position;
  67. p.y += m_currentJumpSpeed * dt;
  68. if (p.y < m_restY)
  69. {
  70. p.y = m_restY;
  71. m_currentJumpSpeed = 0;
  72. }
  73. transform.position = p;
  74. if (Input.GetKeyDown(KeyCode.Space) && SpaceAction != null)
  75. SpaceAction();
  76. if (Input.GetKeyDown(KeyCode.Return) && EnterAction != null)
  77. EnterAction();
  78. }
  79. public void Jump() { m_currentJumpSpeed += 10 * JumpTime * 0.5f; }
  80. }