关于prefab实例化至舞台Instantiate的分享

2015年03月20日 15:41 0 点赞 0 评论 更新于 2017-05-05 05:22

在 Unity 开发中,将 Prefab(预制体)通过 Instantiate 方法实例化到舞台时,程序生成的是该预制体的 Clone(克隆物体)。例如,若将 dashi.prefab 实例化到舞台,得到的将是 dashi(Clone),这是后续讨论的基础。

案例

在上述前提下,假设我们通过代码 Resource.Load 获取到该预制体,并且在将预制体实例化到舞台之前,对预制体上挂载的脚本进行代码操作编辑。具体来说,使用代码将其公共属性 ID 修改为 20140902,那么实例化到舞台后,公共属性 ID 的值是多少呢?

案例解析

当使用 Unity(U3D)代码将预制体实例化到舞台后,生成的所有克隆物体上挂载的任何属性(包括脚本属性),均为该预制体在 Unity 中的预制体属性。也就是说,我们在 Unity 中制作或修改预制体的所有属性,在通过 Instantiate 方法实例化到舞台后,这些属性值将保持不变。我们在实例化到舞台前使用代码对预制体所做的所有修改都不会生效,无论如何修改,实例化到舞台后该预制体的属性都是之前设定好的预制体属性。

解决方案

如果我们需要动态赋值,该怎么办呢?答案是在将预制体实例化到舞台之后,再获取脚本或公共属性进行修改。以下是具体的代码示例及分析:

不生效的操作示例

FightUnit unit1 = prefab.GetComponent<FightUnit>();
unit1.UnitId = 20140902;
Instantiate(prefab, spawnPos, spawnRotation) as GameObject;
// 以上操作为不生效操作,此时输出 unit1.UnitId 依然为之前预制体上的 ID

在这个示例中,我们先获取预制体上的 FightUnit 脚本组件,并尝试修改其 UnitId 属性,然后进行实例化。但由于前面提到的原因,这样的修改不会生效,实例化后的克隆物体的 UnitId 仍然是预制体原本的属性值。

正确的操作示例

GameObject p = Instantiate(prefab, spawnPos, spawnRotation) as GameObject;
FightUnit unit = p.GetComponent<FightUnit>();
unit.UnitId = 20140902;

在这个示例中,我们先将预制体实例化得到一个游戏对象 p,然后从这个实例化后的游戏对象上获取 FightUnit 脚本组件,最后对其 UnitId 属性进行修改。这样的操作是有效的,因为我们是在实例化之后进行属性修改,此时修改的是克隆物体的属性,而不是预制体本身的属性。

通过以上的分析和示例,我们可以清楚地了解在 Unity 中如何正确地对预制体实例化后的克隆物体进行属性修改,避免因错误的操作导致属性修改不生效的问题。

作者信息

menghao

menghao

共发布了 332 篇文章