Unity实例化异常:触发后续预制体时生成两个对象而非一个
问题成因分析与解决思路
嘿,作为Unity新手碰到这种重复生成的问题确实头疼,我来帮你拆解一下核心原因:
最可能的诱因:一个道路预制体里有多个触发体挂载了CreateNextRoad脚本
你提到道路预制体里包含一个你创建的触发对象,还有另一个触发体和道路模型。如果这两个带Is Trigger勾选的碰撞体,都挂载了CreateNextRoad脚本,就会出现这种差异:
- 初始道路可能是你手动调整过的,比如只给其中一个触发体挂了脚本,所以第一次触发时只有一个脚本执行,生成一个道路;
- 但通过
Instantiate生成的新道路预制体,会完整复制预制体里的所有组件——也就是两个触发体都带着CreateNextRoad脚本。当车辆进入道路的触发范围时,两个触发体的OnTriggerEnter方法都会被调用,自然会生成两个新道路。
你可以快速验证:选中你的道路预制体,逐一检查所有带Collider且勾选Is Trigger的对象,看看是不是都挂载了这个脚本。
次要可能:静态变量的更新顺序+重复触发
看你的代码逻辑:
Instantiate(Road, new Vector3(0f, 0f, nextSpawnPoint), Quaternion.Euler(0, 90, 0)); nextSpawnPoint = parentPos + 109f;
你是先实例化道路,再更新nextSpawnPoint。虽然这不会直接导致生成两个,但如果触发逻辑被意外触发两次(比如碰撞检测延迟、触发体重叠),两次调用都会使用同一个旧的nextSpawnPoint值,导致生成两个重叠的道路。
调整顺序或者加个触发后禁用的逻辑就能缓解:
if(other.CompareTag("Player")) { // 先计算新的生成点,避免重复使用旧值 float newSpawnPoint = parentPos + 109f; Instantiate(Road, new Vector3(0f, 0f, newSpawnPoint), Quaternion.Euler(0, 90, 0)); nextSpawnPoint = newSpawnPoint; Debug.Log(nextSpawnPoint); // 触发后禁用当前脚本,防止同一个道路被多次触发 this.enabled = false; }
另外,静态变量nextSpawnPoint是全局共享的,所有CreateNextRoad实例都会用同一个值,但核心问题还是触发次数过多。
快速验证小技巧
你可以在OnTriggerEnter里加一行打印,看看每次触发的是哪个对象:
Debug.Log($"触发的对象:{gameObject.name},当前生成点:{nextSpawnPoint}");
如果打印出两个不同的触发对象名称,那就实锤是多个触发体挂载脚本的问题啦。
内容的提问来源于stack exchange,提问作者Mark Grindcore
相关产品推荐
相关产品推荐

