- Home /
Question by
DoubleOhZ · Feb 05, 2019 at 06:31 AM ·
charactercharactercontrollercharacter controllercharacter movementcharacter controlling
Character Creeping Backwards
Hey, I am fairly new with Unity, but I have made character controllers before and never had this issue. Anywhere between 5 seconds and 3 minutes after hitting play, my character will begin slowly creeping backwards. It happened with the Standard Asset First Person Character Controller so I followed a tutorial to make another one and the bug followed me. The bug doesn't seem to be activated by any particular action, as I can just wait a minute or two without moving and the character will inevitably start slow walking backwards. I cannot for the life of me figure out why this is happening and would love some help.
Here is my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
[SerializeField] private string horizontalInputName;
[SerializeField] private string verticalInputName;
[SerializeField] private float walkSpeed, runSpeed;
[SerializeField] private float runBuildUpSpeed;
[SerializeField] private KeyCode runKey;
private float movementSpeed;
[SerializeField] private float slopeForce;
[SerializeField] private float slopeForceRayLength;
private CharacterController charController;
[SerializeField] private AnimationCurve jumpFallOff;
[SerializeField] private float jumpMultiplier;
[SerializeField] private KeyCode jumpKey;
private bool isJumping;
private void Awake()
{
charController = GetComponent<CharacterController>();
}
private void Update()
{
PlayerMovement();
}
private void PlayerMovement()
{
float horizInput = Input.GetAxis(horizontalInputName);
float vertInput = Input.GetAxis(verticalInputName);
Vector3 forwardMovement = transform.forward * vertInput;
Vector3 rightMovement = transform.right * horizInput;
charController.SimpleMove(Vector3.ClampMagnitude(forwardMovement + rightMovement, 1.0f) * movementSpeed);
if ((vertInput != 0 || horizInput != 0) && OnSlope())
charController.Move(Vector3.down * charController.height / 2 * slopeForce * Time.deltaTime);
SetMovementSpeed();
JumpInput();
}
private void SetMovementSpeed()
{
if (Input.GetKey(runKey))
movementSpeed = Mathf.Lerp(movementSpeed, runSpeed, Time.deltaTime * runBuildUpSpeed);
else
movementSpeed = Mathf.Lerp(movementSpeed, walkSpeed, Time.deltaTime * runBuildUpSpeed);
}
private bool OnSlope()
{
if (isJumping)
return false;
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit, charController.height / 2 * slopeForceRayLength))
{
if (hit.normal != Vector3.up)
{
print("OnSlope");
return true;
}
}
return false;
}
private void JumpInput()
{
if (Input.GetKeyDown(jumpKey) && !isJumping)
{
isJumping = true;
StartCoroutine(JumpEvent());
}
}
private IEnumerator JumpEvent()
{
charController.slopeLimit = 60.0f;
float timeInAir = 0.0f;
do
{
float jumpForce = jumpFallOff.Evaluate(timeInAir);
charController.Move(Vector3.up * jumpForce * jumpMultiplier * Time.deltaTime);
timeInAir += Time.deltaTime;
yield return null;
} while (!charController.isGrounded && charController.collisionFlags != CollisionFlags.Above);
charController.slopeLimit = 90.0f;
isJumping = false;
}
}
Comment