using System.Collections.Generic; using System.Runtime.CompilerServices; namespace Prism { public class Entity { private Action? m_CollisionBeginCallbacks; private Action? m_CollisionEndCallbacks; private Action? m_Collision2DBeginCallbacks; private Action? m_Collision2DEndCallbacks; private Action? m_TriggerBeginCallbacks; private Action? m_TriggerEndCallbacks; public ulong ID { get; private set; } ~Entity() { } public Vec3 Translation { get { return GetComponent().Translation; } set { GetComponent().Translation = value; } } public Vec3 Rotation { get { return GetComponent().Rotation; } set { GetComponent().Rotation = value; } } public Vec3 Scale { get { return GetComponent().Scale; } set { GetComponent().Scale = value; } } protected Entity() { ID = 0; } internal Entity(ulong id) { ID = id; } public T CreateComponent() where T : Component, new() { CreateComponent_Native(ID, typeof(T)); T component = new T(); component.Entity = this; return component; } public bool HasComponent() where T : Component, new() { return HasComponent_Native(ID, typeof(T)); } public T GetComponent() where T : Component, new() { if (HasComponent()) { T component = new T(); component.Entity = this; return component; } return null; } public Entity FindEntityByTag(string tag) { ulong entityID = FindEntityByTag_Native(tag); return new Entity(entityID); } public Entity FindEntityByID(ulong entityID) { // TODO: to verify it return new Entity(entityID); } public void AddCollision2DBeginCallback(Action callback) { m_Collision2DBeginCallbacks += callback; } public void AddCollision2DEndCallback(Action callback) { m_Collision2DEndCallbacks += callback; } public void AddCollisionBeginCallback(Action callback) { m_CollisionBeginCallbacks += callback; } public void AddCollisionEndCallback(Action callback) { m_CollisionEndCallbacks += callback; } public void AddTriggerBeginCallback(Action callback) { m_TriggerBeginCallbacks += callback; } public void AddTriggerEndCallback(Action callback) { m_TriggerEndCallbacks += callback; } private void OnCollisionBegin(float data) { if (m_CollisionBeginCallbacks != null) m_CollisionBeginCallbacks.Invoke(data); } private void OnCollisionEnd(float data) { if (m_CollisionEndCallbacks != null) m_CollisionEndCallbacks.Invoke(data); } private void OnCollision2DBegin(float data) { if(m_Collision2DBeginCallbacks != null) m_Collision2DBeginCallbacks.Invoke(data); } private void OnCollision2DEnd(float data) { if(m_Collision2DEndCallbacks != null) m_Collision2DEndCallbacks.Invoke(data); } private void OnTriggerBegin(float data) { if (m_TriggerBeginCallbacks != null) m_TriggerBeginCallbacks.Invoke(data); } private void OnTriggerEnd(float data) { if (m_TriggerEndCallbacks != null) m_TriggerEndCallbacks.Invoke(data); } [MethodImpl(MethodImplOptions.InternalCall)] private static extern void CreateComponent_Native(ulong entityID, Type type); [MethodImpl(MethodImplOptions.InternalCall)] private static extern bool HasComponent_Native(ulong entityID, Type type); [MethodImpl(MethodImplOptions.InternalCall)] private static extern ulong FindEntityByTag_Native(string tag); } }