using BigSpace.Logic; using BigSpace.XRCore.Event; using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; using UnityEngine.XR.Interaction.Toolkit.Interactables; /// /// S2 洹水风光 - 动物抓取交互 /// 挂在 animal_wolf / animal_cattle / animal_elephant 预制体根节点。 /// 同一 GameObject 需要挂 XRGrabInteractable。 /// /// 抓取流程: /// selectEntered → 更新 AnimalCatchMgr 状态(手翻转手势仍由 AnimalCatchCtr.RightHnadCatchPalmUp 处理) /// selectExited → 启用物理 + 派发 EventAnimalSend(多人同步) /// [RequireComponent(typeof(XRGrabInteractable))] public class S2_AnimalGrab : MonoBehaviour { [Header("动物类型")] [Tooltip("1=狐/狼 2=象 3=牛")] [SerializeField] private int animalType = 1; [Header("释放后挂到的父节点")] [Tooltip("赋值为场景中 AnimalCatchMgr.parent_animals,留空则保持原父节点")] [SerializeField] private Transform releaseParent; private XRGrabInteractable m_grab; private Rigidbody m_rb; private void Awake() { m_grab = GetComponent(); m_rb = GetComponent(); } private void OnEnable() { m_grab.selectEntered.AddListener(OnSelectEntered); m_grab.selectExited.AddListener(OnSelectExited); } private void OnDisable() { m_grab.selectEntered.RemoveListener(OnSelectEntered); m_grab.selectExited.RemoveListener(OnSelectExited); } // ── 抓取 ────────────────────────────────────────────────────── private void OnSelectEntered(SelectEnterEventArgs args) { // 让 AnimalCatchCtr.RightHnadCatchPalmUp 仍能读到正确的动物类型 if (AnimalCatchMgr.Instance != null) { AnimalCatchMgr.Instance.rightHandIsCatchObj = true; AnimalCatchMgr.Instance.rightAnimalType = animalType; } } // ── 松手 ────────────────────────────────────────────────────── private void OnSelectExited(SelectExitEventArgs args) { // 脱离手部父节点,挂到场景动物容器 if (releaseParent != null) transform.SetParent(releaseParent, true); // 启用物理(XRI 在 Velocity/Kinematic 模式下会恢复 isKinematic,这里强制打开重力) if (m_rb != null) { m_rb.isKinematic = false; m_rb.useGravity = true; } // 重置管理器状态 if (AnimalCatchMgr.Instance != null) AnimalCatchMgr.Instance.rightHandIsCatchObj = false; // 多人同步:告知其他玩家在同位置生成该动物 GlobalEventMgr.Dispatch(GameEvent.EventAnimalSend, animalType); } }