using System.Collections.Generic; using Script.Gameplay.Connect; using Script.Gameplay.Interface; using UnityEngine; namespace Script.Gameplay.Facility { public class BaseFacilityController : MonoBehaviour, IInteractable, IEditableComponent, IConnectable, ISignalSender, ISignalReceiver, IGaze { [SerializeField] protected bool isEnableInteract = true; [SerializeField] protected bool isEnableEdit = true; [SerializeField] protected bool isEnableConnect = true; [SerializeField] protected bool isOpenInEditor = true; [SerializeField] protected int needSignalCount = 1; [SerializeField] protected int currentSignalCount = 0; [SerializeField] protected string componentName; public virtual bool IsEnableInteract { get => isEnableInteract; set => isEnableInteract = value; } public virtual bool IsEnableEdit { get => isEnableEdit; set => isEnableEdit = value; } public virtual bool IsOpenInEditor { get => isOpenInEditor; set { isOpenInEditor = value; IsEnableInteract = value; IsEnableConnect = value; } } public virtual bool IsEnableConnect { get => isEnableConnect; set => isEnableConnect = value; } public virtual int NeedSignalCount { get => needSignalCount; set => needSignalCount = value; } public virtual int CurrentNeedSignalCount { get => currentSignalCount; set => currentSignalCount = value; } public string ComponentName { get { // 如果没有自定义名称,则使用组件名称 return string.IsNullOrEmpty(componentName) ? GetType().Name : componentName; } set => componentName = value; } public List ConnectionLines { get; set; } = new List(); public string GetConnectableName() { return gameObject.name; } public GameObject GetGameObject() { return gameObject; } public virtual string GetInteractPrompt() { return $"Interact with {componentName}"; } public Vector3 GetPosition() { return transform.position; } public virtual void Interact(GameObject interactor) { // Implement interaction logic here } public virtual void OnGazeEnter(GameObject go) { // Handle gaze enter } public virtual void OnGazeExit(GameObject go) { // Handle gaze exit } public virtual void OnSignalReceived(bool active, GameObject sender) { if (active) { CurrentNeedSignalCount++; } else { CurrentNeedSignalCount = Mathf.Max(0, CurrentNeedSignalCount- 1); } if (CurrentNeedSignalCount < NeedSignalCount) { return; } // Implement signal received logic here } public virtual void SendSignal(bool active, GameObject sender) { if (ConnectionLines != null) { foreach (var line in ConnectionLines) { line.OnSignalReceived(active, this.gameObject); } } } } }