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

时间:2015-04-19 16:50:11

标签: c# unity3d

我有一个预制件Instantiate,但当我尝试为它指定颜色时,它不起作用,我认为这是因为我在{{1}中给它一个随机颜色但是,我想要做的是覆盖那种颜色,但它不起作用。

我有一个Start() 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中的随机颜色,它就可以了。我需要做些什么来使用循环中的颜色?

1 个答案:

答案 0 :(得分:2)

Ball.cs上的Start方法是通过反射调用的,并且在生命周期的后期发生,而不是你预期的(即在调用{{1}后它不会发生。 })。

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

以下是Monobehaviour生命周期的一些文档(和图表):

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

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

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