using Core; using UnityEngine; using Script.Gameplay.Interface; using Script.Gameplay.Input; using System; using Script.Gameplay.Global; namespace Script.Gameplay.Player { public class PlayerEditController : MonoBehaviour { [SerializeField] private FirstPersonRaycaster raycaster; // 新增:第一人称射线检测器 public bool IsEnableEditing = true; // 是否启用编辑功能 private bool isEditing = false; // 当前是否处于编辑状态 public event Action OnBeginEditTarget; public event Action OnEndEditTarget; private IEditable currentTarget; // 射线命中的当前可编辑对象(用于按键交互) private IEditable previousGazedTarget; // 上一次注视的对象(用于注视进入/离开事件) private InputManager inputManager; private TimePauseManager timePauseManager; void Start() { inputManager = InputManager.Instance; inputManager.Input.Player.Edit.performed += context => EditTarget(); timePauseManager = TimePauseManager.Instance; 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."); ControllerLocator.Instance.Register(this); } void Update() { DetectInteractable(); } void DetectInteractable() { if (raycaster == null) return; GameObject lookAtObj = raycaster.CurrentLookAtObject; IEditable hitEditable = lookAtObj != null ? lookAtObj.GetComponent() : null; // 如果命中对象与之前注视的不一样,触发进入/离开事件 if (hitEditable != previousGazedTarget) { if (previousGazedTarget != null) { previousGazedTarget.OnGazeExit(this); } if (hitEditable != null) { hitEditable.OnGazeEnter(this); } previousGazedTarget = hitEditable; } currentTarget = hitEditable; } public IEditable GetCurrentTarget() { return currentTarget; } private void EditTarget() { if (isEditing) { isEditing = false; OnEndEditTarget?.Invoke(currentTarget); inputManager.SetCursorState(false, CursorLockMode.Locked); inputManager.SetInputForLook(true); inputManager.SetInputForMove(true); if (timePauseManager != null) { timePauseManager.SetPaused(false); } } else { if (currentTarget == null) return; if (!IsEnableEditing) return; isEditing = true; OnBeginEditTarget?.Invoke(currentTarget); inputManager.SetCursorState(true, CursorLockMode.Confined); inputManager.SetInputForLook(false); inputManager.SetInputForMove(false); if (timePauseManager != null) { timePauseManager.SetPaused(true); } } } void OnDrawGizmos() { // 交由 FirstPersonRaycaster 绘制射线 } } }