Question by
Blackuma · Feb 22, 2020 at 05:38 PM ·
character controllercharacter movement
How do I get my Player to change lanes over time rather than teleport?
Hello, I am working on a 2.5d brawler which utilizes multiple lanes. My main issue is as the title stated getting my Player character to change lanes (along the z axis) over time rather than having them completely teleport. I've done a few tutorial projects and this is my first solo project so any tips or suggestion regarding my code would be greatly appreciated.
public class Player : MonoBehaviour
{
private CharacterController _controller;
[SerializeField]
private float _speed = 3f;
[SerializeField]
private float _gravity = 1.0f;
[SerializeField]
private float _laneDistance = 2f; //space between center of lanes
private Vector3 _direction;
private Vector3 _velocity;
void Start()
{
_controller = GetComponent<CharacterController>();
if (_controller == null)
{
Debug.Log("The Player's Character Controller is NULL");
}
}
public enum Lane
{
Top,
Center,
Bottom
}
public enum MoveDirection //lane change direction
{
Up,
Down,
None
}
[SerializeField]
Lane currentLane = Lane.Center;
void Update()
{
float horizontalInput = Input.GetAxis("Horizontal"); //player movement
_direction = new Vector3(horizontalInput, 0f, 0f);
_velocity= _direction *_speed;
if (_controller.isGrounded == true)
{
Debug.Log("Player is grounded");
LaneSwitch();
}
else if (_controller.isGrounded == false)
{
_velocity.y -= _gravity;
}
_controller.Move(_velocity * Time.deltaTime);
}
private void LaneSwitch()
{
MoveDirection requestedMoveDirection = MoveDirection.None;
if (Input.GetKeyDown(KeyCode.Q) && Input.GetAxisRaw("Vertical") > 0)
{
requestedMoveDirection = MoveDirection.Up;
}
else if (Input.GetKeyDown(KeyCode.Q) && Input.GetAxisRaw("Vertical") < 0)
{
requestedMoveDirection = MoveDirection.Down;
}
switch (requestedMoveDirection)
{
case MoveDirection.Up: //All Lane switch up propeties
if (currentLane == Lane.Bottom)
{
Debug.Log("Bottom --> Center Lane");
currentLane = Lane.Center;
}
else if (currentLane == Lane.Center)
{
_controller.Move(Vector3.forward * 2); //This is where Im having the problem
Debug.Log("Center --> Top Lane");
currentLane = Lane.Top;
}
Comment
Your answer
Follow this Question
Related Questions
Error CS0103 0 Answers
I want to make an on click movement script with a grid type map need references to look at 0 Answers
infamous first light run code help 1 Answer
Trying to figure out WallRiding, with Vector3.Cross 0 Answers
Character controller for fixed perspective camera (moving relative to arbitrary point on screen) 0 Answers