diff --git a/Assets/Scripts/Framework/DDT.cs b/Assets/Scripts/Framework/DDT.cs index e2efd2f..90223c4 100644 --- a/Assets/Scripts/Framework/DDT.cs +++ b/Assets/Scripts/Framework/DDT.cs @@ -14,7 +14,8 @@ namespace Demo.Game { public class DDTConfig : ScriptLoadableConfig { - public NativeArray Datas = new(128, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); + [Content] public NativeArray Datas = new(128, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); + [Content] public int Count = 0; public override void Deserialize(BinaryReader reader) { @@ -33,22 +34,25 @@ namespace Demo.Game [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(); } - public NativeArray Datas = new(128, Allocator.Persistent, NativeArrayOptions.UninitializedMemory); - public int Count { get; private set; } = 0; [Convention.RScript.Variable.Attr.Method] public void Add(float value) { - if (Count >= Datas.Length) - Datas.ResizeArray(Mathf.FloorToInt(Count * 1.5f)); - Datas[Count] = value; - Count++; + 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] @@ -60,27 +64,24 @@ namespace Demo.Game [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 Datas[index]; + return GetConfig().Datas[index]; } - /// - /// ��ȡ���ݳ��� - /// - /// [Convention.RScript.Variable.Attr.Method] public int GetCount() { - return Count; + return GetConfig().Count; } private void OnDestroy() { - if (Datas.IsCreated) - Datas.Dispose(); + if (GetConfig().Datas.IsCreated) + GetConfig().Datas.Dispose(); } #region Serialize @@ -91,36 +92,25 @@ namespace Demo.Game yield return this.ParseScript2Expr(scriptFile.LoadAsText()); using var stream = File.OpenWrite(cacheFile.GetFullPath()); using var writer = new BinaryWriter(stream); - writer.Write(Count); - for (int i = 0; i < Count; i++) + writer.Write(GetConfig().Count); + for (int i = 0, e = GetConfig().Count; i < e; i++) { - writer.Write(Datas[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); - Count = reader.ReadInt32(); - Datas.ResizeArray(Mathf.Max(128, Count)); - for (int i = 0; i < Count; i++) + GetConfig().Count = reader.ReadInt32(); + GetConfig().Datas.ResizeArray(Mathf.Max(128, GetConfig().Count)); + for (int i = 0, e = GetConfig().Count; i < e; i++) { - Datas[i] = reader.ReadSingle(); + GetConfig().Datas[i] = reader.ReadSingle(); } yield break; } #endregion - -#if UNITY_EDITOR - [Setting, SerializeField] private List d_Datas = new(); - protected override IEnumerator DoSomethingDuringApplyScript() - { - yield return base.DoSomethingDuringApplyScript(); - for (int i = 0; i < Count; i++) - d_Datas.Add(Datas[i]); - } - -#endif } } diff --git a/Assets/Scripts/Framework/GameContent/GameController.cs b/Assets/Scripts/Framework/GameContent/GameController.cs index 4f8f324..a5da736 100644 --- a/Assets/Scripts/Framework/GameContent/GameController.cs +++ b/Assets/Scripts/Framework/GameContent/GameController.cs @@ -206,29 +206,29 @@ namespace Demo.Game var projectHashFile = cacheDir | "projectHash.json"; Dictionary projectHash = new(); bool isRecompile = true; - if(!!projectHashFile) + if (!!projectHashFile) { projectHash = projectHashFile.LoadAsJson>(); - foreach (var (file,md5) in projectHash) + foreach (var (file, md5) in projectHash) { - if(new ToolFile(file).CalculateHash()!=md5) + if (new ToolFile(file).CalculateHash() != md5) { isRecompile = true; break; } } } - var rootGameObject = new GameObject(rootObject.GetName(true)).AddComponent(); - MainObject = rootGameObject; - rootGameObject.transform.SetParent(transform); - rootGameObject.ScriptName = rootObject.GetName(true); - rootGameObject.audioSystem = MainAudio; - rootGameObject.LoadedScriptSet.Add(rootObject); - rootGameObject.EnableScript(content.RootSourceDir, this); - rootGameObject.SetContent(nameof(SongOffset), SongOffset); - rootGameObject.SetContent(nameof(IsAutoPlay), IsAutoPlay ? 1 : 0); - rootGameObject.SetContent("SongLength", MainAudio.CurrentClip.length); - if (isRecompile||true) + var rootGameObject = new GameObject(rootObject.GetName(true)).AddComponent(); + MainObject = rootGameObject; + rootGameObject.transform.SetParent(transform); + rootGameObject.ScriptName = rootObject.GetName(true); + rootGameObject.audioSystem = MainAudio; + rootGameObject.LoadedScriptSet.Add(rootObject); + rootGameObject.EnableScript(content.RootSourceDir, this); + rootGameObject.SetContent(nameof(SongOffset), SongOffset); + rootGameObject.SetContent(nameof(IsAutoPlay), IsAutoPlay ? 1 : 0); + rootGameObject.SetContent("SongLength", MainAudio.CurrentClip.length); + if (isRecompile || true) { static IEnumerator Foo(IEnumerator ir) { @@ -271,20 +271,26 @@ namespace Demo.Game } NDFS(rootGameObject); yield return new WaitUntil(() => applyDownCount == 0); + projectHash.Clear(); foreach (var path in rootGameObject.LoadedScriptSet) { projectHash.Add(path, new ToolFile(path).CalculateHash()); } + // 哈希缓存 projectHashFile.SaveAsJson(projectHash); + // 编译结果 + var projectBinaryFile = cacheDir | "project.dat"; + using var stream = new FileInfo(projectBinaryFile).OpenWrite(); + using var writer = new BinaryWriter(stream); + rootGameObject.Config.Serialize(writer); } else { + // 加载 var projectBinaryFile = cacheDir | "project.dat"; using var stream = new FileInfo(projectBinaryFile).OpenRead(); using var reader = new BinaryReader(stream); - - - + rootGameObject.Config.Deserialize(reader); } float loadRootObjectEndTime = Time.realtimeSinceStartup; float loadRootObjectElapsed = (loadRootObjectEndTime - loadRootObjectStartTime) * 1000f; diff --git a/Assets/Scripts/Framework/ScriptableObject.cs b/Assets/Scripts/Framework/ScriptableObject.cs index 85eaca2..e62660d 100644 --- a/Assets/Scripts/Framework/ScriptableObject.cs +++ b/Assets/Scripts/Framework/ScriptableObject.cs @@ -44,7 +44,7 @@ namespace Demo.Game [Setting] public string ScriptName = ""; private string[] ChildTypes = null; - public ScriptLoadableConfig[] childs = null; + private ScriptLoadableConfig[] childs = null; [Setting] public ScriptableObject target; @@ -77,6 +77,7 @@ namespace Demo.Game BinarySerializeUtility.WriteBool(writer, IsSetObjectDisable); BinarySerializeUtility.WriteInt(writer, UpdatePerFrame); BinarySerializeUtility.WriteString(writer, ScriptName); + childs = (from child in target.Childs select child.Config).ToArray(); ChildTypes = (from child in childs select child.GetType().Name).ToArray(); BinarySerializeUtility.SerializeArray(writer, ChildTypes); foreach (var child in childs) @@ -122,10 +123,6 @@ namespace Demo.Game { return (ConfigT)Config; } - public virtual void UpdateConfig() - { - Config.childs = (from child in this.Childs select child.Config).ToArray(); - } /// /// 设置坐标 @@ -654,7 +651,6 @@ namespace Demo.Game if (this.ScriptableObjectContents.IsCreated) this.ScriptableObjectContents.Dispose(); } - UpdateConfig(); IsScriptApply = true; }