- Home /
My Character Doesn't Move Properly
I started with ThirdPersonController.js, which comes with unity for my character controller script, but now I've got stucked. My character doesn't move forward when i pressed only one direction(like only 'w' or 's'). He's always moves slightly left, but looks directly forward. I've edited ThirdPersonController, so i can't compare it with mine, though i compared UpdateSmoothedMovementDirection() and couldn't see any problem. And character sometimes stops moving for a moment while running and jumping.
#pragma strict
#pragma downcast
@script RequireComponent(CharacterController)
var idleAnimation : AnimationClip;
var walkAnimation : AnimationClip;
var runAnimation : AnimationClip;
var sprintAnimation : AnimationClip;
var jumpAnimation : AnimationClip;
var runJumpAnimation : AnimationClip;
var idleAnimationSpeed = 0.5;
var walkMaxAnimationSpeed = 0.75;
var trotMaxAnimationSpeed = 1.0;
var runMaxAnimationSpeed = 1.0;
var sprintMaxAnimationSpeed = 1.0;
var jumpAnimationSpeed = 1.15;
var landAnimationSpeed = 1.0;
var runJumpAnimationSpeed = 1.0;
//Combo Animations
var comboA1 : AnimationClip;
var comboA2 : AnimationClip;
var comboA3 : AnimationClip;
var comboA4 : AnimationClip;
private var _animation : Animation;
enum CharacterState {
Idle = 0,
Walking = 1,
Trotting = 2,
Running = 3,
Jumping = 4,
Sprinting = 5,
RunJumping = 6,
ComboA1 = 7,
ComboA2 = 8,
ComboA3 = 9,
ComboA4 = 10,
Hit = 11,
Unsheathe = 12,
Sheathe = 13,
}
var _characterState : CharacterState;
private var moveSpeed = 0.0;
private var walkSpeed = 5.0;
private var trotSpeed = 7.0;
private var trotAfterSeconds = 3.0;
private var speedSmoothing = 10.0;
private var verticalSpeed = 0.0;
private var runSpeed = 25.0;
private var sprintSpeed = 50.0;
private var lockCameraTimer = 0.0;
private var inAirControlAcceleration = 3.0;
private var collisionFlags : CollisionFlags;
private var moveDirection = Vector3.zero;
private var jumpHeight = 3.0;
private var inAirAcceleration = 3.0;
private var gravity = 20.0;
private var canJump = true;
private var canRunJump = false;
private var jumpRepeatTime = 0.05;
private var jumpTimeout = 0.15;
private var groundedTimeout = 0.25;
private var jumping = false;
private var jumpingReachedApex = false;
private var lastJumpButtonTime = -10.0;
private var lastJumpTime = -1.0;
private var lastJumpStartHeight = 0.0;
private var movingBack = false;
private var isMoving = false;
private var walkTimeStart = 0.0;
private var inAirVelocity = Vector3.zero;
private var lastGroundedTime = 0.0;
private var isControllable = true;
//Combo Controller
private var lastComboTime = 29.0;
private var comboBreakTime = 30.0;
private var comboASpeed = 1.0;
private var comboAForwardSpeed = 0.2;
private var attackKeyUp = false;
private var comboCount = 0;
private var moveCombo = false;
private var canCombo = true;
private var moveForward = false;
private var canWalk = true;
//Silah
var WeaponControllerScript : WeaponController;
//Clothing
var ClothingControllerScript : ClothingController;
//Düşmanlara gözüken hedef
var target : Transform;
//Dayak yeme
var hitAnimation : AnimationClip;
private var hitAnimationSpeed = 1.0;
var currentChar : Transform;
var inBattle = false;
var battlePosition : AnimationClip;
private var battlePositionSpeed = 1.0;
var swinging = false;
private var lastComboCount = 0;
//Ready or Sheathe?
private var RoS = false;
private var damageTaken = false;
//Unsheathe Animation
var unsheatheAnimation : AnimationClip;
private var unsheatheAnimationSpeed = 1.0;
private var rightArm : Transform;
//Shathe Animation
var sheatheAnimation : AnimationClip;
private var sheatheAnimationSpeed = 1.0;
var noBattleCondition = true;
function Awake(){
moveDirection = transform.TransformDirection(Vector3.forward);
_animation = GetComponent(Animation);
}
function Start () {
WeaponControllerScript = gameObject.GetComponent(WeaponController);
WeaponControllerScript.WhichWeapon("Sword4", "PlayerWeapon");
WeaponControllerScript.ReadyOrSheathe("Sword4", false);
ClothingControllerScript = gameObject.GetComponent(ClothingController);
ClothingControllerScript.WhichTop("Top2", "Clothing");
animation[hitAnimation.name].layer = 1;
rightArm = transform.Find("Armature/pelvis/hips/spine/ribs/ribs_001/shoulder_R/upper_arm_R");
animation[unsheatheAnimation.name].layer = 2;
animation[sheatheAnimation.name].layer = 2;
}
function UpdateSmoothedMovementDirection(){
var cameraTransform = Camera.main.transform;
var grounded = IsGrounded();
//Kameraya göre ileri
var forward = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0;
forward = forward.normalized;
var right = Vector3(forward.z, 0, -forward.x);
var v = Input.GetAxis("Vertical");
var h = Input.GetAxis("Horizontal");
if(v < -0.2)
movingBack = true;
else
movingBack = false;
var wasMoving = isMoving;
isMoving = Mathf.Abs(h) > 0.1 || Mathf.Abs(v) > 0.1;
var targetDirection = h * right + v * forward;
if(grounded){
lockCameraTimer += Time.deltaTime;
if(isMoving != wasMoving)
lockCameraTimer = 0.0;
if(targetDirection != Vector3.zero){
if(moveSpeed < walkSpeed * 0.9 && grounded)
moveDirection = targetDirection.normalized;
else{
moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, 360, 1000);
moveDirection = moveDirection.normalized;
}
}
var curSmooth = speedSmoothing * Time.deltaTime;
var targetSpeed = Mathf.Min(targetDirection.magnitude, 1.0);
if(Input.GetButton("Fire1")){
targetSpeed *= sprintSpeed;
canRunJump = true;
_characterState = CharacterState.Sprinting;
}
else if(Time.time - trotAfterSeconds > walkTimeStart){
targetSpeed *= trotSpeed;
canRunJump = false;
_characterState = CharacterState.Trotting;
}
else if(Mathf.Abs(v) + Mathf.Abs(h) < 0.4){
targetSpeed *= walkSpeed;
canRunJump = false;
_characterState = CharacterState.Walking;
}
else{
targetSpeed *= runSpeed;
_characterState = CharacterState.Running;
canRunJump = false;
}
moveSpeed = Mathf.Lerp(moveSpeed, targetSpeed, curSmooth);
if(moveSpeed < walkSpeed * 0.3);
walkTimeStart = Time.time;
}
else{
if(jumping)
lockCameraTimer = 0.0;
else if(isMoving)
inAirVelocity += targetDirection.normalized * Time.deltaTime * inAirControlAcceleration;
}
}
function ApplyJumping(){
if(lastJumpTime + jumpRepeatTime > Time.time)
return;
if(IsGrounded()){
if(canJump && Time.time < lastJumpButtonTime + jumpTimeout){
verticalSpeed = CalculateJumpVerticalSpeed(jumpHeight);
SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);
}
}
}
function ApplyGravity(){
if(isControllable){
var jumpButton = Input.GetButton("Jump");
if(jumping && !jumpingReachedApex && verticalSpeed <= 0.0){
jumpingReachedApex = true;
canRunJump = false;
SendMessage("DidJumpReachApex", SendMessageOptions.DontRequireReceiver);
}
if(IsGrounded()){
verticalSpeed = 0.0;
target.localPosition.y = 0.0;
}
else
verticalSpeed -= gravity * Time.deltaTime;
}
}
function CalculateJumpVerticalSpeed(targetJumpHeight : float){
return Mathf.Sqrt(2 * targetJumpHeight * gravity);
}
function DidJump(){
jumping = true;
jumpingReachedApex = false;
lastJumpTime = Time.time;
lastJumpStartHeight = transform.position.y;
lastJumpButtonTime = -10;
_characterState = CharacterState.Jumping;
}
function Combo(){
if(canCombo){
var hit : RaycastHit;
attackKeyUp = true;
canWalk = false;
moveForward = true;
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), hit)){
if(hit.collider.tag == "Enemy" && hit.distance <= 3.0){
moveForward = false;
Debug.Log(hit.distance);
}
}
SpeedZero();
RandomCombo();
lastComboTime = 0;
canCombo = false;
if(!RoS && noBattleCondition){
_characterState = CharacterState.ComboA1;
WeaponControllerScript.ReadyOrSheathe("Sword4", true);
RoS = true;
}
else if(comboCount == 2){
_characterState = CharacterState.ComboA2;
lastComboCount = 2;
}
else if(comboCount == 3){
_characterState = CharacterState.ComboA3;
lastComboCount = 3;
}
else if(comboCount == 4){
_characterState = CharacterState.ComboA4;
lastComboCount = 4;
}
}
}
function RandomCombo(){
comboCount = Random.Range(1, 5);
if(comboCount == lastComboCount){
if(comboCount == 4){
comboCount -= 1;
}
else{
comboCount += 1;
}
}
}
/*function AttackDirection(){
var cameraTransform = Camera.main.transform;
var forward = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0;
forward = forward.normalized;
var right = Vector3(forward.z, 0, -forward.x);
var direction = Input.GetAxis("Horizontal") * right + Input.GetAxis("Vertical") * forward;
moveDirection = Vector3.RotateTowards(moveDirection, direction, 360, 1000);
moveDirection = moveDirection.normalized;
}*/
function ComboBreaker(){
animation.Stop();
canWalk = true;
SpeedNormalized();
lastComboTime = 0.0;
attackKeyUp = false;
canCombo = true;
if(noBattleCondition){
SS("Sheathe");
}
}
function SpeedZero(){
moveSpeed = 0.0;
walkSpeed = 0.0;
trotSpeed = 0.0;
trotAfterSeconds = 0.0;
speedSmoothing = 0.0;
verticalSpeed = 0.0;
runSpeed = 0.0;
sprintSpeed = 0.0;
}
function SpeedNormalized(){
moveSpeed = 0.0;
walkSpeed = 5.0;
trotSpeed = 7.0;
trotAfterSeconds = 3.0;
speedSmoothing = 10.0;
verticalSpeed = 0.0;
runSpeed = 25.0;
sprintSpeed = 50.0;
}
function Animations(){
if(animation.IsPlaying(runJumpAnimation.name) || animation.IsPlaying(jumpAnimation.name) || animation.IsPlaying(hitAnimation.name)){
canCombo = false;
}
if(!animation.IsPlaying(runJumpAnimation.name) && !animation.IsPlaying(jumpAnimation.name) && !animation.IsPlaying(hitAnimation.name)){
canCombo = true;
}
if(animation.IsPlaying(comboA1.name) || animation.IsPlaying(comboA2.name) || animation.IsPlaying(comboA3.name) || animation.IsPlaying(comboA4.name)){
swinging = true;
}
if(!animation.IsPlaying(comboA1.name) && !animation.IsPlaying(comboA2.name) && !animation.IsPlaying(comboA3.name) && !animation.IsPlaying(comboA4.name)){
swinging = false;
}
}
function Hit(){
if(!damageTaken){
ComboBreaker();
_characterState = CharacterState.Hit;
currentChar.Translate(Vector3.forward * Time.deltaTime * -50);
damageTaken = true;
DamageCount();
}
}
function DamageCount(){
yield WaitForSeconds(0.7);
damageTaken = false;
_characterState = CharacterState.Idle;
}
//Unsheathe, sheathe
function SS(state : String){
if(state == "Unsheathe"){
WeaponControllerScript.ReadyOrSheathe("Sword4", true);
_animation[unsheatheAnimation.name].AddMixingTransform(rightArm);
_animation[unsheatheAnimation.name].speed = unsheatheAnimationSpeed;
_animation[unsheatheAnimation.name].wrapMode = WrapMode.Once;
_animation.Play(unsheatheAnimation.name);
RoS = true;
}
if(state == "Sheathe"){
WeaponControllerScript.ReadyOrSheathe("Sword4", false);
_animation[sheatheAnimation.name].AddMixingTransform(rightArm);
_animation[sheatheAnimation.name].speed = sheatheAnimationSpeed;
_animation[sheatheAnimation.name].wrapMode = WrapMode.Once;
_animation.Play(sheatheAnimation.name);
RoS = false;
}
}
function Update () {
if(Input.GetButtonDown("Jump")){
lastJumpButtonTime = Time.time;
}
UpdateSmoothedMovementDirection();
ApplyGravity();
ApplyJumping();
Animations();
if(attackKeyUp){
lastComboTime += 1;
}
if(lastComboTime > comboBreakTime){
ComboBreaker();
}
if(lastComboTime > 15){
moveForward = false;
}
if(comboCount >= 5){
comboCount = 1;
}
if(moveForward){
transform.Translate(Vector3.forward * Time.deltaTime * 5);
}
if(Input.GetButtonDown("Attack")){
Combo();
}
var movement = moveDirection * moveSpeed + Vector3(0, verticalSpeed, 0) + inAirVelocity;
movement *= Time.deltaTime;
if(inBattle && !RoS && !noBattleCondition){
SS("Unsheathe");
}
if(!inBattle && RoS && !noBattleCondition){
SS("Sheathe");
}
if(lastComboTime > 20){
canCombo = true;
}
var controller : CharacterController = GetComponent(CharacterController);
collisionFlags = controller.Move(movement);
if(_animation){
if(_characterState == CharacterState.Hit){
_animation[hitAnimation.name].speed = hitAnimationSpeed;
_animation[hitAnimation.name].wrapMode = WrapMode.Once;
_animation.CrossFade(hitAnimation.name);
}
else if(_characterState == CharacterState.Jumping){
if(!jumpingReachedApex){
if(canRunJump){
_animation[runJumpAnimation.name].speed = runJumpAnimationSpeed;
_animation[runJumpAnimation.name].wrapMode = WrapMode.ClampForever;
_animation.CrossFade(runJumpAnimation.name);
}
else{
_animation[jumpAnimation.name].speed = jumpAnimationSpeed;
_animation[jumpAnimation.name].wrapMode = WrapMode.ClampForever;
_animation.CrossFade(jumpAnimation.name);
}
}
else{
_animation[jumpAnimation.name].speed = -landAnimationSpeed;
_animation[jumpAnimation.name].wrapMode = WrapMode.ClampForever;
_animation.CrossFade(jumpAnimation.name);
}
}
else{
if(_characterState == CharacterState.ComboA1){
_animation[comboA1.name].speed = comboASpeed;
_animation[comboA1.name].wrapMode = WrapMode.Once;
_animation.Play(comboA1.name);
}
else if(_characterState == CharacterState.ComboA2){
_animation[comboA2.name].speed = comboASpeed;
_animation[comboA2.name].wrapMode = WrapMode.Once;
_animation.CrossFade(comboA2.name);
}
else if(_characterState == CharacterState.ComboA3){
_animation[comboA3.name].speed = comboASpeed;
_animation[comboA3.name].wrapMode = WrapMode.Once;
_animation.CrossFade(comboA3.name);
}
else if(_characterState == CharacterState.ComboA4){
_animation[comboA4.name].speed = comboASpeed;
_animation[comboA4.name].wrapMode = WrapMode.Once;
_animation.CrossFade(comboA4.name);
}
else if(canWalk){
if(controller.velocity.sqrMagnitude < 0.1 && inBattle){
_animation[battlePosition.name].speed = battlePositionSpeed;
_animation.CrossFade(battlePosition.name);
}
else if(controller.velocity.sqrMagnitude < 0.1 && !inBattle){
_animation[idleAnimation.name].speed = idleAnimationSpeed;
_animation.CrossFade(idleAnimation.name);
}
else if(_characterState == CharacterState.Running){
_animation[runAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, runMaxAnimationSpeed);
_animation.CrossFade(runAnimation.name);
}
else if(_characterState == CharacterState.Sprinting){
_animation[sprintAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, sprintMaxAnimationSpeed);
_animation.CrossFade(sprintAnimation.name);
}
else if(_characterState == CharacterState.Trotting){
_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, trotMaxAnimationSpeed);
_animation.CrossFade(walkAnimation.name);
}
else if(_characterState == CharacterState.Walking){
_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, walkMaxAnimationSpeed);
_animation.CrossFade(walkAnimation.name);
}
}
}
}
if(IsGrounded()){
transform.rotation = Quaternion.LookRotation(moveDirection);
}
else{
var xzMove = movement;
xzMove.y = 0;
if(xzMove.sqrMagnitude > 0.001){
transform.rotation = Quaternion.LookRotation(xzMove);
}
}
if(IsGrounded()){
lastGroundedTime = Time.time;
inAirVelocity = Vector3.zero;
if(jumping){
jumping = false;
SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);
}
}
}
function OnControllerColliderHit(hit : ControllerColliderHit){
if(hit.moveDirection.y > 0.01)
return;
}
function GetSpeed(){
return moveSpeed;
}
function IsJumping(){
return jumping;
}
function IsGrounded(){
return(collisionFlags & CollisionFlags.CollidedBelow) != 0;
}
function GetDirection(){
return moveDirection;
}
function IsMovingBackwards(){
return movingBack;
}
function GetLockCameraTimer(){
return lockCameraTimer;
}
function IsMoving() : boolean{
return Mathf.Abs(Input.GetAxisRaw("Vertical")) + Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5;
}
function HasJumpReachedApex(){
return jumpingReachedApex;
}
function IsGroundedWithTimeout(){
return lastGroundedTime + groundedTimeout > Time.time;
}
function Reset(){
gameObject.tag = "Player";
}
Interesting, there is nothing wrong with code, when i play with character controllers center(y axis) it walks correctly. But he's feet enters to the terrain which is bad. This is started after i updated my character asset.
Your answer
Follow this Question
Related Questions
Controlled sphere/ Ball game 2 Answers
Character Controller can pass through Collider 1 Answer
Character Controller, changing collider's size? 0 Answers
Character movement relative to both camera and transform 2 Answers
Player Animation and control panel 2 Answers