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

Unity如何让碰撞检测脚本获取场景中多个Enemy GameObject的ID信息

解决方案

步骤1:统一敌人身份组件,适配多类型敌人识别

给所有类型的敌人预制体挂载同一个EnemyIdentity脚本,脚本内仅存储对应敌人的Scriptable Object引用即可,无需区分敌人类型:

public class EnemyIdentity : MonoBehaviour
{
    // Inspector面板中拖入当前敌人对应的配置SO即可
    public Enemy_SO currentEnemyConfig;
}

修改玩家身上的碰撞检测脚本,碰撞时通过组件识别来获取对应敌人信息,无需绑定单一敌人类型:

private void OnTriggerEnter(Collider other)
{
    // 只要碰撞对象挂载了EnemyIdentity组件,就判定为有效敌人
    if(other.TryGetComponent(out EnemyIdentity enemy))
    {
        // 直接拿到对应敌人的ID
        int targetEnemyId = enemy.currentEnemyConfig.enemyID;
        // 将ID存入跨场景数据管理器即可
        BattleDataHolder.Instance.fightEnemyId = targetEnemyId;
        // 后续跳转战斗场景逻辑
    }
}

步骤2:轻量实现跨场景数据传递

新增一个全局数据管理单例,设置为跨场景不销毁,专门用来存储需要跨场景传递的战斗数据:

public class BattleDataHolder : MonoBehaviour
{
    public static BattleDataHolder Instance;
    // 存储待生成的敌人ID
    public int fightEnemyId;

    private void Awake()
    {
        if(Instance == null)
        {
            Instance = this;
            // 过场景时不销毁该对象,存储的数据不会丢失
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

你只需要在初始场景中放一个挂载了BattleDataHolder的空对象即可,战斗场景加载完成后,直接从BattleDataHolder.Instance.fightEnemyId取ID,匹配对应的Scriptable Object实例化敌人即可。
额外优化建议:可以把所有敌人放在同一个专属层级,碰撞检测时只检测该层级,既可以避免误触其他物体,也能降低性能消耗。

内容的提问来源于stack exchange,提问作者Terezo_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:24:02