using System; using UnityEngine; using UnityEngine.Events; using Yarn.Unity; namespace AibisDream.FixSystem { public class CableSystem : MonoBehaviour { #region 组件索引 public Plug PlugRef { get; private set; } public Cable CableRef { get; private set; } public Transform CableRootPos { get; private set; } public Socket InitSocket { get; private set; } public BodyModuleSystem BodyModuleSystem { get; private set; } private BodyModule[] _bodyModules; #endregion #region 系统状态 public bool isInDialog = false; public bool isActive = true; [HideInInspector] public Socket curSocket; #endregion #region 事件 public UnityEvent plugInEvent; public UnityEvent plugOutEvent; public UnityEvent plugStartDrag; public UnityEvent plugEndDrag; #endregion public Vector3 InitSocketPos => InitSocket.transform.position; private void Awake() { InitComponentRefs(); } private void Start() { InitSystem(); } private void OnEnable() { DialogController.OnDialogueStart += HandleDialogueStart; DialogController.OnDialogueComplete += HandleDialogueComplete; } private void OnDisable() { DialogController.OnDialogueStart -= HandleDialogueStart; DialogController.OnDialogueComplete -= HandleDialogueComplete; } private void InitComponentRefs() { PlugRef = transform.Find("Plug").GetComponent(); CableRef = transform.Find("Cable").GetComponent(); CableRootPos = transform.Find("Cable Root Pos").transform; InitSocket = transform.Find("Init Socket").GetComponent(); BodyModuleSystem = transform.parent.GetComponent(); } private void InitSystem() { PlugRef.InitPlug(InitSocket); } /// /// 寻找最接近的Module /// /// 源位置 /// 最近的Module /// 是否能找到目标范围内的Module public bool TryFindClosestSocket(Vector3 sourcePos, out BodyModule targetModule) { return BodyModuleSystem.TryFindClosestSocket(sourcePos, out targetModule); } #region 系统可用状态 private void HandleDialogueStart() { isInDialog = true; } private void HandleDialogueComplete() { isInDialog = false; } [YarnCommand("Disable_plugInput")] public void Disable_plugInput() { isActive = false; } [YarnCommand("Enable_plugInput")] public void Enable_plugInput() { isActive = true; } /// /// 查询插线系统是否可用 /// /// public bool IsPlugAvailable() { return isActive && !isInDialog; } #endregion } }