Esempio n. 1
0
        public override void OnBeforeSerialize(Type storageType, object instance)
        {
            CompRef      cref = instance as CompRef;
            ECSComponent comp = cref.component;

            if (comp != null)
            {
                cref.isNull = false;
                if (blueprint)
                {
                    cref.entity_ID = comp.Entity.blueprintID;
                }
                else
                {
                    cref.entity_ID = comp.Entity.ID;
                }

                cref.component_ID = comp.componentID;
                cref.entityName   = comp.Entity.name;
            }
            else
            {
                cref.isNull = true;
            }
            cref.component = null;
        }
Esempio n. 2
0
        private void IncreaseBuffer(int count)
        {
            Console.WriteLine($"[ECS] Increasing buffer to {ecsComponentData.GetLength(0) + count} entities");

            int rows = ecsComponentData.GetLength(0) + count;
            int cols = typeIndexLookup.Count;

            var newArray = new ECSComponent[rows, cols];
            int minRows  = Math.Min(rows, ecsComponentData.GetLength(0));
            int minCols  = Math.Min(cols, ecsComponentData.GetLength(1));

            for (int i = 0; i < rows; i++)
            {
                if (i < minRows)
                {
                    for (int j = 0; j < minCols; j++)
                    {
                        newArray[i, j] = ecsComponentData[i, j];
                    }
                }
                else
                {
                    CreateInvalidEntity(i);
                }
            }

            ecsComponentData = newArray;
        }
Esempio n. 3
0
 public virtual void OnComponentRemovedFromEntity(ECSEntity entity, ECSComponent component)
 {
     if (Accept(component))
     {
         RemoveComponent(component);
     }
 }
        public Bag <ECSComponent> ParseComponentData(JSONNode archetypeData)
        {
            Bag <ECSComponent> components         = new Bag <ECSComponent>();
            JSONNode           data               = null;
            JSONNode           componentDataArray = m_dataLocator.GetComponentData(archetypeData);
            Type componentType = null;

            for (int i = 0; i < componentDataArray.Count; i++)
            {
                data = componentDataArray[i];

                componentType = GetComponentTypeByName(m_dataLocator.GetComponentName(data));

                if (componentType == null)
                {
                    continue;
                }

                ECSComponent component = JsonUtility.FromJson(data.ToString(), componentType) as ECSComponent;
                ECSDebug.Assert(component != null, "Failed to create Component " + m_dataLocator.GetComponentName(data));

                components.Add(component);
            }

            components.ResizeToFit();

            return(components);
        }
Esempio n. 5
0
 public override void OnComponentRemovedPre(int entityID, ECSComponent component)
 {
     if (component.GetType() == typeof(CCollider))
     {
         RemoveEntity(entityID);
     }
 }
Esempio n. 6
0
 public void RemoveComponent(int entityID, ECSComponent component)
 {
     OnComponentRemovedPre(entityID, component);
     GetComponentBag(entityID).Set(GetComponentID(component.GetType()), null);
     m_componentFactory.DeInitializeComponent(entityID, component);
     OnComponentRemovedPost(entityID, component);
 }
Esempio n. 7
0
 public virtual void OnComponentAddedToEntity(ECSEntity entity, ECSComponent component)
 {
     if (Accept(component))
     {
         AddComponent(component);
     }
 }
Esempio n. 8
0
 public override void OnComponentAddedToEntity(ECSEntity entity, ECSComponent component)
 {
     if (component != null && component is Renderer)
     {
         AddComponent(new RenderingSystemComponent(component as Renderer, entity.GetComponent <Transform>()));
     }
 }
Esempio n. 9
0
        public void RemoveComponent(ECSComponent component)
        {
            bool removed = components.Remove(component);

            if (removed)
            {
                OnComponentRemoved?.Invoke(component);
            }
        }
        private T GetComponent <T>(ECSComponent component, int entityID) where T : ECSComponent
        {
            if (m_componentManager.HasComponent <T>(entityID) == false)
            {
                OnComponentInitializeFailure(component, "Cannot initialize component " + component.GetType().Name + " without component " + typeof(T).Name);
                return(null);
            }

            return(m_componentManager.GetComponent <T>(entityID));
        }
Esempio n. 11
0
        static void SetDataForComponent(ECSComponent comp, SerializedData data)
        {
            Type t     = comp.GetType();
            var  field = findDataField(t);

            if (field != null)
            {
                field.SetValue(comp, data);
            }
        }
Esempio n. 12
0
 internal static T GetEntityComponent <T>(this ECSComponent component) where T : ECSComponent
 {
     if ((object)component == null)
     {
         return(null);
     }
     if ((object)component.Entity == null)
     {
         return(null);
     }
     return(component.Entity.GetECSComponent <T>());
 }
        public virtual int DeInitializeComponent(int entityID, ECSComponent component)
        {
            if (component.GetType() == typeof(CTransform))
            {
                CTransform cTransform = component as CTransform;
                GameObject.Destroy(cTransform.GameObject);
            }

            if (component.GetType() == typeof(CSpriteRenderer))
            {
                CSpriteRenderer cRenderer = component as CSpriteRenderer;
                DestroyUnityComponent <SpriteRenderer>(entityID, cRenderer);
            }

            if (component.GetType() == typeof(CBoxCollider))
            {
                CBoxCollider cBoxCollider = component as CBoxCollider;
                OnColliderRemoved(entityID, cBoxCollider.BoxCollider);
                DestroyUnityComponent <BoxCollider>(entityID, cBoxCollider);
            }

            if (component.GetType() == typeof(CMeshCollider))
            {
                CMeshCollider cMeshCollider = component as CMeshCollider;
                OnColliderRemoved(entityID, cMeshCollider.Collider);
                DestroyUnityComponent <MeshCollider>(entityID, cMeshCollider);
            }

            if (component.GetType() == typeof(CSphereCollider))
            {
                CSphereCollider cSphereCollider = component as CSphereCollider;
                OnColliderRemoved(entityID, cSphereCollider.Collider);
                DestroyUnityComponent <SphereCollider>(entityID, cSphereCollider);
            }


            if (component.GetType() == typeof(CRigidbody))
            {
                CRigidbody cRigidbody = component as CRigidbody;
                DestroyUnityComponent <Rigidbody>(entityID, cRigidbody);
            }


            if (component.GetType() == typeof(CMeshRenderer))
            {
                CMeshRenderer cMeshRenderer = component as CMeshRenderer;
                DestroyUnityComponent <MeshRenderer>(entityID, cMeshRenderer);
                DestroyUnityComponent <MeshFilter>(entityID, cMeshRenderer);
            }


            return(0);
        }
Esempio n. 14
0
        public T GetComponent <T>() where T : ECSComponent
        {
            ECSComponent component = components.Find(c => c.GetType() == typeof(T));

            if (component != null)
            {
                return((T)component);
            }
            else
            {
                return(default(T));
            }
        }
Esempio n. 15
0
        private RenderingSystemComponent FindComponent(Transform transform, Renderer renderer)
        {
            ECSComponent cmp = GetComponents().Find(c => ((RenderingSystemComponent)c).Renderer.Equals(renderer) && ((RenderingSystemComponent)c).Transform.Equals(transform));

            if (cmp != null)
            {
                return((RenderingSystemComponent)cmp);
            }
            else
            {
                return(null);
            }
        }
Esempio n. 16
0
        public ECSEntity AddComponent(ECSComponent component)
        {
            if (!components.Contains(component))
            {
                components.Add(component);

                component.Entity = this;

                component.Init();

                OnComponentAdded?.Invoke(component);
            }
            return(this);
        }
Esempio n. 17
0
        public void UnregisterECSComponent(ECSComponent component)
        {
            Type t = component.GetType();

            IList comps;

            components.TryGetValue(t, out comps);

            if (comps != null)
            {
                comps.Remove(component);
            }

            allComponents.Remove(component);
        }
        private CTransform VerifyTransform(ECSComponent component, int entityID)
        {
            CTransform cTransform = GetComponent <CTransform>(component, entityID);

            if (cTransform == null)
            {
                return(null);
            }

            if (cTransform.GameObject == null)
            {
                OnComponentInitializeFailure(component, "GameObject does not exist!");
                return(null);
            }

            return(cTransform);
        }
Esempio n. 19
0
        public void RegisterECSComponent(ECSComponent component)
        {
            Type t = component.GetType();

            IList comps;

            components.TryGetValue(t, out comps);

            if (comps == null)
            {
                comps = MakeNewGenericList(t);
                components.Add(t, comps);
            }

            comps.Add(component);
            allComponents.Add(component);
        }
Esempio n. 20
0
        public void InitializePendingComponents(int entityID)
        {
            Bag <ECSComponent> bag = SafeGetPendingComponentBag(entityID).Clone();

            bag.ResizeToFit();

            ECSComponent component = null;

            List <ECSComponent> toInit = new List <ECSComponent>(bag.GetAll());

            int attemptThreshold = -1;
            int START_THRESHOLD  = 1;

            if (toInit.Count > 0)
            {
                START_THRESHOLD = 10;
            }

            attemptThreshold = START_THRESHOLD;

            while (toInit.Count > 0 && attemptThreshold > 0)
            {
                for (int i = toInit.Count - 1; i >= 0; i--)
                {
                    component = toInit[i];
                    RemovePendingComponent(entityID, component);

                    if (m_componentFactory.InitializeComponent(entityID, component) == 0)
                    {
                        SafeGetComponentBag(entityID).Set(SafeGetComponentID(component.GetType()), component);
                        OnComponentAdded(entityID, component);
                        toInit.RemoveAt(i);
                        attemptThreshold = START_THRESHOLD;
                        continue;
                    }
                    else
                    {
                        AddPendingComponent(entityID, component);
                        attemptThreshold--;
                    }
                }
            }

            ECSDebug.Assert(attemptThreshold > 0, " Reached attempt threshold, maybe two components are dependent on eachother?");
        }
        private void OnComponentAdded(int entityID, ECSComponent component)
        {
            Bag <int> query = null;

            foreach (Type[] type in m_queries.Keys)
            {
                query = GetQuery(type);

                if (query.Has(entityID) == -1)
                {
                    if (m_componentManager.HasComponents(entityID, type))
                    {
                        query.Add(entityID);
                        query.ResizeToFit();
                    }
                }
            }
        }
Esempio n. 22
0
        static SerializedData GetDataFromComponent(ECSComponent comp)
        {
            if (comp == null)
            {
                return(null);
            }
            Type t     = comp.GetType();
            var  field = findDataField(t);

            if (field != null)
            {
                var data = field.GetValue(comp) as SerializedData;
                return(data);
            }
            else
            {
                return(null);
            }
        }
        private void OnComponentRemovedPost(int entityID, ECSComponent component)
        {
            Bag <int> query = null;

            foreach (Type[] type in m_queries.Keys)
            {
                query = GetQuery(type);

                if (query.Has(entityID) == -1)
                {
                    continue;
                }

                if (m_componentManager.HasComponents(entityID, type) == false)
                {
                    query.RemoveIndex(query.Has(entityID));
                    query.ResizeToFit();
                }
            }
        }
        private int DestroyUnityComponent <T>(int entityID, ECSComponent component) where T : Component
        {
            CTransform cTransform = VerifyTransform(component, entityID);

            if (cTransform == null)
            {
                OnComponentDeInitializeFailure(component, "Transform not found.");
                return(1);
            }

            T unityComponent = cTransform.GameObject.GetComponent <T>();

            if (component == null)
            {
                OnComponentDeInitializeFailure(component, "Unity component not found on transform " + typeof(T));
                return(1);
            }

            GameObject.Destroy(unityComponent);
            return(0);
        }
Esempio n. 25
0
        private void RemovePendingComponent(int entityID, ECSComponent component)
        {
            int componentID = GetComponentID(component.GetType());

            SafeGetPendingComponentBag(entityID).Set(componentID, null);
        }
Esempio n. 26
0
        private void AddPendingComponent(int entityID, ECSComponent component)
        {
            int componentID = SafeGetComponentID(component.GetType());

            SafeGetPendingComponentBag(entityID).Set(componentID, component);
        }
Esempio n. 27
0
 public ECSComponent AddComponent(int entityID, ECSComponent component)
 {
     AddPendingComponent(entityID, component);
     InitializePendingComponents(entityID);
     return(null);
 }
Esempio n. 28
0
        internal void CreateComponent <T>(int entityID)
        {
            ECSComponent component = CreateComponent <T>();

            AddComponent(entityID, component);
        }
Esempio n. 29
0
        internal void RemoveComponent <T>(int entityID)
        {
            ECSComponent component = GetComponentBag(entityID).Get(GetComponentID(typeof(T)));

            RemoveComponent(entityID, component);
        }
Esempio n. 30
0
 public int InitializeComponent(int entityID, ECSComponent component)
 {
     LogWarning();
     return(0);
 }