Я новичок в Unity, и у меня возникла проблема.
В функции обновления я вызываю StartCoroutine(move()); Это моя функция перемещения:
public IEnumerator move()
{
Vector2 tmp = new Vector2(14.47f, transform.position.y);
bool hasReachedTarget = false;
while (!hasReachedTarget)
{
if (transform.position.x < tmp.x)
{
transform.position =
Vector3.MoveTowards(transform.position, tmp, moveSpeed * 0.01f * Time.deltaTime);
yield return null;
}
else
{
hasReachedTarget = true;
}
}
Debug.Log("ct "+count);
count++;
if (!isHandled)
{
isHandled = true;
transform.position = tmp;
GameStoryManager.curGameStoryIndex++;
animator.SetBool(IS_MOVE_NAME, false);
}
}
Моя проблема в том, что при запуске этой функции она вызывает ее много раз; Используя Debug.Log("ct "+count) я вижу много счетчиков.
Я не знаю, почему это произошло. Пожалуйста, кто-нибудь объясните мне это. Спасибо за ваш ответ.
Мне любопытно: почему вы используете для этого сопрограмму? Если у вас есть конкретная причина, это нормально, вы можете следить за другими комментариями, но знайте, что если вы замените while
на if
, а return yield null
на return
и поместите код прямо внутри Update
, все будет работать нормально, и вы выиграете. Мне не нужна сопрограмма.
@BugFinder Спасибо за ваш ответ, я добавил некоторые условия в функцию обновления, чтобы вызывать startCoroutine только один раз, и это сработало.
Ну, вы вызываете эту функцию в функции обновления. Естественно, функция вызывается непрерывно и мгновенно. И условие (transform.position.x < tmp.x) не выполняется. В этом случае вы ReachedTarget = true; Однако когда ваша функция снова вызывается функцией обновления, hasReachedTarget = false; И этот сценарий продолжается так же, и именно поэтому ваше сообщение печатается. Сообщение не следует печатать, только если положение вашего объекта по оси X меньше 14,47, что, по-видимому, не так. Извините за мой плохой английский. Это вина Google Translate. :)
Я понял, что причина в том, что я вызываю функцию перемещения непосредственно в функции обновления, поэтому она запускает новый экземпляр сопрограммы при каждом вызове функции обновления. Я добавил условие для вызова функции перемещения, и это сработало.
потому что при каждом обновлении вы запускаете новый экземпляр сопрограммы?