| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using System;
- using Cinemachine.Utility;
- using UnityEngine;
- public class PlayerMove : MonoBehaviour
- {
- public float Speed;
- public float VelocityDamping;
- public float JumpTime;
- public enum ForwardMode { Camera, Player, World };
- public ForwardMode InputForward;
- public bool RotatePlayer = true;
- public Action SpaceAction;
- public Action EnterAction;
- Vector3 m_currentVleocity;
- float m_currentJumpSpeed;
- float m_restY;
- private void Reset()
- {
- Speed = 5;
- InputForward = ForwardMode.Camera;
- RotatePlayer = true;
- VelocityDamping = 0.5f;
- m_currentVleocity = Vector3.zero;
- JumpTime = 1;
- m_currentJumpSpeed = 0;
- }
- private void OnEnable()
- {
- m_currentJumpSpeed = 0;
- m_restY = transform.position.y;
- SpaceAction -= Jump;
- SpaceAction += Jump;
- }
- void Update()
- {
- Vector3 fwd;
- switch (InputForward)
- {
- case ForwardMode.Camera: fwd = Camera.main.transform.forward; break;
- case ForwardMode.Player: fwd = transform.forward; break;
- case ForwardMode.World: default: fwd = Vector3.forward; break;
- }
- fwd.y = 0;
- fwd = fwd.normalized;
- if (fwd.sqrMagnitude < 0.01f)
- return;
- Quaternion inputFrame = Quaternion.LookRotation(fwd, Vector3.up);
- Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
- input = inputFrame * input;
- var dt = Time.deltaTime;
- var desiredVelocity = input * Speed;
- var deltaVel = desiredVelocity - m_currentVleocity;
- m_currentVleocity += Damper.Damp(deltaVel, VelocityDamping, dt);
- transform.position += m_currentVleocity * dt;
- if (RotatePlayer && m_currentVleocity.sqrMagnitude > 0.01f)
- {
- var qA = transform.rotation;
- var qB = Quaternion.LookRotation(
- (InputForward == ForwardMode.Player && Vector3.Dot(fwd, m_currentVleocity) < 0)
- ? -m_currentVleocity : m_currentVleocity);
- transform.rotation = Quaternion.Slerp(qA, qB, Damper.Damp(1, VelocityDamping, dt));
- }
- // Process jump
- if (m_currentJumpSpeed != 0)
- m_currentJumpSpeed -= 10 * dt;
- var p = transform.position;
- p.y += m_currentJumpSpeed * dt;
- if (p.y < m_restY)
- {
- p.y = m_restY;
- m_currentJumpSpeed = 0;
- }
- transform.position = p;
- if (Input.GetKeyDown(KeyCode.Space) && SpaceAction != null)
- SpaceAction();
- if (Input.GetKeyDown(KeyCode.Return) && EnterAction != null)
- EnterAction();
- }
- public void Jump() { m_currentJumpSpeed += 10 * JumpTime * 0.5f; }
- }
|