using Core; using UnityEngine; using Script.Gameplay.Interface; using Script.Gameplay.Input; using System; using System.Collections.Generic; 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 OnGazeEnterEditableComponent; public event Action OnGazeExitEditableComponent; public event Action OnBeginEditTarget; public event Action OnEndEditTarget; private GameObject previousTarget; // 上一次注视的对象(用于注视进入/离开事件) private GameObject currentTarget; // 射线命中的当前可编辑对象(用于按键交互) public GameObject CurrentTarget { get => currentTarget; set { previousTarget = currentTarget; currentTarget = value; if (previousTarget != currentTarget) { if (currentTarget != null) { OnGazeEnterEditableComponent?.Invoke((currentTarget)?.gameObject); } if (previousTarget != null) { OnGazeExitEditableComponent?.Invoke((previousTarget)?.gameObject); } } } } 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; GameObject hitEditable = null; if (lookAtObj != null) { if (lookAtObj.GetComponent() != null) { hitEditable = lookAtObj; } } CurrentTarget = hitEditable; } 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 绘制射线 } } }