Skip to content

Commit 3db0a6f

Browse files
committed
- Separated EntityTemplate functionality from Actor to new EntityTemplateProvider component
1 parent 327447e commit 3db0a6f

File tree

7 files changed

+103
-50
lines changed

7 files changed

+103
-50
lines changed

Entity System/Unity Layer/Actor.cs

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,6 @@ public Actor Root
8686
private Dictionary<Type, ActorComponent> _actorComponents = new Dictionary<Type, ActorComponent>();
8787
private readonly Dictionary<Type, object> _actorComponentsAndData = new();
8888

89-
[field: SerializeField]
90-
public EntityTemplateAsset EntityTemplate { get; private set; }
91-
9289
[SerializeField, ReadOnly]
9390
private List<ActorComponent> _allComponents = new List<ActorComponent>();
9491

@@ -572,7 +569,6 @@ int GetPriority(Component c)
572569
foreach (var component in _allComponents)
573570
component.SetActor(this);
574571

575-
EditorApplyEntityTemplate();
576572
EditorValidateAllComponentDependencies();
577573
ValidateSetup();
578574
EditorUpdateUnusedDependencies();
@@ -692,44 +688,7 @@ private void EditorValidateActorComponentsDependencies()
692688
EditorUpdateMissingActorDependenciesList();
693689
}
694690

695-
private void EditorApplyEntityTemplate()
696-
{
697-
if (EntityTemplate == null)
698-
return;
699-
700-
var componentTypes = EntityTemplate.GetComponentTypes();
701-
702-
List<Type> providersToAdd = new List<Type>();
703-
704-
foreach (var type in componentTypes)
705-
{
706-
Type providerType = EntityComponentProviderFinder.FindEntityComponentProviderMatching(type);
707-
708-
if (providerType != null)
709-
{
710-
if (_allComponents.Exists(c => c.GetType() == providerType))
711-
continue;
712-
if (_entityComponentsMissing.Exists(c => c.GetType() == type))
713-
continue;
714-
715-
providersToAdd.Add(providerType);
716-
}
717-
}
718-
719-
if (providersToAdd.Count > 0)
720-
{
721-
UnityEditor.EditorApplication.delayCall += () =>
722-
{
723-
if (this == null) return;
724-
725-
foreach (var provider in providersToAdd)
726-
if (gameObject.GetComponent(provider) == null)
727-
UnityEditor.Undo.AddComponent(gameObject, provider);
728-
729-
UnityEditor.EditorUtility.SetDirty(gameObject);
730-
};
731-
}
732-
}
691+
733692

734693
public List<string> EditorGetMissingDependenciesNamesForAllComponents(EditorDependenciesType dependenciesType)
735694
{
@@ -880,11 +839,8 @@ public List<ActorComponent> EditorGetUnusedActorComponentsForComponent(ActorComp
880839

881840
public bool EditorHasUnusedDependencies() => _editorUnusedDependencies.Count > 0;
882841

883-
public void EditorSetEntityTemplate(EntityTemplateAsset entityTemplateAsset)
884-
{
885-
EntityTemplate = entityTemplateAsset;
886-
EditorApplyEntityTemplate();
887-
}
842+
public List<ActorComponent> EditorGetAllComponentsSerialized() => _allComponents;
843+
public List<IEntityComponent> EditorGetEntityComponentsMissingSerialized() => _entityComponentsMissing;
888844
#endif
889845
}
890846
}

Entity System/Unity Layer/EasyCSBehavior.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ private void EditorSortComponentOrder()
176176

177177
Component prefabRoot = GetComponent<PrefabRootData>();
178178
Component entityProvider = GetComponent<EntityProvider>();
179+
Component entityTemplateProvider = GetComponent<EntityTemplateProvider>();
179180
Component actor = GetComponent<Actor>();
180181

181182
// Collect categorized components
@@ -200,6 +201,7 @@ private void EditorSortComponentOrder()
200201
// Compose new sorted order
201202
if (prefabRoot) sorted.Add(prefabRoot);
202203
if (entityProvider) sorted.Add(entityProvider);
204+
if (entityTemplateProvider) sorted.Add(entityTemplateProvider);
203205
if (actor) sorted.Add(actor);
204206

205207
sorted.AddRange(actorData.Except(sorted));
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using TriInspector;
4+
using UnityEngine;
5+
6+
namespace EasyCS
7+
{
8+
[RequireComponent(typeof(Actor))]
9+
[IconClass(ConstantsIcons.IconEntity)]
10+
#if ODIN_INSPECTOR
11+
[HideMonoScript]
12+
#endif
13+
public class EntityTemplateProvider : EasyCSBehavior
14+
{
15+
[field: SerializeField]
16+
public EntityTemplateAsset EntityTemplate { get; private set; }
17+
18+
19+
#if UNITY_EDITOR
20+
protected override void OnValidate()
21+
{
22+
base.OnValidate();
23+
24+
EditorApplyEntityTemplate();
25+
}
26+
27+
private void EditorApplyEntityTemplate()
28+
{
29+
if (EntityTemplate == null)
30+
return;
31+
32+
Actor actor = GetComponent<Actor>();
33+
if (actor == null)
34+
return;
35+
36+
var componentTypes = EntityTemplate.GetComponentTypes();
37+
38+
List<Type> providersToAdd = new List<Type>();
39+
40+
foreach (var type in componentTypes)
41+
{
42+
Type providerType = EntityComponentProviderFinder.FindEntityComponentProviderMatching(type);
43+
44+
if (providerType != null)
45+
{
46+
var allComponents = actor.EditorGetAllComponentsSerialized();
47+
var entityComponentsMissing = actor.EditorGetEntityComponentsMissingSerialized();
48+
49+
if (allComponents.Exists(c => c.GetType() == providerType))
50+
continue;
51+
if (entityComponentsMissing.Exists(c => c.GetType() == type))
52+
continue;
53+
54+
providersToAdd.Add(providerType);
55+
}
56+
}
57+
58+
if (providersToAdd.Count > 0)
59+
{
60+
UnityEditor.EditorApplication.delayCall += () =>
61+
{
62+
if (this == null) return;
63+
64+
foreach (var provider in providersToAdd)
65+
if (gameObject.GetComponent(provider) == null)
66+
UnityEditor.Undo.AddComponent(gameObject, provider);
67+
68+
UnityEditor.EditorUtility.SetDirty(gameObject);
69+
};
70+
}
71+
}
72+
73+
public void EditorSetEntityTemplate(EntityTemplateAsset entityTemplateAsset)
74+
{
75+
EntityTemplate = entityTemplateAsset;
76+
EditorApplyEntityTemplate();
77+
}
78+
79+
#endif
80+
}
81+
}

Entity System/Unity Layer/EntityTemplateProvider.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Factory System/Editor/EntityPrefabBuilder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ public static GameObject BuildEntityObject(EntityData entityData, Transform curr
131131
{
132132
GameObject entityGO = current == null ? new GameObject() : current.gameObject;
133133
entityGO.AddComponent<EntityEditorComponentFlag>().hideFlags = HideFlags.HideInInspector;
134-
Actor actor= entityGO.AddComponent<Actor>();
134+
Actor actor = entityGO.AddComponent<Actor>();
135+
EntityTemplateProvider entityTemplateProvider = entityGO.AddComponent<EntityTemplateProvider>();
135136

136137
if (string.IsNullOrEmpty(entityData.Name) == false)
137138
entityGO.name = entityData.Name;
@@ -186,7 +187,7 @@ public static GameObject BuildEntityObject(EntityData entityData, Transform curr
186187
}
187188
}
188189

189-
actor.EditorSetEntityTemplate(entityData.Template);
190+
entityTemplateProvider.EditorSetEntityTemplate(entityData.Template);
190191

191192
return entityGO;
192193
}

Factory System/Editor/PrefabEditSessionManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private static EntityFactory.EntityData BuildEntityDataRecursive(Transform trans
122122
entityData.ChildEntities.Add(childEntityData);
123123
}
124124

125-
entityData.Template = transform.GetComponent<Actor>().EntityTemplate;
125+
entityData.Template = transform.GetComponent<EntityTemplateProvider>().EntityTemplate;
126126

127127
return entityData;
128128
}

Factory System/EntityEditorComponentFlag.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ private void OnTransformChildrenChanged()
99
{
1010
foreach (Transform child in transform)
1111
child.gameObject.TryGetElseSetComponent<Actor>();
12+
foreach (Transform child in transform)
13+
child.gameObject.TryGetElseSetComponent<EntityTemplateProvider>();
1214
}
1315
}
1416
}

0 commit comments

Comments
 (0)