Untitled
unknown
plain_text
a year ago
3.6 kB
1
Indexable
Never
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; }