mirror of
https://github.com/DCFApixels/DragonECS-Unity.git
synced 2025-09-18 18:14:35 +08:00
76 lines
2.8 KiB
C#
76 lines
2.8 KiB
C#
![]() |
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|