Files
JJBB/UnusedAssets/CinemachineExamples/Shared/Models/UnityCharacter/Scripts/CharacterMovement.cs
2024-08-23 15:49:34 +08:00

104 lines
3.7 KiB
C#

using UnityEngine;
namespace Cinemachine.Examples
{
[AddComponentMenu("")] // Don't display in add component menu
public class CharacterMovement : MonoBehaviour
{
public bool keepDirection = false;
public float turnSpeed = 10f;
public KeyCode sprintJoystick = KeyCode.JoystickButton2;
public KeyCode sprintKeyboard = KeyCode.Space;
private float turnSpeedMultiplier;
private float speed = 0f;
private float direction = 0f;
private bool isSprinting = false;
private Animator anim;
private Vector3 targetDirection;
private Vector2 input;
private Quaternion freeRotation;
private Camera mainCamera;
private float velocity;
// Use this for initialization
void Start ()
{
anim = GetComponent<Animator>();
mainCamera = Camera.main;
}
// Update is called once per frame
void FixedUpdate ()
{
input.x = Input.GetAxis("Horizontal");
input.y = Input.GetAxis("Vertical");
// set speed to both vertical and horizontal inputs
if (keepDirection) speed = Mathf.Abs(input.x) + input.y;
else speed = Mathf.Abs(input.x) + Mathf.Abs(input.y);
speed = Mathf.Clamp(speed, 0f, 1f);
speed = Mathf.SmoothDamp(anim.GetFloat("Speed"), speed, ref velocity, 0.1f);
anim.SetFloat("Speed", speed);
if (input.y < 0f && keepDirection) direction = input.y;
else direction = 0f;
anim.SetFloat("Direction", direction);
// set sprinting
if ((Input.GetKeyDown(sprintJoystick) || Input.GetKeyDown(sprintKeyboard)) && input != Vector2.zero && direction >= 0f) isSprinting = true;
if ((Input.GetKeyUp(sprintJoystick) || Input.GetKeyUp(sprintKeyboard))|| input == Vector2.zero) isSprinting = false;
anim.SetBool("isSprinting", isSprinting);
// Update target direction relative to the camera view (or not if the Keep Direction option is checked)
UpdateTargetDirection();
if (input != Vector2.zero && targetDirection.magnitude > 0.1f)
{
Vector3 lookDirection = targetDirection.normalized;
freeRotation = Quaternion.LookRotation(lookDirection, transform.up);
var diferenceRotation = freeRotation.eulerAngles.y - transform.eulerAngles.y;
var eulerY = transform.eulerAngles.y;
if (diferenceRotation < 0 || diferenceRotation > 0) eulerY = freeRotation.eulerAngles.y;
var euler = new Vector3(0, eulerY, 0);
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(euler), turnSpeed * turnSpeedMultiplier * Time.deltaTime);
}
}
public virtual void UpdateTargetDirection()
{
if (!keepDirection)
{
turnSpeedMultiplier = 1f;
var forward = mainCamera.transform.TransformDirection(Vector3.forward);
forward.y = 0;
//get the right-facing direction of the referenceTransform
var right = mainCamera.transform.TransformDirection(Vector3.right);
// determine the direction the player will face based on input and the referenceTransform's right and forward directions
targetDirection = input.x * right + input.y * forward;
}
else
{
turnSpeedMultiplier = 0.2f;
var forward = transform.TransformDirection(Vector3.forward);
forward.y = 0;
//get the right-facing direction of the referenceTransform
var right = transform.TransformDirection(Vector3.right);
targetDirection = input.x * right + Mathf.Abs(input.y) * forward;
}
}
}
}