You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:47:42