2024-06-30 01:12:21 +08:00
|
|
|
|
using DCFApixels.DragonECS.Unity.Internal;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2024-06-26 01:35:57 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace DCFApixels.DragonECS
|
|
|
|
|
{
|
|
|
|
|
[CreateAssetMenu(fileName = nameof(EcsPipelineTemplateSO), menuName = EcsConsts.FRAMEWORK_NAME + "/" + nameof(EcsPipelineTemplateSO), order = 1)]
|
|
|
|
|
public class EcsPipelineTemplateSO : ScriptableObject, IEcsModule
|
|
|
|
|
{
|
2024-06-30 01:12:21 +08:00
|
|
|
|
private static string[] _defaultLayers = new string[]
|
|
|
|
|
{
|
|
|
|
|
EcsConsts.PRE_BEGIN_LAYER,
|
|
|
|
|
EcsConsts.BEGIN_LAYER,
|
|
|
|
|
EcsConsts.BASIC_LAYER,
|
|
|
|
|
EcsConsts.END_LAYER,
|
|
|
|
|
EcsConsts.POST_END_LAYER,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
[SerializeField]
|
|
|
|
|
private string[] _layers = _defaultLayers.ToArray();
|
|
|
|
|
|
|
|
|
|
[SerializeField]
|
2024-09-08 21:36:24 +08:00
|
|
|
|
private Record[] _systems;
|
2024-06-30 01:12:21 +08:00
|
|
|
|
|
|
|
|
|
[SerializeField]
|
|
|
|
|
[SerializeReference]
|
|
|
|
|
[ReferenceButton]
|
|
|
|
|
private IEcsModule[] _modules;
|
|
|
|
|
|
2024-06-26 01:35:57 +08:00
|
|
|
|
void IEcsModule.Import(EcsPipeline.Builder b)
|
|
|
|
|
{
|
|
|
|
|
b.Layers.MergeWith(_layers);
|
|
|
|
|
foreach (var s in _systems)
|
|
|
|
|
{
|
2024-09-08 21:36:24 +08:00
|
|
|
|
if (s.target == null) { continue; }
|
2024-06-26 01:35:57 +08:00
|
|
|
|
|
2024-09-08 21:36:24 +08:00
|
|
|
|
b.Add(s.target, s.parameters);
|
2024-06-26 01:35:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public EcsPipelineTemplate GenerateSerializableTemplate()
|
|
|
|
|
{
|
|
|
|
|
EcsPipelineTemplate result = new EcsPipelineTemplate();
|
|
|
|
|
result.layers = new string[_layers.Length];
|
|
|
|
|
Array.Copy(_layers, result.layers, _layers.Length);
|
2024-09-08 21:36:24 +08:00
|
|
|
|
result.systems = new EcsPipelineTemplate.AddCommand[_systems.Length];
|
2024-06-26 01:35:57 +08:00
|
|
|
|
for (int i = 0; i < result.systems.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
ref var s = ref _systems[i];
|
2024-09-08 21:36:24 +08:00
|
|
|
|
result.systems[i] = new EcsPipelineTemplate.AddCommand(s.target, s.parameters);
|
2024-06-26 01:35:57 +08:00
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetFromSerializableTemplate(EcsPipelineTemplate template)
|
|
|
|
|
{
|
|
|
|
|
_layers = new string[template.layers.Length];
|
|
|
|
|
Array.Copy(template.layers, _layers, template.layers.Length);
|
2024-09-08 21:36:24 +08:00
|
|
|
|
_systems = new Record[template.systems.Length];
|
2024-06-26 01:35:57 +08:00
|
|
|
|
for (int i = 0; i < _systems.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
ref var s = ref template.systems[i];
|
2024-09-08 21:36:24 +08:00
|
|
|
|
_systems[i] = new Record(s.target, s.parameters);
|
2024-06-26 01:35:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-30 01:12:21 +08:00
|
|
|
|
public void Validate()
|
|
|
|
|
{
|
|
|
|
|
ValidateLayers();
|
|
|
|
|
ValidateSystems();
|
|
|
|
|
}
|
|
|
|
|
private void ValidateLayers()
|
|
|
|
|
{
|
|
|
|
|
Dictionary<string, int> builtinLayerIndexes = new Dictionary<string, int>();
|
|
|
|
|
foreach (var item in _defaultLayers)
|
|
|
|
|
{
|
|
|
|
|
builtinLayerIndexes.Add(item, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<string> newLayers = _layers.Distinct().ToList();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < newLayers.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
var layer = newLayers[i];
|
|
|
|
|
if (builtinLayerIndexes.ContainsKey(layer))
|
|
|
|
|
{
|
|
|
|
|
builtinLayerIndexes[layer] = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int lastNewLayersCount = newLayers.Count;
|
|
|
|
|
foreach (var pair in builtinLayerIndexes)
|
|
|
|
|
{
|
|
|
|
|
if(pair.Value < 0)
|
|
|
|
|
{
|
|
|
|
|
newLayers.Add(pair.Key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (int i = lastNewLayersCount; i < newLayers.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
builtinLayerIndexes[newLayers[i]] = i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
foreach (var pair in builtinLayerIndexes.OrderBy(o => o.Value))
|
|
|
|
|
{
|
|
|
|
|
newLayers[pair.Value] = _defaultLayers[i];
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_layers = newLayers.ToArray();
|
|
|
|
|
}
|
|
|
|
|
private void ValidateSystems()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
2024-09-08 21:36:24 +08:00
|
|
|
|
public struct Record
|
2024-06-26 01:35:57 +08:00
|
|
|
|
{
|
|
|
|
|
[SerializeReference]
|
2024-06-30 01:12:21 +08:00
|
|
|
|
[ReferenceButton]
|
2024-09-08 21:36:24 +08:00
|
|
|
|
public object target;
|
|
|
|
|
public AddParams parameters;
|
|
|
|
|
public Record(object target, AddParams parameters)
|
2024-06-26 01:35:57 +08:00
|
|
|
|
{
|
2024-09-08 21:36:24 +08:00
|
|
|
|
this.target = target;
|
|
|
|
|
this.parameters = parameters;
|
2024-06-26 01:35:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|