2017-01-04 2 views
0

У меня есть серия объектов, которые движутся в направлении с заданной скоростью (детьми) и другим объектом, который изменяет скорость этих объектов (контроллер).Порядок выполнения скрипта Unity без использования MonoManager

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

Я смог решить эту проблему, используя Edit-> Project Settings-> Script Execution Order, чтобы заставить контроллер выполнить перед детьми, но это не кажется идеальным. Есть ли лучший способ решить эту проблему?

Ниже приведены очень простые сценарии для детей и контроллеров.

// Child 
public class MoveVertically 
    : MonoBehaviour 
{ 
    public float Speed; 

    void Update() 
    { 
     transform.Translate (Vector3.down * Time.deltaTime * Speed); 
    } 
} 

// Controller 
public class MoveChildrenVertically 
    : MonoBehaviour 
{ 
    public float Speed; 

    MoveVertically[] children; 

    void Start() 
    { 
     children = GetComponentsInChildren<MoveVertically>(); 
    } 

    void Update() 
    { 
     foreach (var symbol in symbols) 
     { 
      symbol.Speed = Speed; 
     } 
    } 
} 

ответ

4

Получить контроллер, чтобы переместить все элементы:

public class MoveVertically 
    : MonoBehaviour 
{ 
    public void Move (float speed) 
    { 
     transform.Translate (speed); 
    } 
} 

// Controller 
public class MoveChildrenVertically 
    : MonoBehaviour 
{ 
    public float Speed; 

    MoveVertically[] children; 

    void Start() 
    { 
     children = GetComponentsInChildren<MoveVertically>(); 
    } 

    void Update() 
    { 
     Speed = ChangeSpeed(); // if needed 
     float speed = Vector3.down * Time.deltaTime * Speed; 
     foreach (var child in children) 
     { 
      child.Move(speed); 
     } 
    } 
} 

Двойного бонус, вы не должен вызывать изменение скорости на каждом ребенке, вы передаете его в вызове Move. Кроме того, у вас есть еще одно обновление для каждого ребенка.

Чтобы понять преимущество вызова метода ребенка вместо обновления на детях: (! Большую ссылку тоже)

https://blogs.unity3d.com/2015/12/23/1k-update-calls/

+0

Это отличный способ сделать это – Programmer

+0

Согласитесь, отличный способ сделать это и полностью решен моя проблема - спасибо! – TVOHM

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