2024-03-09 03:35:01 +08:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
2023-05-07 00:50:44 +08:00
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
namespace DCFApixels.DragonECS
|
|
|
|
{
|
|
|
|
public class EcsEntityConnect : MonoBehaviour
|
|
|
|
{
|
2023-06-22 14:30:03 +08:00
|
|
|
private sealed class Aspect : EcsAspect
|
2023-05-07 00:50:44 +08:00
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
public EcsPool<UnityGameObject> unityGameObjects;
|
|
|
|
protected override void Init(Builder b)
|
2023-05-07 00:50:44 +08:00
|
|
|
{
|
|
|
|
unityGameObjects = b.Include<UnityGameObject>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private entlong _entity;
|
|
|
|
private EcsWorld _world;
|
|
|
|
|
|
|
|
[SerializeField]
|
2024-03-03 03:51:49 +08:00
|
|
|
private ScriptableEntityTemplate[] _scriptableTemplates;
|
2023-05-07 00:50:44 +08:00
|
|
|
[SerializeField]
|
2024-03-03 03:51:49 +08:00
|
|
|
private MonoEntityTemplate[] _monoTemplates;
|
2023-05-07 00:50:44 +08:00
|
|
|
|
|
|
|
#region Properties
|
|
|
|
public entlong Entity
|
|
|
|
{
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
2024-03-09 03:35:01 +08:00
|
|
|
get { return _entity; }
|
2023-05-07 00:50:44 +08:00
|
|
|
}
|
|
|
|
public EcsWorld World
|
|
|
|
{
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
get => _world;
|
|
|
|
}
|
2024-03-03 03:51:49 +08:00
|
|
|
public bool IsConected
|
2023-05-07 00:50:44 +08:00
|
|
|
{
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
|
|
get => _entity.IsAlive;
|
|
|
|
}
|
2024-03-09 03:35:01 +08:00
|
|
|
public IEnumerable<ScriptableEntityTemplate> ScriptableTemplates
|
|
|
|
{
|
|
|
|
get { return _scriptableTemplates; }
|
|
|
|
}
|
|
|
|
public IEnumerable<MonoEntityTemplate> MonoTemplates
|
|
|
|
{
|
|
|
|
get { return _monoTemplates; }
|
|
|
|
}
|
|
|
|
public IEnumerable<ITemplateInternal> AllTemplates
|
|
|
|
{
|
|
|
|
get { return ((IEnumerable<ITemplateInternal>)_scriptableTemplates).Concat(_monoTemplates); }
|
|
|
|
}
|
2023-05-07 00:50:44 +08:00
|
|
|
#endregion
|
|
|
|
|
2024-03-09 03:35:01 +08:00
|
|
|
#region Connect
|
2023-05-07 00:50:44 +08:00
|
|
|
public void ConnectWith(entlong entity, bool applyTemplates = false)
|
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
if (_entity.TryGetID(out int oldEntityID) && _world != null)
|
2023-05-07 00:50:44 +08:00
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
var a = _world.GetAspect<Aspect>();
|
|
|
|
a.unityGameObjects.Del(oldEntityID);
|
2023-05-07 00:50:44 +08:00
|
|
|
}
|
|
|
|
_world = null;
|
|
|
|
|
2024-03-09 03:35:01 +08:00
|
|
|
if (entity.TryGetID(out int newEntityID))
|
2023-05-07 00:50:44 +08:00
|
|
|
{
|
|
|
|
_entity = entity;
|
|
|
|
_world = _entity.World;
|
2024-03-09 03:35:01 +08:00
|
|
|
var a = _world.GetAspect<Aspect>();
|
|
|
|
if (!a.unityGameObjects.Has(newEntityID))
|
|
|
|
{
|
|
|
|
a.unityGameObjects.Add(newEntityID) = new UnityGameObject(gameObject);
|
|
|
|
}
|
2023-05-07 00:50:44 +08:00
|
|
|
if (applyTemplates)
|
2024-03-09 03:35:01 +08:00
|
|
|
{
|
2023-05-07 00:50:44 +08:00
|
|
|
ApplyTemplates();
|
2024-03-09 03:35:01 +08:00
|
|
|
}
|
2023-05-07 00:50:44 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_entity = entlong.NULL;
|
|
|
|
}
|
|
|
|
}
|
2024-03-09 03:35:01 +08:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region ApplyTemplates
|
2024-03-03 03:51:49 +08:00
|
|
|
public void ApplyTemplates()
|
|
|
|
{
|
|
|
|
ApplyTemplatesFor(_entity.ID);
|
|
|
|
}
|
2023-05-07 00:50:44 +08:00
|
|
|
public void ApplyTemplatesFor(int entityID)
|
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
foreach (var template in _scriptableTemplates)
|
2024-03-03 03:51:49 +08:00
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
template.Apply(_world.id, entityID);
|
2024-03-03 03:51:49 +08:00
|
|
|
}
|
2024-03-09 03:35:01 +08:00
|
|
|
foreach (var template in _monoTemplates)
|
2024-03-03 03:51:49 +08:00
|
|
|
{
|
2024-03-09 03:35:01 +08:00
|
|
|
template.Apply(_world.id, entityID);
|
2024-03-03 03:51:49 +08:00
|
|
|
}
|
2023-05-07 00:50:44 +08:00
|
|
|
}
|
2024-03-09 03:35:01 +08:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Editor
|
|
|
|
internal void SetTemplates_Editor(MonoEntityTemplate[] tempaltes)
|
|
|
|
{
|
|
|
|
_monoTemplates = tempaltes;
|
|
|
|
}
|
|
|
|
#endregion
|
2023-05-07 00:50:44 +08:00
|
|
|
}
|
2024-03-06 21:37:21 +08:00
|
|
|
}
|