using System; using System.Collections; using System.Linq; using AibisDream.FixSystem; using AibisDream.Framework; using AibisDream.Kit; using DG.Tweening; using UnityEngine; namespace AibisDream { public class GearSystem : SystemHasData { #region 索引 [SerializeField] private GameObject gearPrefab; [SerializeField] private GameObject shaftPrefab; private Shaft[] _shafts; private SpriteRenderer _cover; private Transform _coverStick; #endregion private ShaftGraph _shaftGraph; private void Awake() { Init(); } #region 生命周期管理 public void Init() { FixSystemCenter.SystemDic.Register(this); _shafts = GetComponentsInChildren(); _cover = transform.Find("Cover").GetComponent(); _coverStick = transform.Find("Cover Stick"); } public void Start() { if (_shafts != null && _shafts.Length != 0) { _shaftGraph = new ShaftGraph(_shafts); } } #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) { GameObject gearObj = Instantiate(gearPrefab, pos, Quaternion.identity); gearObj.transform.parent = transform.Find("Gears").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("达成目标"); } public IEnumerator OpenCover() { // 滑杆旋转 yield return _coverStick.DORotate(new Vector3(0, 0, -90f), 1f).WaitForCompletion(); // 盖子移动 var sq = DOTween.Sequence(); sq.Join(_cover.transform.DOLocalMove(new Vector3(-1.86f, 2.11f, 0), 1f)); sq.Join(_cover.DOFade(0, 1f)); yield return sq.WaitForCompletion(); } public IEnumerator CloseCover() { // 盖子移动 var sq = DOTween.Sequence(); sq.Join(_cover.transform.DOLocalMove(new Vector3(-1.86f, -0.38f, 0), 1f)); sq.Join(_cover.DOFade(0, 1f)); yield return sq.WaitForCompletion(); // 滑杆旋转 yield return _coverStick.DORotate(new Vector3(0, 0, 0), 1f).WaitForCompletion(); } #region 数据保存与加载 public static string DataPath = Application.streamingAssetsPath + "/LevelData/GearSystem/"; private string[] _keyOptions; public override string CurDataKey { get; set; } public override string[] GetDataKeyOptions() { return _keyOptions ??= ConfigUtil.Instance.GetFileNames(DataPath); } public override void Load() { if (string.IsNullOrEmpty(CurDataKey)) { Debug.Log("配置项名称为空"); return; } if (!ConfigUtil.Instance.TryLoadConfig(DataPath + CurDataKey, out var data)) { Debug.Log("没有找到配置项"); return; } #if UNITY_EDITOR // 现将当前配置保存为temp避免丢失 if (CurDataKey != "temp.json") { SaveByKey("temp.json"); } #endif LoadByData(data); } private void LoadByData(GearSystemData gearSystemData) { // 先清除 var shaftRoot = transform.Find("Shafts"); var shaftsObj = shaftRoot.GetComponentsInChildren(); foreach (var oldShaft in shaftsObj) { #if UNITY_EDITOR DestroyImmediate(oldShaft.gameObject); #else Destory(oldShaft.gameObject); #endif } // 再添加 foreach (var shaftData in gearSystemData.shaftLevelDataArray) { var newShaft = Instantiate(shaftPrefab, shaftRoot).GetComponent(); newShaft.Load(shaftData); } } public override void Save() { if (string.IsNullOrEmpty(CurDataKey)) return; SaveByKey(CurDataKey); if (!_keyOptions.Contains(CurDataKey)) { // 重新读取key _keyOptions = ConfigUtil.Instance.GetFileNames(DataPath); } } private void SaveByKey(string key) { var shaftsObj = transform.Find("Shafts").GetComponentsInChildren(); var shaftDataArray = new ShaftLevelData[shaftsObj.Length]; for (int i = 0; i < shaftDataArray.Length; i++) { shaftDataArray[i] = shaftsObj[i].Save(); } var data = new GearSystemData { shaftLevelDataArray = shaftDataArray }; ConfigUtil.Instance.SaveConfig(data, DataPath + key); } public void AddShaft() { var shaftRoot = transform.Find("Shafts"); Instantiate(shaftPrefab, shaftRoot); } #endregion } [Serializable] public struct GearSystemData { public ShaftLevelData[] shaftLevelDataArray; } }