From 250b6b275f5c39b91a28349a4a4696189d0e4f21 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 26 Jun 2024 01:35:57 +0800 Subject: [PATCH] add EcsPipelineTemplateSO --- src/EcsPipelineTemplate.meta | 8 ++ .../EcsPipelineTemplateSO.cs | 75 +++++++++++++++++++ .../EcsPipelineTemplateSO.cs.meta | 11 +++ .../EcsPipelineTemplateSOEditor.cs | 13 ++++ .../EcsPipelineTemplateSOEditor.cs.meta | 11 +++ 5 files changed, 118 insertions(+) create mode 100644 src/EcsPipelineTemplate.meta create mode 100644 src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs create mode 100644 src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs.meta create mode 100644 src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs create mode 100644 src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs.meta diff --git a/src/EcsPipelineTemplate.meta b/src/EcsPipelineTemplate.meta new file mode 100644 index 0000000..aaa3705 --- /dev/null +++ b/src/EcsPipelineTemplate.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53368cba894a53d4a9f3a4bf5a5b484a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs b/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs new file mode 100644 index 0000000..ce24694 --- /dev/null +++ b/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs @@ -0,0 +1,75 @@ +using System; +using UnityEngine; + +namespace DCFApixels.DragonECS +{ + [CreateAssetMenu(fileName = nameof(EcsPipelineTemplateSO), menuName = EcsConsts.FRAMEWORK_NAME + "/" + nameof(EcsPipelineTemplateSO), order = 1)] + public class EcsPipelineTemplateSO : ScriptableObject, IEcsModule + { + private string[] _layers; + private SystemRecord[] _systems; + void IEcsModule.Import(EcsPipeline.Builder b) + { + b.Layers.MergeWith(_layers); + foreach (var s in _systems) + { + if (s.system == null) { continue; } + + int? sortOrder = s.isCustomSortOrder ? s.sortOrder : default(int?); + if (s.isUnique) + { + b.AddUnique(s.system, s.layer, sortOrder); + } + else + { + b.Add(s.system, s.layer, sortOrder); + } + } + } + + public EcsPipelineTemplate GenerateSerializableTemplate() + { + EcsPipelineTemplate result = new EcsPipelineTemplate(); + result.layers = new string[_layers.Length]; + Array.Copy(_layers, result.layers, _layers.Length); + result.systems = new EcsPipelineTemplate.SystemRecord[_systems.Length]; + for (int i = 0; i < result.systems.Length; i++) + { + ref var s = ref _systems[i]; + result.systems[i] = new EcsPipelineTemplate.SystemRecord(s.system, s.layer, s.NullableSortOrder, s.isUnique); + } + return result; + } + + public void SetFromSerializableTemplate(EcsPipelineTemplate template) + { + _layers = new string[template.layers.Length]; + Array.Copy(template.layers, _layers, template.layers.Length); + _systems = new SystemRecord[template.systems.Length]; + for (int i = 0; i < _systems.Length; i++) + { + ref var s = ref template.systems[i]; + _systems[i] = new SystemRecord(s.system, s.layer, s.NullableSortOrder, s.isUnique); + } + } + + public struct SystemRecord + { + [SerializeReference] + public IEcsProcess system; + public string layer; + public int sortOrder; + public bool isCustomSortOrder; + public bool isUnique; + public int? NullableSortOrder { get { return isCustomSortOrder ? sortOrder : default(int?); } } + public SystemRecord(IEcsProcess system, string layer, int? sortOrder, bool isUnique) + { + this.system = system; + this.layer = layer; + this.sortOrder = sortOrder.HasValue ? sortOrder.Value : 0; + isCustomSortOrder = sortOrder.HasValue; + this.isUnique = isUnique; + } + } + } +} diff --git a/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs.meta b/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs.meta new file mode 100644 index 0000000..8f90874 --- /dev/null +++ b/src/EcsPipelineTemplate/EcsPipelineTemplateSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db10fad6d6096f54b9ad5752029c2a79 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs b/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs new file mode 100644 index 0000000..d64bb4c --- /dev/null +++ b/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs @@ -0,0 +1,13 @@ +#if UNITY_EDITOR +using UnityEngine; +using UnityEditor; + +namespace DCFApixels.DragonECS.Unity.Editors +{ + //[CustomEditor(typeof(EcsPipelineTemplateSO))] + //internal class EcsPipelineTemplateSOEditor + //{ + // + //} +} +#endif \ No newline at end of file diff --git a/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs.meta b/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs.meta new file mode 100644 index 0000000..b097106 --- /dev/null +++ b/src/EcsPipelineTemplate/EcsPipelineTemplateSOEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8971a683bb906a944bbd2b373274c3b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: