Question by
muhndalobaidi · Mar 16, 2020 at 05:33 PM ·
movementtransform
can some one help please the character is shaking like crazy ?
I am making endless runner game subway like, and all fine accept the character is shaking right and left like carazy and its increasing day by day.
I used the move Lane to move him between lanes. there was nothing befor but its started and its geting uglyer
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PlayerMotor : MonoBehaviour { //movement private const float LANE_DISTANCE = 2.5f; public float JumpForce = 20.0f; public float Gravity = 75.0f; private float VerticalVelocity; private CharacterController controller; private int desiredLane = 1; private float turn_Speed = 0.1f;
// Speed Modifier
private float originalSpeed = 13.0f;
private float Speed;
private float speedIncreaseLastTick;
private float speedIncreaseTime = 2.5f;
private float speedIncreaseAmount = 0.2f;
//
private bool isRunning = false;
//Animation
private Animator anim;
private void Start ()
{
Speed = originalSpeed;
controller = GetComponent<CharacterController>();
anim = GetComponent<Animator>();
}
private void Update()
{
if (!isRunning)
return;
if (Time.time - speedIncreaseLastTick > speedIncreaseTime)
{
speedIncreaseLastTick = Time.time;
Speed += speedIncreaseAmount;
GameManager.Instance.UpdateModifier(Speed - originalSpeed);
}
//gather the input on which lane we should be
if (Input.GetKeyDown(KeyCode.LeftArrow))
//Input.GetKeyDown(KeyCode.LeftArrow)
MoveLane(false);
if (Input.GetKeyDown(KeyCode.RightArrow))
MoveLane(true);
// calculate where we should be in the future
Vector3 targetPosition = transform.position.z * Vector3.forward;
if (desiredLane == 0)
targetPosition += Vector3.left * LANE_DISTANCE;
else if (desiredLane == 2)
targetPosition += Vector3.right * LANE_DISTANCE;
//moving vector
Vector3 moveVector = Vector3.zero;
moveVector.x = (targetPosition - transform.position).normalized.x * Speed * 1.5f;
bool isGrounded = IsGrounded();
anim.SetBool("Grounded", isGrounded);
//calculate y
if (isGrounded) // if grounded
{
VerticalVelocity = -0.1f;
if (Input.GetKeyDown(KeyCode.UpArrow))
{
//jump
anim.SetTrigger("Jump");
VerticalVelocity = JumpForce;
}
else if (Input.GetKeyDown(KeyCode.DownArrow))
{
//slid
StartSliding();
Invoke("StopSliding", 1.5f);
}
}
else
{
VerticalVelocity -= (Gravity * Time.deltaTime);
//fast falling michanic
if (Input.GetKeyDown(KeyCode.DownArrow))
{
VerticalVelocity = -JumpForce;
}
}
moveVector.y = VerticalVelocity;
moveVector.z = Speed;
//move player
controller.Move(moveVector * Time.deltaTime);
// rotate the player to where he is going
Vector3 dir = controller.velocity;
if (dir != Vector3.zero)
{
dir.y = 0;
transform.forward = Vector3.Lerp(transform.forward, dir, turn_Speed);
}
}
private void StartSliding()
{
anim.SetBool("Sliding", true);
controller.height /= 3;
controller.center = new Vector3(controller.center.x, controller.center.y/3, controller.center.z);
}
private void StopSliding()
{
anim.SetBool("Sliding", false);
controller.height *= 3;
controller.center = new Vector3(controller.center.x, controller.center.y * 3, controller.center.z);
}
private void MoveLane(bool goingRight)
{
desiredLane += (goingRight) ? 1 : -1;
desiredLane = Mathf.Clamp(desiredLane, 0, 2);
}
private bool IsGrounded()
{
Ray groundRay = new Ray(new Vector3(controller.bounds.center.x,(controller.bounds.center.y - controller.bounds.extents.y) + 0.2f,controller.bounds.center.z),Vector3.down);
Debug.DrawRay(groundRay.origin, groundRay.direction,Color.red, 1.0f);
return Physics.Raycast(groundRay, 0.2f + 0.1f);
}
public void StartRunning()
{
isRunning = true;
anim.SetTrigger("StartRunning");
}
private void Crash()
{
anim.SetTrigger("Death");
isRunning = false;
GameManager.Instance.IsDead = true;
}
private void OnControllerColliderHit(ControllerColliderHit hit)
{
switch (hit.gameObject.tag)
{
case "Obstacle":
Crash();
break;
}
}
}
Comment
Your answer