From 3714fa87e74ccc0f1e79863f34a3917b5621aa1a Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Wed, 17 Dec 2025 17:55:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E8=BF=9B=E8=A1=8C=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=AD=97=E6=AE=B5=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Framework/ScriptableObject.cs | 96 +++++++++++++------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/Assets/Scripts/Framework/ScriptableObject.cs b/Assets/Scripts/Framework/ScriptableObject.cs index fe84d1f..85eaca2 100644 --- a/Assets/Scripts/Framework/ScriptableObject.cs +++ b/Assets/Scripts/Framework/ScriptableObject.cs @@ -34,21 +34,19 @@ namespace Demo.Game namespace ConfigType { + [Serializable] public class ScriptLoadableConfig { - public int UID = -1; - public Vector3 EnterGameLocalPosition, EnterGameEulerAngles, EnterGameLocalScaling; - public bool IsSetObjectDisable; - public int UpdatePerFrame; - public int ScriptUpdateCounter; - public string ScriptName; - private string[] ChildTypes; - public ScriptLoadableConfig[] childs; + [Content] public int UID = -1; + [Content] public Vector3 EnterGameLocalPosition = Vector3.zero, EnterGameEulerAngles = Vector3.zero, EnterGameLocalScaling = Vector3.zero; + [Content] public bool IsSetObjectDisable = false; + [Content] public int UpdatePerFrame = 1; - public readonly static Dictionary> ConfigGeneraters = new() - { - { nameof(ScriptLoadableConfig), ()=>new ScriptLoadableConfig() }, - }; + [Setting] public string ScriptName = ""; + private string[] ChildTypes = null; + public ScriptLoadableConfig[] childs = null; + + [Setting] public ScriptableObject target; public virtual void Deserialize(BinaryReader reader) { @@ -58,14 +56,15 @@ namespace Demo.Game EnterGameLocalScaling = BinarySerializeUtility.ReadVec3(reader); IsSetObjectDisable = BinarySerializeUtility.ReadBool(reader); UpdatePerFrame = BinarySerializeUtility.ReadInt(reader); - ScriptUpdateCounter = BinarySerializeUtility.ReadInt(reader); ScriptName = BinarySerializeUtility.ReadString(reader); ChildTypes = BinarySerializeUtility.DeserializeStringArray(reader); int childCount = ChildTypes.Length; childs = new ScriptLoadableConfig[childCount]; for (int i = 0; i < childCount; i++) { - childs[i] = ConfigGeneraters[ChildTypes[i]].Invoke(); + var scriptObject = DefaultInstantiate.GetScriptableObjectInstantiate()[ChildTypes[i]].Invoke(); + scriptObject.EnableScript(target); + childs[i] = scriptObject.Config; childs[i].Deserialize(reader); } } @@ -77,8 +76,8 @@ namespace Demo.Game BinarySerializeUtility.WriteVec3(writer, EnterGameLocalScaling); BinarySerializeUtility.WriteBool(writer, IsSetObjectDisable); BinarySerializeUtility.WriteInt(writer, UpdatePerFrame); - BinarySerializeUtility.WriteInt(writer, ScriptUpdateCounter); BinarySerializeUtility.WriteString(writer, ScriptName); + ChildTypes = (from child in childs select child.GetType().Name).ToArray(); BinarySerializeUtility.SerializeArray(writer, ChildTypes); foreach (var child in childs) { @@ -101,13 +100,32 @@ namespace Demo.Game /// public partial class ScriptableObject { - [Content, SerializeField] - private Vector3 - EnterGameLocalPosition = Vector3.zero, - EnterGameEulerAngles = Vector3.zero, - EnterGameLocalScaling = Vector3.one; - [Content, SerializeField] private bool IsSetObjectDisable = false; - [Content] public int UpdatePerFrame = 1; + protected virtual ConfigType.ScriptLoadableConfig MakeConfig() + { + return new ConfigType.ScriptLoadableConfig(); + } + [Setting, SerializeField] private ConfigType.ScriptLoadableConfig m_Config = null; + public ConfigType.ScriptLoadableConfig Config + { + // 懒加载生成Config + get + { + if (m_Config == null) + { + m_Config = MakeConfig(); + m_Config.target = this; + } + return m_Config; + } + } + public ConfigT GetConfig() where ConfigT : ConfigType.ScriptLoadableConfig + { + return (ConfigT)Config; + } + public virtual void UpdateConfig() + { + Config.childs = (from child in this.Childs select child.Config).ToArray(); + } /// /// 设置坐标 @@ -118,7 +136,7 @@ namespace Demo.Game [Convention.RScript.Variable.Attr.Method] public void SetLocalPosition(float x, float y, float z) { - EnterGameLocalPosition = new(x, y, z); + Config.EnterGameLocalPosition = new(x, y, z); } /// /// 设置欧拉角 @@ -129,7 +147,7 @@ namespace Demo.Game [Convention.RScript.Variable.Attr.Method] public void SetLocalEulerAngles(float x, float y, float z) { - EnterGameEulerAngles = new(x, y, z); + Config.EnterGameEulerAngles = new(x, y, z); } /// /// 设置缩放 @@ -140,7 +158,7 @@ namespace Demo.Game [Convention.RScript.Variable.Attr.Method] public void SetLocalScaling(float x, float y, float z) { - EnterGameLocalScaling = new(x, y, z); + Config.EnterGameLocalScaling = new(x, y, z); } /// @@ -150,7 +168,7 @@ namespace Demo.Game [Convention.RScript.Variable.Attr.Method] public void SetObjectDisable() { - IsSetObjectDisable = true; + Config.IsSetObjectDisable = true; } /// @@ -161,15 +179,15 @@ namespace Demo.Game [Convention.RScript.Variable.Attr.Method] public void SetUpdatePerFrame(int frame) { - UpdatePerFrame = Mathf.Max(1, frame); + Config.UpdatePerFrame = Mathf.Max(1, frame); } private void ScriptableObjectDoReset() { - transform.localPosition = EnterGameLocalPosition; - transform.localEulerAngles = EnterGameEulerAngles; - transform.localScale = EnterGameLocalScaling; - gameObject.SetActive(IsSetObjectDisable == false); + transform.localPosition = Config.EnterGameLocalPosition; + transform.localEulerAngles = Config.EnterGameEulerAngles; + transform.localScale = Config.EnterGameLocalScaling; + gameObject.SetActive(Config.IsSetObjectDisable == false); } } @@ -211,7 +229,11 @@ namespace Demo.Game public static float OneBarTime = 60; private bool isEnableScript = false; - public string ScriptName = ""; + public string ScriptName + { + get => Config.ScriptName; + set => Config.ScriptName = value; + } private string s_ScriptType = null; public string m_ScriptType { @@ -318,7 +340,7 @@ namespace Demo.Game return result; } - public void EnableScript(ScriptableObject parent) + public void EnableScript(ScriptableObject parent,int uid = -1) { if (isEnableScript) { @@ -342,7 +364,10 @@ namespace Demo.Game isEnableScript = true; // 只有RootObject的parent会是空的 - GetRoot().PushLoadedScriptObject(this); + if (uid < 0) + Config.UID = GetRoot().PushLoadedScriptObject(this); + else + GetRoot().PushLoadedScriptObject(this, uid); if (parent != null) { MyHierarchyItem = parent.MyHierarchyItem.GetHierarchyItem().CreateSubPropertyItem(1)[0]; @@ -531,7 +556,7 @@ namespace Demo.Game else { // UpdateTicks - if (ScriptUpdateCounter % UpdatePerFrame == 0) + if (ScriptUpdateCounter % Config.UpdatePerFrame == 0) UpdateTicks(currentTime, deltaTime, tickType); ScriptUpdateCounter += tickType == TickType.Update ? 1 : 0; } @@ -629,6 +654,7 @@ namespace Demo.Game if (this.ScriptableObjectContents.IsCreated) this.ScriptableObjectContents.Dispose(); } + UpdateConfig(); IsScriptApply = true; }