Unity C#开发捉人游戏碰撞检测问题及Tag Manager实现问询
捉人(Tag)游戏判定逻辑优化方案
全局状态管理(TagManager)实现
做成单例类统一管理全局游戏状态,避免分散在各个玩家脚本的逻辑冲突:
using UnityEngine; public class TagManager : MonoBehaviour { public static TagManager Instance { get; private set; } public GameObject currentTagger; public int tagSwitchCount; // 你需要的计数器可以直接放在这里 private void Awake() { if (Instance != null && Instance != this) Destroy(gameObject); else Instance = this; } public void OnTagTrigger(GameObject newTagger) { if (newTagger == currentTagger) return; currentTagger = newTagger; tagSwitchCount++; // 可在此处添加音效、UI更新等全局触发逻辑 } }
玩家通用碰撞逻辑
所有玩家挂载同一份脚本,不管是主动碰撞还是被碰撞都能正常触发判定:
using UnityEngine; public class PlayerTagHandler : MonoBehaviour { public bool isCurrentlyTagger; private void OnCollisionEnter(Collision collision) { // 仅处理和其他玩家的碰撞 if (!collision.gameObject.TryGetComponent(out PlayerTagHandler otherPlayer)) return; // 当前对象是抓人者时,触发身份切换 if (isCurrentlyTagger) { TagManager.Instance.OnTagTrigger(otherPlayer.gameObject); isCurrentlyTagger = false; otherPlayer.isCurrentlyTagger = true; } } }
配置注意事项
- 场景中新建空对象挂载
TagManager脚本,初始设置好首个抓人者的currentTagger引用 - 所有玩家对象必须挂载碰撞体(Collider)以及至少一方挂载非运动学(Non-Kinematic)刚体(Rigidbody),保证
OnCollisionEnter正常触发 - 初始抓人者的
PlayerTagHandler脚本中isCurrentlyTagger勾选为true - 如果使用触发器判定,将碰撞体勾选
Is Trigger,把OnCollisionEnter替换为OnTriggerEnter即可,逻辑无需修改
内容的提问来源于stack exchange,提问作者imsobadatcoding
相关产品推荐
相关产品推荐

