在不使用MonoManager的情况下控制Unity脚本执行顺序

时间:2017-01-04 14:23:52

标签: c# unity3d

我有一系列在给定速度(儿童)方向上移动的物体和另一个改变这些物体(控制器)速度的物体。

如果控制器调整所有孩子在孩子自行移动过程中的速度,则间距会变得不均匀,因为有些孩子已经用旧速度移动了,有些已经以新的速度移动了。

我已经能够通过使用Edit->项目设置 - >脚本执行顺序来解决这个问题,使控制器在孩子面前执行,但这似乎并不理想。有没有更好的方法来解决这个问题?

以下是非常简单的子脚本和控制器脚本。

// 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;
        }
    }
}

1 个答案:

答案 0 :(得分: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/