实例化 Start() 在设置后运行



我有一个我Instantiate的预制件,但是当我尝试为它分配一种颜色时,它不起作用,我认为这是因为我在Start()中给它一个随机的颜色,但我想做的是覆盖该颜色,但它不起作用。

我有一个如下所示的Ball.cs启动方法:

void Start(){
    sr = GetComponent<SpriteRenderer>();
    sr.color = Colors.colors[Random.Range(0, Colors.colors.Length)];
}

然后,我LevelController.cs有一个在屏幕上随机位置球的方法,它看起来像这样:

    int required = 2;
    for (int i = 0; i < balls; i++){
        Vector3 screenPosition = Camera.main.ScreenToWorldPoint(new Vector3(Random.Range(0,Screen.width), Random.Range(0,Screen.height), Camera.main.farClipPlane/2));
        GameObject obj = GameObject.Instantiate(ball, screenPosition, Quaternion.identity) as GameObject;
        // Color Reaction mode
        if(gameType == "Color Reaction"){
            obj.GetComponent<Ball>().gameType = "Color Reaction";
            // Make sure we have enough colors
            if(ballColor != null && i < required){
                Color bc = new Color(ballColor.r, ballColor.g, ballColor.b, 0.75f);
                obj.GetComponent<Ball>().ballColor = bc;
                obj.GetComponent<SpriteRenderer>().color = bc;
            }
        }
    }

所以,当我的球被创建时,我认为它会创建一个随机的颜色,如 Ball.cs 中指定的那样,然后它会分配一个颜色:

obj.GetComponent<SpriteRenderer>().color = bc;
问题是,它

不这样做,它使用Ball.cs的颜色。如果我从Ball.cs中注释掉随机颜色,它可以工作。我需要做什么才能让它在循环中使用颜色?

Ball.cs 上的 Start 方法是通过反射调用的,并且在生命周期中发生的时间比您预期的要晚(即在调用 GameObject.Instantiate 后它不会发生)。

我建议你在 Ball 中创建一个void Init()方法.cs并在实例化新的游戏对象后手动调用这个海峡。如果您不想沿着这条路走下去,我建议您创建一个协程并在帧末尾调用obj.GetComponent<SpriteRenderer>().color = bc;(使用 WaitForEndOfFrame),这样您就可以在调用 Start 方法后执行代码。

以下是一些关于单行为生命周期的文档(和图表):

http://docs.unity3d.com/Manual/ExecutionOrder.html

http://cfile4.uf.tistory.com/image/21416F4F525355A427B426

http://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

最新更新