Character stuck moving on spot.
Making a 3rd person game and working on the movement and animations. But for some reason my character will only move on the spot.
It will run, strafe and jump as per the animations and controls but will only do so on the spot. I've tried using rigidbody and various little things but to no avail. Any suggestions?
I'm also using a flat terrain and no obstacles for testing area.
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(CharacterController))]
public class CharacterMovement : MonoBehaviour
{
//public Texture2D cursorTexture;
//private Vector2 hotSpot = Vector2.zero;
//Rigidbody rigidbody;
Animator animator;
CharacterController characterController;
[System.Serializable]
public class AnimationSettings
{
public string verticalVelocityFloat = "Forward";
public string horizontalVelocityFloat = "Strafe";
public string groundedBool = "isGrounded";
public string jumpBool = "isJumping";
}
[SerializeField]
public AnimationSettings animations;
[System.Serializable]
public class PhysicsSettings
{
public float gravityModifier = 9.81f;
public float baseGravity = 50.0f;
public float resetGravityValue = 1.2f;
}
[SerializeField]
public PhysicsSettings physics;
[System.Serializable]
public class MovementSettings
{
public float jumpSpeed = 6;
public float jumpTime = 0.25f;
}
[SerializeField]
public MovementSettings movement;
bool jumping;
bool resetGravity;
float gravity;
// Use this for initialization
void Start()
{
animator = GetComponent<Animator>();
characterController = GetComponent<CharacterController>();
SetupAnimator();
}
void Update()
{
ApplyGravity();
Animate(Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"));
if (Input.GetButtonDown("Jump"))
{
Jump();
}
}
//Animates the character and applies movement
public void Animate(float forward, float strafe)
{
animator.SetFloat(animations.verticalVelocityFloat, forward);
animator.SetFloat(animations.horizontalVelocityFloat, strafe);
animator.SetBool(animations.groundedBool, characterController.isGrounded);
animator.SetBool(animations.jumpBool, jumping);
}
public void Jump()
{
if (jumping)
{
return;
}
if (characterController.isGrounded)
{
jumping = true;
StartCoroutine(StopJump());
}
}
IEnumerator StopJump()
{
yield return new WaitForSeconds(movement.jumpTime);
jumping = false;
}
//apply gravity
void ApplyGravity()
{
if (!characterController.isGrounded)
{
if (!resetGravity)
{
gravity = physics.resetGravityValue;
resetGravity = true;
}
gravity += Time.deltaTime * physics.gravityModifier;
}
else
{
gravity = physics.baseGravity;
resetGravity = false;
}
Vector3 gravityVector = new Vector3();
if (!jumping)
{
gravityVector.y -= gravity;
}
else
{
gravityVector.y = movement.jumpSpeed;
}
characterController.Move(gravityVector * Time.deltaTime);
}
//Sets up avater
void SetupAnimator()
{
Animator[] animators = GetComponentsInChildren<Animator>();
if (animators.Length > 0)
{
for (int i = 0; i < animators.Length; i++)
{
Animator anim = animators[i];
Avatar av = anim.avatar;
if (anim != animator)
{
animator.avatar = av;
Destroy(anim);
}
}
}
}
}
Answer by AdvaitKelkar · Dec 29, 2019 at 03:01 PM
I know this is an old thread, but I was going through exactly the same problem so here's the solution.
If you downloaded the animations through Mixamo, you might've checked the "In Place" box while viewing the animation. If you forgot to uncheck the box and downloaded the animation, it retains the setting even when downloaded, causing the player to not move while the animation is playing. To solve the problem, just download the animations again while making sure the "In Place" box is left unchecked.
Hope this helps someone!