- Home /
Question by
DrkProdigy09 · Mar 29, 2017 at 02:48 PM ·
collidersanimationscollisions
How to prevent my falling animation from playing when going down a hill?
I've already tried messing with collider sizes, and the length my ray cast goes down, but yet still when going down even barely downhill terrain my fall animation plays and causes my animations to glitch out. Thanks for any help! using System.Collections; using Assets.Scripts.Weapon; using UnityEngine;
namespace Assets.Scripts
{
public class PlayerMovement : MonoBehaviour
{
public enum State
{
Idle,
Walking,
Running,
Falling,
Jumping
}
private static State playerState = State.Idle;
[Header("Keyboard")]
[SerializeField] private KeyCode jumpKey;
[SerializeField] private KeyCode runKey;
[Header("Properties")]
[SerializeField] private int walkSpeed;
[SerializeField] private int runSpeed;
[SerializeField] private int jumpHeight;
[SerializeField] private float gravity;
[SerializeField] private Vector3 moveDirection;
public static int speed;
private float rotationAxisX;
private bool isGrounded;
private WeaponManager weaponManager;
private Animation cameraShakeAnimation;
private Animation weaponWalkAnimation;
private CharacterController characterController;
public static State PlayerState
{
set { playerState = value; }
get { return playerState; }
}
private void Awake()
{
weaponManager = WeaponManager.Instance;
characterController = GetComponent<CharacterController>();
cameraShakeAnimation = Camera.main.GetComponent<Animation>();
weaponWalkAnimation = GameObject.Find("Camera/Camera View").GetComponent<Animation>();
}
private void Start()
{
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
StartCoroutine(FallRoutine());
characterController.detectCollisions = false;
}
private void Update()
{
RaycastHit hitinfo;
if (Physics.Raycast(transform.position, Vector3.down, out hitinfo, 1.2f)) {
isGrounded = hitinfo.transform.tag == "Ground";
} else {
isGrounded = false;
}
Debug.Log(playerState);
rotationAxisX += Input.GetAxis("Mouse X") * 2;
transform.rotation = Quaternion.Euler(0, rotationAxisX, 0);
characterController.Move(transform.TransformDirection(new Vector3(moveDirection.x * speed * Time.deltaTime, moveDirection.y * Time.deltaTime, moveDirection.z * speed * Time.deltaTime)));
}
private IEnumerator IdleRoutine()
{
PlayerState = State.Idle;
weaponManager.PlayIdleAnimation();
speed = 0;
moveDirection.y = 0;
cameraShakeAnimation["RunShake"].speed = 0;
weaponWalkAnimation["Walk"].speed = 0;
do{
if (!OnGround()){
StartCoroutine(FallRoutine());
yield break;
}
if (Input.GetKeyDown(jumpKey)){
StartCoroutine(JumpRoutine());
yield break;
}
yield return null;
} while (!GetMovementInput());
StartCoroutine(WalkRoutine());
}
private IEnumerator WalkRoutine()
{
PlayerState = State.Walking;
speed = walkSpeed;
weaponManager.PlayIdleAnimation();
cameraShakeAnimation["RunShake"].speed = 0;
weaponWalkAnimation["Walk"].speed = 1;
do{
if (!OnGround()){
weaponWalkAnimation["Walk"].speed = 0;
StartCoroutine(FallRoutine());
yield break;
}
if (Input.GetKeyDown(jumpKey)){
weaponWalkAnimation["Walk"].speed = 0;
StartCoroutine(JumpRoutine());
yield break;
}
if (Input.GetKey(runKey) && !Input.GetKey(KeyCode.S)){
weaponWalkAnimation["Walk"].speed = 0;
StartCoroutine(RunRoutine());
yield break;
}
yield return null;
} while (GetMovementInput());
weaponWalkAnimation["Walk"].speed = 0;
StartCoroutine(IdleRoutine());
}
private IEnumerator RunRoutine()
{
PlayerState = State.Running;
speed = runSpeed;
weaponManager.PlayRunAnimation();
cameraShakeAnimation["RunShake"].speed = 0.5f;
do
{
if (!OnGround())
{
StartCoroutine(FallRoutine());
yield break;
}
if (Input.GetKey(KeyCode.S))
{
StartCoroutine(WalkRoutine());
yield break;
}
if (Input.GetKeyDown(jumpKey))
{
StartCoroutine(JumpRoutine());
yield break;
}
if (Input.GetKeyUp(runKey))
{
StartCoroutine(WalkRoutine());
yield break;
}
yield return null;
} while (GetMovementInput());
cameraShakeAnimation["RunShake"].speed = 0;
StartCoroutine(IdleRoutine());
}
private IEnumerator JumpRoutine()
{
PlayerState = State.Jumping;
moveDirection.y = jumpHeight;
weaponManager.PlayJumpAnimation();
do {
yield return null;
} while (OnGround());
do {
moveDirection.y -= gravity * Time.deltaTime;
yield return null;
} while (!OnGround());
weaponManager.PlayIdleAnimation();
StartCoroutine(IdleRoutine());
}
private IEnumerator FallRoutine()
{
PlayerState = State.Falling;
do {
moveDirection.y -= gravity * Time.deltaTime;
yield return null;
} while (!OnGround());
StartCoroutine(IdleRoutine());
}
private bool GetMovementInput()
{
moveDirection = new Vector3(Input.GetAxis("Horizontal"), moveDirection.y, Input.GetAxis("Vertical"));
return moveDirection != Vector3.zero;
}
private bool OnGround()
{
return isGrounded;
}
}
}
Comment
Your answer
Follow this Question
Related Questions
Simplistic Colliders for enemies 1 Answer
Flying Controls Collision Issues 0 Answers
How to do static collision checks? 1 Answer
Why there is no Collider.IsTouching(...) ? 2 Answers
More realistic physics? 0 Answers