2016-05-01 4 views
1

Я создаю скрипт движения с вектором 2 и Rigidbody.velocity. Я хочу, чтобы мой игровой объект перемещался до определенного x pos, а затем возвращался к исходному pos, и все это продолжалось постоянно. Я достиг первой части, она идет в обратном направлении, когда он достигает определенной точки, а затем движение в обратном направлении никогда не останавливается:Unity C# vector 2 проблемы с движением

public float spawnPos; 
public float currentPos; 
public float constantSpeed = 3; 
public float speed = 0; 
KeyInput scriptBeholderKI; 
Rigidbody2D squadRigidBody; 

//Comprovation of spawnposition and KeyInput 
//Script adquisition 
void Start() { 

    spawnPos = transform.position.x; 
    scriptBeholderKI = gameObject.GetComponent <KeyInput>(); 
    squadRigidBody = gameObject.GetComponent <Rigidbody2D>(); 

} 

void FixedUpdate() { 

    //Movement 
    squadRigidBody.velocity = new Vector2 (constantSpeed + speed , 0); 

    //key inputs 
    if (Input.GetKeyDown (scriptBeholderKI.forward)) { 

     StopAllCoroutines(); 
     StartCoroutine (RightMovement(0f)); 
    } 

    if (Input.GetKeyDown (scriptBeholderKI.backwards)) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement (0f)); 
    } 
} 

//Speed values (Right, Left) 
IEnumerator RightMovement (float Rloop) { 

    while (transform.position.x < constantSpeed * Time.time + spawnPos + 14) { 

     speed = 10f; 
     yield return new WaitForSeconds (Rloop); 
    } 

    if (transform.position.x> constantSpeed * Time.time + spawnPos + 14) { 

     StopAllCoroutines(); 
     StartCoroutine (LeftMovement (0f)); 
    } 
} 

IEnumerator LeftMovement (float Lloop) { 

    while (transform.position.x > constantSpeed * Time.time + spawnPos) { 

     speed = -7f; 
     yield return new WaitForSeconds (Lloop); 
    } 
} 

Если вы видите что-либо, что можно было бы улучшить Pls сделать мне отметить C:

редактировать :

Когда я нажимаю передний вход, мой игровой объект перемещается, пока он не достигнет точки, когда я нажимаю bacwards, и он перемещается влево без остановки.

также состоит в том, что я хочу, чтобы моя цель перемещалась по константе скорости в игровом объекте, поэтому я использую Time.time. движения, которые я делаю с входами, являются более правильными упомянутыми ускорениями. Я хочу, чтобы моя цель всегда находилась на одинаковом расстоянии от игрового объекта, так как игра начинается. По крайней мере, максимальный охват справа - тот, который я хочу ...

И я также попытался удалить остановку всех блоков сопрограмм и ничего, но я хотел, чтобы я мог отменить движение всякий раз, когда захочу (Тем не менее, я удалил одно в сопрограмме RightMovement.)

последнее, что я изменил «FixedUpdate» для «Update», потому что это дало мне проблемы с ответом на мои входы, я не знайте, если это релевантно, но на всякий случай.

+0

идентификатор говорят это не делает то, что, по вашему мнению, делает 'transform.position.x "(Time.time is) Время в начале этого кадра (только для чтения). Это время в секундах ** с момента начала игры **." вместо этого, когда вы начинаете двигаться, вычисляйте свою цель, храните ее и проверяйте против этой позиции, когда поворачиваетесь, делайте то же самое. – yes

+0

Я уже вижу все, что должно измениться.Вы можете отредактировать свой вопрос и добавить, что происходит, когда нажата клавиша «вперед», и что происходит, когда нажата клавиша «назад». – Programmer

+0

Почему вы не создаете функцию «Движение» и не переходите в «float» или «-float» в зависимости от того, какой путь вы хотите переместить? Похоже, что расстояние, которое вы хотите совершить, - это исправить ... (или bool, например if (doMoveLeft) mvSpeed ​​* = -1; [код движения])? Кроме того, вы пытались выполнить debug.log значение, оцениваемое в выражении «while»? Что заставляет вас думать, что LeftMov ... остановится, если ему не хватает блока «StopAllCoroutines»? –

ответ

0

Я думаю, вы ошибаетесь в переменной Time.time. Так же, как yes упоминает в своем комментарии

Time.time время в секундах с начала игры.

Это означает, что с течением времени ваша цель будет медленно, но верно удаляться.

Вместо Time.time вы могли бы использовать, однако Time.deltaTime

Time.deltaTime время в секундах, которое потребовалось, чтобы завершить последний кадр

Это наиболее часто используется для движения.

Когда вы умножаете с Time.deltaTime вы существенно выразить: Я хочу, чтобы переместить этот объект 10 метров в секунду вместо 10 метров в кадре, если умножение 10.

Unity docs: Time.deltaTime

Смежные вопросы