mirror of
https://github.com/DCFApixels/DragonECS-Unity.git
synced 2025-09-17 17:34:34 +08:00
137 lines
4.0 KiB
C#
137 lines
4.0 KiB
C#
using DCFApixels.DragonECS.Unity;
|
|
using DCFApixels.DragonECS.Unity.Internal;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace DCFApixels.DragonECS
|
|
{
|
|
[DisallowMultipleComponent]
|
|
[AddComponentMenu(EcsConsts.FRAMEWORK_NAME + "/" + nameof(EcsRootUnity), 30)]
|
|
public class EcsRootUnity : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private bool _enablePipelineDebug = true;
|
|
[SerializeField]
|
|
private ScriptablePipelineTemplateBase[] _scriptableTemplates;
|
|
[SerializeField]
|
|
private MonoPipelineTemplateBase[] _monoTemplates;
|
|
|
|
private EcsPipeline _pipeline;
|
|
|
|
public IEnumerable<ScriptablePipelineTemplateBase> ScriptableTemplates
|
|
{
|
|
get { return _scriptableTemplates; }
|
|
}
|
|
public IEnumerable<MonoPipelineTemplateBase> MonoTemplates
|
|
{
|
|
get { return _monoTemplates; }
|
|
}
|
|
public EcsPipeline Pipeline
|
|
{
|
|
get { return _pipeline; }
|
|
}
|
|
public bool IsInit
|
|
{
|
|
get { return _pipeline != null && _pipeline.IsInit; }
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
var pipelineBuilder = EcsPipeline.New();
|
|
foreach (var template in _scriptableTemplates)
|
|
{
|
|
if (template == null) { continue; }
|
|
pipelineBuilder.Add(template);
|
|
}
|
|
foreach (var template in _monoTemplates)
|
|
{
|
|
if (template == null) { continue; }
|
|
pipelineBuilder.Add(template);
|
|
}
|
|
#if UNITY_EDITOR
|
|
if (_enablePipelineDebug)
|
|
{
|
|
pipelineBuilder.Layers.Insert(EcsConsts.POST_END_LAYER, EcsUnityConsts.DEBUG_LAYER);
|
|
pipelineBuilder.AddUnique(new PipelineMonitorSystem(), EcsUnityConsts.DEBUG_LAYER);
|
|
}
|
|
#endif
|
|
_pipeline = pipelineBuilder.BuildAndInit();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
_pipeline.Run();
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
_pipeline.LateRun();
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
_pipeline.FixedRun();
|
|
}
|
|
|
|
private void OnDrawGizmos()
|
|
{
|
|
Gizmos.DrawIcon(transform.position, "", false);
|
|
_pipeline?.DrawGizmos();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
_pipeline.Destroy();
|
|
}
|
|
|
|
#region Editor
|
|
#if UNITY_EDITOR
|
|
[ContextMenu("Autoset")]
|
|
internal void Autoset_Editor()
|
|
{
|
|
Autoset(this);
|
|
}
|
|
[ContextMenu("Validate")]
|
|
internal void Validate_Editor()
|
|
{
|
|
_scriptableTemplates = _scriptableTemplates.Where(o => o != null).ToArray();
|
|
_monoTemplates = _monoTemplates.Where(o => o != null).ToArray();
|
|
EditorUtility.SetDirty(this);
|
|
}
|
|
|
|
private static void Autoset(EcsRootUnity target)
|
|
{
|
|
IEnumerable<MonoPipelineTemplateBase> result;
|
|
if (target.MonoTemplates != null && target.MonoTemplates.Count() > 0)
|
|
{
|
|
result = target.MonoTemplates.Where(o => o != null).Union(GetTemplatesFor(target.transform));
|
|
}
|
|
else
|
|
{
|
|
result = GetTemplatesFor(target.transform);
|
|
}
|
|
|
|
target._monoTemplates = result.ToArray();
|
|
EditorUtility.SetDirty(target);
|
|
}
|
|
private static IEnumerable<MonoPipelineTemplateBase> GetTemplatesFor(Transform parent)
|
|
{
|
|
IEnumerable<MonoPipelineTemplateBase> result = parent.GetComponents<MonoPipelineTemplateBase>();
|
|
for (int i = 0; i < parent.childCount; i++)
|
|
{
|
|
var child = parent.GetChild(i);
|
|
if (child.TryGetComponent<EcsRootUnity>(out _))
|
|
{
|
|
return Enumerable.Empty<MonoPipelineTemplateBase>();
|
|
}
|
|
result = result.Concat(GetTemplatesFor(child));
|
|
}
|
|
return result;
|
|
}
|
|
#endif
|
|
#endregion
|
|
}
|
|
}
|