using Convention; using Demo.Game.Attr; using System; using System.Collections; using System.IO; using Unity.Collections; using UnityEngine; using UnityEngine.Rendering; namespace Demo.Game { namespace ConfigType { public class DDTConfig : ScriptLoadableConfig { [Content] public NativeArray Datas = new(128, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); [Content] public int Count = 0; public override void Deserialize(BinaryReader reader) { BinarySerializeUtility.DeserializeNativeArray(reader, ref Datas); Count = Datas.Length; base.Deserialize(reader); } public override void Serialize(BinaryWriter writer) { var newArray = new NativeArray(Count, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); NativeArray.Copy(Datas, newArray, Count); Datas = newArray; BinarySerializeUtility.SerializeNativeArray(writer, Datas); base.Serialize(writer); } } } [Scriptable] public class DDT : ScriptableObject { protected override ConfigType.ScriptLoadableConfig MakeConfig() { return new ConfigType.DDTConfig(); } protected override bool IsSelfEnableUpdate => false; public static DDT Make() { return new GameObject().AddComponent(); } [Convention.RScript.Variable.Attr.Method] public void Add(float value) { int Count = GetConfig().Count; if (Count >= GetConfig().Datas.Length) GetConfig().Datas.ResizeArray(Mathf.FloorToInt(Count * 1.5f)); GetConfig().Datas[Count] = value; GetConfig().Count++; } [Convention.RScript.Variable.Attr.Method] public void Add(int barSplitTimes, int barCount, int tickCount) { Add((barCount + tickCount / (float)barSplitTimes) * OneBarTime); } [Convention.RScript.Variable.Attr.Method] public float At(int index) { int Count = GetConfig().Count; if (index < 0) index = Count + index; if (index < 0 || index >= Count) throw new IndexOutOfRangeException($"{index} is out of [0, {Count})"); return GetConfig().Datas[index]; } [Convention.RScript.Variable.Attr.Method] public int GetCount() { return GetConfig().Count; } private void OnDestroy() { if (GetConfig().Datas.IsCreated) GetConfig().Datas.Dispose(); } #region Serialize protected override bool IsImptSerialize => true; protected override IEnumerator CreateAndLoadingImptCacheFile(ToolFile scriptFile, ToolFile cacheFile) { yield return this.ParseScript2Expr(scriptFile.LoadAsText()); using var stream = File.OpenWrite(cacheFile.GetFullPath()); using var writer = new BinaryWriter(stream); writer.Write(GetConfig().Count); for (int i = 0, e = GetConfig().Count; i < e; i++) { writer.Write(GetConfig().Datas[i]); } } protected override IEnumerator LoadFromImptCacheFile(ToolFile cacheFile) { using var stream = File.OpenRead(cacheFile.GetFullPath()); using var reader = new BinaryReader(stream); GetConfig().Count = reader.ReadInt32(); GetConfig().Datas.ResizeArray(Mathf.Max(128, GetConfig().Count)); for (int i = 0, e = GetConfig().Count; i < e; i++) { GetConfig().Datas[i] = reader.ReadSingle(); } yield break; } #endregion } }