using System; using System.Linq; using AibisDream.FixSystem; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.Utility; using UnityEngine; namespace AibisDream { public class EngineSystem : SystemHasData { public static string DataPath = Application.streamingAssetsPath + "/LevelData/EngineSystem/"; [Header("系统配置")] [SerializeField] public EngineConfig config; [Header("系统数据")] [SerializeField] private EngineData engineData; private bool IsValid => engineData.isValid.Value; public event Action UpdateDashboard; private void Awake() { FixSystemCenter.SystemDic.Register(this); } private void OnEnable() { engineData = new EngineData(config.invalidTime); } private void Update() { // 更新部分按时间自然计算的指标 DataAutoChange(); // 更新看板 UpdateDashboard?.Invoke(engineData); } private void DataAutoChange() { // 自然减速 engineData.OilChange(-config.oilDownRatio); engineData.CalcAir(config.airMaxRatio, config.airMinRatio, config.baseAirMax); // 推算速度 engineData.CalcSpeed(config.acceleratedSpeed, config.resistance); } /// /// 加速过程 /// public void AddOil() { if (IsValid) { engineData.OilChange(config.oilUpRatio); } // 失效期无法加油门 } public void UpdateAirLevel(int curLevel) { engineData.UpdateAirLevel(curLevel, config.maxLevel); } #region 数据加载与保存 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; } config = data; } public override void Save() { if (string.IsNullOrEmpty(CurDataKey)) { Debug.Log("名称不为空"); return; } ConfigUtil.Instance.SaveConfig(config, DataPath + CurDataKey); if (!_keyOptions.Contains(CurDataKey)) { // 重新读取key _keyOptions = ConfigUtil.Instance.GetFileNames(DataPath); } } #endregion } [Serializable] public struct EngineConfig { public float oilDownRatio; public float oilUpRatio; public float acceleratedSpeed; public float resistance; public float airMaxRatio; public float airMinRatio; public float baseAirMax; public int maxLevel; public float invalidTime; } [Serializable] public struct EngineData { public float curSpeed; public float curOil; public float curAir; public float curAirMin; public float curAirMax; public int curAirLevel; public AutoFlipBool isValid; public bool inAirRange; public EngineData(float flipDelayTime) { isValid = new AutoFlipBool(flipDelayTime, true); curSpeed = 0; curOil = 0; curAir = 0; curAirMin = 0; curAirMax = 0; curAirLevel = 0; inAirRange = false; } public void OilChange(float oilChangeRatio) { curOil = CommonUtil.LimitedAdd(curOil, oilChangeRatio * Time.deltaTime, 1f, 0f); } public void CalcSpeed(float acceleratedSpeed, float resistance) { var addNum = inAirRange && isValid.Value ? (curOil * acceleratedSpeed - curSpeed * resistance) * Time.deltaTime : -curSpeed * resistance * Time.deltaTime; curSpeed = CommonUtil.LimitedAdd(curSpeed, addNum, 1f, 0f); } public void CalcAir(float airMaxRatio, float airMinRatio, float baseAirMax) { curAirMax = curSpeed * (curAirLevel + 1) * airMaxRatio + baseAirMax; curAirMin = curSpeed * (curAirLevel + 1) * airMinRatio; curAir = curOil; // 如果离开范围且当前在系统有效期,就进入一段失效期 var curInAirRange = curAir <= curAirMax && curAir >= curAirMin; if (inAirRange && !curInAirRange && isValid.Value) { isValid.Value = false; } } public void UpdateAirLevel(int level, int maxLevel) { curAirLevel = level; if (curAirLevel > maxLevel) { curAirLevel = maxLevel - 1; } if (curAirLevel < 0) { curAirLevel = 0; } } } }