Vector2.MoveTowards не двигает мой объект в сопрограмме - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть класс Hookshot, который содержит общедоступную сопрограмму, которую я вызываю, когда объект, к которому он прикреплен (снимок крючка), создается в другом сценарии. Цель состоит в том, чтобы сопрограмма CastHookshot переместила объект на заданное расстояние, а затем запустила сопрограмму ReturnHookshot, чтобы переместить ее обратно игроку. Плавное движение вперед и назад. Будут дополнительные варианты дизайна, которые запрещают мне использовать Mathf.PingPong или Mathf.Sin для этого, так что это должны быть две сопрограммы. Несмотря на это, по какой-то причине объект вообще не движется, и я не могу понять, почему. Я проверил с Debug.Log и знаю, что сопрограмм ударил. Передаваемое castDistance равно 50, поэтому условное расстояние для цикла также не должно быть проблемой.

public class Hookshot : MonoBehaviour
{

    private Vector2 playerPos;
    private readonly float hookshotCastTime = 0.2f;
    private readonly float hookshotReturnSpeed = 4f;
    private readonly float hookshotDistanceBuffer = 0.2f;

    public IEnumerator CastHookshot(float castDistance, Vector2 aimDir)
    {
        playerPos = gameObject.transform.position;
        Vector2 target = playerPos + (castDistance * aimDir);
        float speed = castDistance / hookshotCastTime * Time.deltaTime;
        while (Vector2.Distance(transform.position, target) > hookshotDistanceBuffer)
        {
            transform.position = Vector2.MoveTowards(playerPos, target, speed);
            yield return new WaitForEndOfFrame();
        }
        transform.position = target;
        StartCoroutine(ReturnHookshot());
    }

    public IEnumerator ReturnHookshot()
    {
        Vector2 pos = gameObject.transform.position;
        while (Vector2.Distance(pos, playerPos) > hookshotDistanceBuffer)
        {
            transform.position = Vector2.MoveTowards(pos, playerPos, hookshotReturnSpeed * Time.deltaTime);
            yield return new WaitForEndOfFrame();
        }
    }

}

1 Ответ

4 голосов
/ 06 ноября 2019

Проблема, вероятно, в строке

transform.position = Vector2.MoveTowards(playerPos, target, speed);

Вы никогда не обновите значение playerPos, поэтому MoveTowards

Перемещение точки current в направлении target.

каждый кадр возвращает одно и то же значение, поскольку вы говорите ему всегда начинать с одной и той же позиции, а также использовать фиксированное вычисленное расстояние.

Такжеумножение на Time.deltaTime должно выполняться для каждого кадра, так что вы фактически используете правильное значение для каждого кадра, а не вычисляете его только со значением самого первого кадра.


Обратите внимание, что Vector3 и Vector2 не class, но struct и, следовательно, значение тип и НЕ a эталонный тип,Кажется, вы ожидали, что они будут ссылочными типами, поэтому pos и playerPos будут обновлены, если вы измените transform.position, но это не случай!

Вы бы предпочлихочу изменить его на

float speed = castDistance / hookshotCastTime;

...

transform.position = Vector2.MoveTowards(transform.position, target, speed * Time.deltaTime);

И то же самое во второй программе. Особенно условие цикла здесь никогда не вернется, поскольку pos никогда не обновляется! Поэтому измените его на

while (Vector2.Distance(transform.position, playerPos) > hookshotDistanceBuffer)
{
    transform.position = Vector2.MoveTowards(transform.position, playerPos, hookshotReturnSpeed * Time.deltaTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...