实例化 Start() 在设置后运行?
Instantiate Start() runs after settings?
我有一个 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
方法是通过反射调用的,并且在生命周期中发生的时间比您预期的要晚(即它不会在调用 [=11= 后直接发生) ]).
我建议您在 Ball.cs 中创建一个 void Init()
方法,并在实例化新游戏对象后手动调用此方法。如果你不想走那条路,我建议你创建一个协程并在帧的末尾调用 obj.GetComponent<SpriteRenderer>().color = bc;
(使用 WaitForEndOfFrame
),这样你就可以在Start
方法已被调用。
这里有一些关于 Monobehaviour 生命周期的文档(和图表):
http://docs.unity3d.com/Manual/ExecutionOrder.html
http://cfile4.uf.tistory.com/image/21416F4F525355A427B426
http://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html
我有一个 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
方法是通过反射调用的,并且在生命周期中发生的时间比您预期的要晚(即它不会在调用 [=11= 后直接发生) ]).
我建议您在 Ball.cs 中创建一个 void Init()
方法,并在实例化新游戏对象后手动调用此方法。如果你不想走那条路,我建议你创建一个协程并在帧的末尾调用 obj.GetComponent<SpriteRenderer>().color = bc;
(使用 WaitForEndOfFrame
),这样你就可以在Start
方法已被调用。
这里有一些关于 Monobehaviour 生命周期的文档(和图表):
http://docs.unity3d.com/Manual/ExecutionOrder.html
http://cfile4.uf.tistory.com/image/21416F4F525355A427B426
http://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html