2014-11-16 4 views
4

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

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

//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)); 
    } 
} 
+0

Зачем нужно вызывать метод 'Update'? Насколько мне известно, они никогда не вызываются. –

+0

@KirkWoll Они называются автоматически как расширение MonoBehaviour – Evorlor

+0

Как? Вы не переопределяете метод, и он является конфиденциальным. –

ответ

3

Оба ваши Updates() работают. Фактически, все Updates() всего MonoBehaviours будут работать.

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

+0

Это моя проблема, спасибо! Я пытаюсь переместить один и тот же «GameObject» на две разные функции «Update()». Любая идея о том, как это разрешить? – Evorlor

+0

Вы уже двигаетесь, просто случается, что вы двигаетесь в одном направлении с одинаковой точностью. Сделайте один из 'Updates()' перемещаться только по оси y, а другой - по оси x, чтобы вы могли увидеть резкое изменение. – FunctionR

+0

Я создал совершенно новый GameObject. У него нет ничего, кроме двух скриптов. Делается так: Vector2 newPosition = new Vector2 (transform.position.x + 1, transform.position.y); rigidbody2D.MovePosition (newPosition); Другое: Vector2 newPosition = new Vector2 (transform.position.x, transform.position.y + 1); rigidbody2D.MovePosition (newPosition); Вызывается только один из них. Мне нужно будет провести некоторое исследование по этому вопросу. – Evorlor