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 ScriptableTemplates { get { return _scriptableTemplates; } } public IEnumerable 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 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 GetTemplatesFor(Transform parent) { IEnumerable result = parent.GetComponents(); for (int i = 0; i < parent.childCount; i++) { var child = parent.GetChild(i); if (child.TryGetComponent(out _)) { return Enumerable.Empty(); } result = result.Concat(GetTemplatesFor(child)); } return result; } #endif #endregion } }