Сопрограмма в методе расширения

Я написал метод расширения, чтобы заставить объект двигаться с течением времени. Это работает хорошо; однако, поскольку объект выполняет эту задачу в течение определенного периода времени, он игнорирует все другие вызовы, такие как мой метод обновления. Я предполагаю, что мне нужно что-то сделать с сопрограммой, но я не могу понять, куда это идет. Как сделать так, чтобы следующий код работал, не препятствуя одновременному запуску другого кода (например, метода Update())? Упрощенная версия выглядит следующим образом:

================================================== ================================

//The following script is attached to the GameObject
[RequireComponent(typeof(Rigidbody2D)]
public class MyBehaviour : MonoBehaviour
{
    void Start()
    {
        rigidbody2D.MoveOverTime();
    }

    void Update(){
        rigidbody2D.MovePosition(transform.position.x + 1, transform.position.y);
    }
}

================================================== ================================

//The following script is not attached to anything
public static class Rigidbody2DExtension
{
    public static void MoveOverTime(this Rigidbody2D rigidbody2D)
    {
       gameObject.addComponent<MoveOverTimeComponent>();
    }
}

[RequireComponent(typeof(Rigidbody2D)]
class MoveOverTimeComponent : MonoBehaviour
{
    void Update(){
        MovePositionByALittleBit();
    }

    void MovePositionByALittleBit(){
        float x = transform.position.x + 1;
        float y = transform.position.y;
        rigidbody2D.MovePosition(new Vector2(x, y));
    }
}

1 ответ

Решение

Оба ваши Updates() бегут. На самом деле, все Updates() из всех MonoBehaviours побежит.

При условии, что gameObject.addComponent<MoveOverTimeComponent>(); на самом деле относится к GameObject (что не ясно из-за ограниченного кода, который вы разместили), тогда ваша проблема пытается переместить то же самое GameObject на двух разных Update() функции.

Другие вопросы по тегам