Files
aibis-dream/Assets/Scripts/MiniGame/Gear/GearSystem.cs
T
2024-12-27 22:40:33 +08:00

230 lines
6.7 KiB
C#

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
public Vector3 coverUpPos;
public Vector3 coverDownPos;
private ShaftGraph _shaftGraph;
private void Awake()
{
Init();
}
#region 生命周期管理
public void Init()
{
FixSystemCenter.SystemDic.Register(this);
_shafts = GetComponentsInChildren<Shaft>();
_cover = transform.Find("Cover").GetComponent<SpriteRenderer>();
_coverStick = transform.Find("Cover Stick");
}
public void Start()
{
_shaftGraph = new ShaftGraph(_shafts);
}
#endregion
/// <summary>
/// 判断吸附位置
/// </summary>
/// <param name="pos">齿轮当前位置</param>
/// <param name="gearRadius">齿轮半径</param>
/// <returns>能够被吸附的轴</returns>
public Shaft CheckClosestShaft(Vector3 pos, float gearRadius)
{
return _shaftGraph.QuerySnapShaft(pos, gearRadius);
}
/// <summary>
/// 判断齿轮能不能放进轴内
/// </summary>
/// <param name="sourceShaft">当前轴</param>
/// <param name="gearRadius">齿轮半径</param>
/// <returns>是否可用</returns>
public bool CheckGearSuitable(Shaft sourceShaft, float gearRadius)
{
return _shaftGraph.CheckGearSuitable(sourceShaft, gearRadius);
}
/// <summary>
/// 生成齿轮
/// </summary>
/// <param name="pos">位置</param>
/// <param name="radius">半径</param>
/// <param name="sprite">齿轮图片</param>
/// <param name="isBroken">齿轮已损坏</param>
/// <returns>齿轮Obj</returns>
public GameObject InitGear(Vector3 pos, float radius, Sprite sprite, bool isBroken = false)
{
GameObject gearObj = Instantiate(gearPrefab, pos, Quaternion.identity);
gearObj.transform.parent = transform.Find("Gears").transform;
Gear gear = gearObj.GetComponent<Gear>();
gear.radius = radius;
gear.gearSprite = sprite;
gear.isBroken = isBroken;
return gearObj;
}
/// <summary>
/// 某个轴上齿轮发生变化时更新临接关系
/// </summary>
/// <param name="shaftId">轴ID</param>
public void ChangeGraphVertex(int shaftId)
{
_shaftGraph?.ChangeVertex(shaftId);
}
public void Succeed()
{
Debug.Log("达成目标");
}
public IEnumerator OpenCover()
{
// 旋转拉杆
yield return _coverStick.DORotate(new Vector3(0, 0, -90), 1.5f).WaitForCompletion();
// 开盖
var sq = DOTween.Sequence();
sq.Join(_cover.transform.DOLocalMove(coverUpPos, 1.5f));
sq.Join(_cover.DOFade(0, 1.5f));
yield return sq.WaitForCompletion();
}
public IEnumerator CloseCover()
{
// 关盖
var sq = DOTween.Sequence();
sq.Join(_cover.transform.DOLocalMove(coverDownPos, 1.5f));
sq.Join(_cover.DOFade(1, 1.5f));
yield return sq.WaitForCompletion();
// 旋转拉杆
yield return _coverStick.DORotate(new Vector3(0, 0, 0), 1.5f).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<GearSystemData>(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<Shaft>();
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<Shaft>();
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<Shaft>();
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;
}
}