Unity循环实例化GameObject/克隆体时如何传递不同参数
问题核心原因
Instantiate()方法会返回新生成的克隆对象实例,你当前代码调用该方法时没有接收返回值,后续所有位置设置、参数赋值操作全部作用在原始基准对象Example上,没有对新生成的克隆体做任何修改。循环最后一次给Example设置的速度参数会同步到所有从它生成的克隆体上,最终表现为所有实例参数完全一致。
你提到的直接新建GameObject无法渲染的问题,是因为new GameObject()生成的是无任何组件的空对象,没有挂载渲染组件、业务脚本,自然无法正常显示,和克隆逻辑无关。
修复方案
- 调用
Instantiate()时用变量接收返回的新实例引用 - 所有针对新对象的位置调整、参数赋值操作,全部通过新实例的引用执行,不要修改原始基准对象
Example
修正后的代码如下:
foreach (float a in ListA) { // 接收新生成的克隆实例 GameObject spawnedObj = Instantiate(Example); // 对新实例设置坐标 spawnedObj.transform.position = new Vector2(0f, up); // 给新实例挂载的脚本设置独立参数 NewBehaviourScript targetScript = spawnedObj.GetComponent<NewBehaviourScript>(); targetScript.SetSpeed( Assets.Class1.random.Next(20, 70) * 1f, Assets.Class1.random.Next(20, 70) * 1f, Assets.Class1.random.Next(20, 70) * 1f ); up += 40f; }
额外注意点
- 不要在循环内部重复初始化随机数生成器,保持
Assets.Class1.random为全局单例实例即可,否则相同时间种子下会生成完全一致的随机值 - 不需要重复调用
AddComponent给新对象加脚本,Instantiate生成的克隆体会完整保留基准对象上的所有组件,直接获取对应组件修改参数即可
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

