- Home /
Move player left or right after x seconds
Hi, I'm struggling on some simple code and I'm not sure why it isn't working as expected. I've got a player character that moves forward at a constant rate, but after so many seconds (currently set at 2), I want the player to move to the left Lane (if they are in the right) and into the right lane (if they are in the left). The end aim is for this movement to repeat but with a random time (timer=Random.Range(2,6);) I believe the issue with the player moving incorrectly (They currently move right after the first seconds despite being in the right lane (laneNum=1 means right Lane) and then not moving L/R again) is down to the RandomMove() Coroutine but I'm unsure what sepcifically I'm doing wrong. Any help is appreciated! Here is the code:
private bool goLeft;
private bool goRight;
public int laneNum = 1;
public float speed;
private float horizVel;
private float timer;
// Use this for initialization
void Start () {
goLeft = false;
goRight = false;
timer = 2;
}
// Update is called once per frame
void Update()
{
transform.position = transform.position + new Vector3(horizVel, 0, 1) * speed * Time.deltaTime;
StartCoroutine(MoveRandom(timer));
if (goLeft)
{
horizVel = -1;
StartCoroutine(StopSlide());
goLeft = false;
laneNum -= 1;
}
if (goRight)
{
horizVel = 1;
StartCoroutine(StopSlide());
goRight = false;
laneNum += 1;
}
}
IEnumerator MoveRandom(float timer)
{
yield return new WaitForSeconds(timer);
if (laneNum == 0)
{
goRight = true;
}
if (laneNum == 1)
{
goLeft = true;
}
}
IEnumerator StopSlide()
{
yield return new WaitForSeconds(0.5f);
horizVel = 0;
}
}
Answer by logicandchaos · Jan 28, 2020 at 02:20 PM
I would use Invoke rather than a coroutine. Invoke("MoveRandom", seconds);
Your answer
Follow this Question
Related Questions
Moving multiple transforms from an array in a single script 0 Answers
rigidbody.position not working inside coroutine 2 Answers
Move Object to location of Trigger? 1 Answer
Problem using rotation and Rotate 1 Answer
Coroutine Moving 1 Answer