using UnityEngine; using Script.Gameplay.Interface; using System; using Script.Gameplay.Input; namespace Gameplay.Player { public class PlayerInteractorController : MonoBehaviour { [SerializeField] private FirstPersonRaycaster raycaster; // 新增:第一人称射线检测器 [SerializeField] private bool isEnablePlayerInteraction = true; // 是否启用玩家交互功能 private IInteractable currentTarget; // 被射线命中的当前可交互对象(用于按键交互) private IInteractable previousGazedTarget; // 上一次注视的对象(用于注视进入/离开事件) void Start() { if (raycaster == null) raycaster = GetComponent() ?? GetComponentInChildren(); if (raycaster == null) raycaster = FindObjectOfType(); if (raycaster == null) Debug.LogWarning("FirstPersonRaycaster not found! Please assign or add it to the player."); var input = InputManager.Instance.Input; input.Player.Interact.performed += ctx => { if (currentTarget != null) { currentTarget.Interact(this.gameObject); } }; } void Update() { DetectInteractable(); } void DetectInteractable() { if (raycaster == null) return; if (!isEnablePlayerInteraction) return; GameObject lookAtObj = raycaster.CurrentLookAtObject; IInteractable hitInteractable = lookAtObj != null ? lookAtObj.GetComponent() : null; // 如果命中对象与之前注视的不一样,触发进入/离开事件 if (hitInteractable != previousGazedTarget) { if (previousGazedTarget != null) { previousGazedTarget.OnGazeExit(this.gameObject); } if (hitInteractable != null) { hitInteractable.OnGazeEnter(this.gameObject); // 这里可以显示交互提示UI,例如 “E - 开门” Debug.Log(hitInteractable.GetInteractPrompt()); } previousGazedTarget = hitInteractable; } currentTarget = hitInteractable; } public void SetPlayerInteractionEnabled(bool isEnabled) { isEnablePlayerInteraction = isEnabled; if (!isEnabled && previousGazedTarget != null) { previousGazedTarget.OnGazeExit(this.gameObject); previousGazedTarget = null; currentTarget = null; } } void OnDrawGizmos() { // 交由 FirstPersonRaycaster 绘制射线 } } }