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_
相关产品推荐
相关产品推荐

