using System; using AibisDream.Utility; using Newtonsoft.Json; using UnityEngine; using UnityEngine.AddressableAssets; namespace AibisDream.FixSystem { public class BodyModule : MonoBehaviour, ISocket { #region 组件引用 private const string SocketObjName = "Socket"; public Transform socketPos; private BodyModuleSystem _bodyModuleSystem; private Material _highlightMaterial; private Material _alarmMaterial; private Material _originalMaterial; // 原材质 private SpriteRenderer _targetSpriteRenderer; // 目标的 SpriteRenderer private LineRenderer _dotLine; private LineRenderer _cutLine; #endregion // 模块基本数据 [SerializeField] public BodyModuleData data; private bool _available = true; private void Awake() { // 获取组件索引 InitReference(); } private void InitReference() { socketPos = transform.Find(SocketObjName); _bodyModuleSystem = transform.parent.parent.GetComponent(); _targetSpriteRenderer = transform.Find("Module Pic").GetComponent(); _originalMaterial = _targetSpriteRenderer.GetComponent().material; _highlightMaterial = Resources.Load("Materials/HighlightMaterial"); _alarmMaterial = Resources.Load("Materials/AlarmMaterial"); } #region 插槽功能 public bool IsAvailable() { return _available; } public void SetSocketAvailable(bool isAvailable) { _available = isAvailable; } public void PlugIn() { if (DialogController.Instance) // 然后触发Yarn节点 DialogController.Instance.StartDialogNode(_bodyModuleSystem.inHotErr ? "系统发热" : data.PlugInNodeName); } public void PlugOut() { } public Vector3 GetSocketPos() { return socketPos.position; } #endregion #region 高亮提示和隐藏 public void Highlight(bool enable) { if (_targetSpriteRenderer != null && _highlightMaterial != null && _targetSpriteRenderer.material != _alarmMaterial) { _targetSpriteRenderer.material = enable ? _highlightMaterial : _originalMaterial; } } public void Alarm(bool enable) { if (_targetSpriteRenderer != null && _alarmMaterial != null) { _targetSpriteRenderer.material = enable ? _alarmMaterial : _originalMaterial; } } #endregion #region 切割相关 public void EnableCut() { // 显示虚线 var dotLine = GetOrCreateDotLine(); // 指针转为锯片 } private void OnCut() { // } private LineRenderer GetOrCreateDotLine() { if (_dotLine != null) { return _dotLine; } var dotLine = new GameObject("Dot Line").AddComponent(); // 设置Line的参数 dotLine.sortingLayerName = ConstRef.FixMiddleLayer; dotLine.sortingOrder = 4; // dotLine.materials = new[] { }; Addressables.LoadAssetAsync(ConstRef.DotLineMaterialName); return dotLine; } #endregion } [Serializable] public struct BodyModuleData { public const string PlugInNodeTemplate = "{0}PlugIn"; // ID public string moduleName; // 只读 [JsonIgnore] public string PlugInNodeName => string.Format(PlugInNodeTemplate, moduleName); } }