using AibisDream.Framework; using Framework.Core; using Unity.VisualScripting; using UnityEngine; namespace AibisDream { public class GearController : MonoBehaviour, ISystem { #region 索引 [SerializeField] private GameObject _gearPrefab; private Shaft[] _shafts; #endregion private ShaftGraph _shaftGraph; private GearSysTemLevelData _levelData; public RunType runType; private void Awake() { Init(); } private void OnEnable() { Enable(); } private void OnDisable() { Disable(); } #region 生命周期管理 public void Init() { this.FindComponents(); _shafts = GetComponentsInChildren(); _gearPrefab = Resources.Load("Prefabs/Gear System/Gear"); } public void Enable() { if (runType == RunType.Editor) { } _shaftGraph = new ShaftGraph(_shafts); } public void Disable() { _shaftGraph = null; } public void Deinit() { throw new System.NotImplementedException(); } #endregion /// /// 判断吸附位置 /// /// 齿轮当前位置 /// 齿轮半径 /// 能够被吸附的轴 public Shaft CheckClosestShaft(Vector3 pos, float gearRadius) { return _shaftGraph.QuerySnapShaft(pos, gearRadius); } /// /// 判断齿轮能不能放进轴内 /// /// 当前轴 /// 齿轮半径 /// 是否可用 public bool CheckGearSuitable(Shaft sourceShaft, float gearRadius) { return _shaftGraph.CheckGearSuitable(sourceShaft, gearRadius); } /// /// 生成齿轮 /// /// 位置 /// 半径 /// 齿轮图片 /// 速度 /// 齿轮Obj public GameObject InitGear(Vector3 pos, float radius, Sprite sprite, float speed) { GameObject gearObj = Instantiate(_gearPrefab, pos, Quaternion.identity); gearObj.transform.parent = transform.GetChild(0).transform; Gear gear = gearObj.GetComponent(); gear.radius = radius; gear.gearSprite = sprite; return gearObj; } /// /// 某个轴上齿轮发生变化时更新临接关系 /// /// 轴ID public void ChangeGraphVertex(int shaftId) { _shaftGraph?.ChangeVertex(shaftId); } public void Succeed() { Debug.Log("达成目标"); } } }