您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
95 行
2.8 KiB
95 行
2.8 KiB
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; }
|
|
}
|