Untitled
unknown
plain_text
3 years ago
3.6 kB
7
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovementStateManager : MonoBehaviour
{
#region Movement
[HideInInspector] public float currentMoveSpeed;
public float walkSpeed = 3, walkBackSpeed = 2;
public float runSpeed = 7, runBackSpeed = 5;
public float crouchSpeed = 2, crouchBackSpeed = 1;
public float airSpeed = 1.5f;
[HideInInspector] public Vector3 dir;
[HideInInspector] public float hzInput, vInput;
CharacterController controller;
#endregion
#region GroundCheck
[SerializeField] float groundYOffset;
[SerializeField] LayerMask groundMask;
Vector3 spherePos;
#endregion
#region Gravity
[SerializeField] float gravity = -9.81f;
[SerializeField] float jumpForce = 10;
[HideInInspector] public bool jumped;
Vector3 velocity;
#endregion
#region States
public MovementBaseState previousState;
public MovementBaseState currentState;
public IdleState Idle = new IdleState();
public WalkState Walk = new WalkState();
public RunState Run = new RunState();
public CrouchState Crouch = new CrouchState();
public JumpState Jump = new JumpState();
#endregion
[HideInInspector] public Animator anim;
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
SwitchState(Idle);
}
// Update is called once per frame
void Update()
{
GetDirectionAndMove();
Gravity();
Falling();
anim.SetFloat("hzInput", hzInput);
anim.SetFloat("vInput", vInput);
currentState.UpdateState(this);
}
public void SwitchState(MovementBaseState state)
{
currentState = state;
currentState.EnterState(this);
}
void GetDirectionAndMove()
{
hzInput = Input.GetAxis("Horizontal");
vInput = Input.GetAxis("Vertical");
Vector3 airDir = Vector3.zero;
if(!IsGrounded()) airDir = transform.forward * vInput + transform.right * hzInput;
else dir = transform.forward * vInput + transform.right * hzInput;
controller.Move((dir.normalized * currentMoveSpeed + airDir.normalized * airSpeed) * Time.deltaTime);
}
public bool IsGrounded()
{
spherePos = new Vector3(transform.position.x, transform.position.y - groundYOffset, transform.position.z);
if(Physics.CheckSphere(spherePos, controller.radius - 0.05f, groundMask)) return true;
return false;
}
void Gravity()
{
velocity = AdjustVelocityToSlope(velocity);
if(!IsGrounded()) velocity.y += gravity * Time.deltaTime;
else if (velocity.y < 0) velocity.y = -2;
controller.Move(velocity * Time.deltaTime);
}
private Vector3 AdjustVelocityToSlope(Vector3 velocity)
{
var ray = new Ray(transform.position, Vector3.down);
if(Physics.Raycast(ray, out RaycastHit hitInfo, 0.2f))
{
var slopeRotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
var adjustedVelocity = slopeRotation * velocity;
if(adjustedVelocity.y < 0) return adjustedVelocity;
}
return velocity;
}
void Falling() => anim.SetBool("Falling", !IsGrounded());
public void JumpForce() => velocity.y += jumpForce;
public void Jumped() => jumped = true;
}Editor is loading...