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);
        }
        public virtual int InitializeComponent(int entityID, ECSComponent component)
        {
            if (component.GetType() == typeof(CTransform))
            {
                CTransform cTransform = component as CTransform;

                if (cTransform.GameObject == null)
                {
                    if (cTransform.PrefabID == null)
                    {
                        cTransform.GameObject = new GameObject(cTransform.Name);
                    }
                    else
                    {
                        GameObject prefab = Resources.Load <GameObject>(cTransform.PrefabID);

                        if (prefab == null)
                        {
                            OnComponentInitializeFailure(cTransform, "Prefab could not be found " + cTransform.PrefabID);
                            return(1);
                        }

                        cTransform.GameObject = GameObject.Instantiate(prefab);
                    }
                }

                if (cTransform.LayerID != -1)
                {
                    cTransform.GameObject.layer = cTransform.LayerID;
                }

                if (cTransform.X.Equals(float.NaN))
                {
                    cTransform.X = cTransform.GameObject.transform.position.x;
                }

                if (cTransform.Y.Equals(float.NaN))
                {
                    cTransform.Y = cTransform.GameObject.transform.position.y;
                }

                if (cTransform.Z.Equals(float.NaN))
                {
                    cTransform.Z = cTransform.GameObject.transform.position.z;
                }

                if (cTransform.RotationX.Equals(float.NaN))
                {
                    cTransform.RotationX = cTransform.GameObject.transform.eulerAngles.x;
                }

                if (cTransform.RotationY.Equals(float.NaN))
                {
                    cTransform.RotationY = cTransform.GameObject.transform.eulerAngles.y;
                }

                if (cTransform.RotationZ.Equals(float.NaN))
                {
                    cTransform.RotationZ = cTransform.GameObject.transform.eulerAngles.z;
                }

                if (cTransform.ScaleX.Equals(float.NaN))
                {
                    cTransform.ScaleX = cTransform.GameObject.transform.localScale.x;
                }

                if (cTransform.ScaleY.Equals(float.NaN))
                {
                    cTransform.ScaleY = cTransform.GameObject.transform.localScale.y;
                }

                if (cTransform.ScaleZ.Equals(float.NaN))
                {
                    cTransform.ScaleZ = cTransform.GameObject.transform.localScale.z;
                }
            }

            if (component.GetType() == typeof(CSpriteRenderer))
            {
                CSpriteRenderer cRenderer = component as CSpriteRenderer;

                CTransform cTransform = VerifyTransform(cRenderer, entityID);

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

                cRenderer.SpriteRenderer = AddOrGetUnityComponent <SpriteRenderer>(cTransform);
            }

            if (component.GetType() == typeof(CRigidbody))
            {
                CRigidbody cRigidbody = component as CRigidbody;

                CTransform cTransform = VerifyTransform(cRigidbody, entityID);

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

                bool overwriteValues = (cTransform.GameObject.GetComponent <Rigidbody>() != null);
                cRigidbody.RigidBody = AddOrGetUnityComponent <Rigidbody>(cTransform);

                if (overwriteValues)
                {
                    cRigidbody.IsKinematic = cRigidbody.RigidBody.isKinematic;
                    cRigidbody.UseGravity  = cRigidbody.RigidBody.useGravity;
                }
            }

            if (component.GetType() == typeof(CBoxCollider))
            {
                CBoxCollider cBoxCollider = component as CBoxCollider;

                CTransform cTransform = VerifyTransform(cBoxCollider, entityID);

                if (cTransform == null)
                {
                    return(1);
                }
                if (cBoxCollider.BoxCollider == null)
                {
                    cBoxCollider.BoxCollider = AddOrGetUnityComponent <BoxCollider>(cTransform);
                }

                OnColliderAdded(cBoxCollider.BoxCollider, entityID);
            }



            if (component.GetType() == typeof(CMeshCollider))
            {
                CMeshCollider collider = component as CMeshCollider;

                CTransform cTransform = VerifyTransform(collider, entityID);

                CMeshRenderer cMeshRenderer = GetComponent <CMeshRenderer>(collider, entityID);

                if (cMeshRenderer == null)
                {
                    return(1);
                }

                if (cMeshRenderer.MeshFilter == null)
                {
                    OnComponentInitializeFailure(collider, "Cannot create mesh collider without mesh filter");
                    return(1);
                }

                if (collider.Collider == null)
                {
                    collider.Collider = AddOrGetUnityComponent <MeshCollider>(cTransform);

                    collider.Collider.sharedMesh = null;
                    collider.Collider.sharedMesh = cMeshRenderer.MeshFilter.mesh;

                    if (collider.IsConvex)
                    {
                        collider.Collider.convex = true;
                    }
                }

                OnColliderAdded(collider.Collider, entityID);
            }

            if (component.GetType() == typeof(CSphereCollider))
            {
                CSphereCollider cSphereCollider = component as CSphereCollider;

                CTransform cTransform = VerifyTransform(cSphereCollider, entityID);


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

                if (cSphereCollider.Collider == null)
                {
                    cSphereCollider.Collider = AddOrGetUnityComponent <SphereCollider>(cTransform);

                    if (cSphereCollider.PhysicsMaterialID != null && (cSphereCollider.Collider.material == null || cSphereCollider.Collider.material.name != cSphereCollider.PhysicsMaterialID))
                    {
                        cSphereCollider.Collider.material = Resources.Load <PhysicMaterial>(cSphereCollider.PhysicsMaterialID);
                    }
                }

                OnColliderAdded(cSphereCollider.Collider, entityID);
            }

            if (component.GetType() == typeof(CMeshRenderer))
            {
                CMeshRenderer meshRenderer = component as CMeshRenderer;

                CTransform cTransform = VerifyTransform(meshRenderer, entityID);

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

                if (meshRenderer.MeshRenderer == null)
                {
                    meshRenderer.MeshRenderer = AddOrGetUnityComponent <MeshRenderer>(cTransform);

                    if (meshRenderer.MaterialID != null && (meshRenderer.MeshRenderer.material == null || meshRenderer.MeshRenderer.material.name != meshRenderer.MaterialID))
                    {
                        meshRenderer.MeshRenderer.material = Resources.Load <Material>(meshRenderer.MaterialID);
                    }
                }


                if (meshRenderer.MeshFilter == null)
                {
                    meshRenderer.MeshFilter = AddOrGetUnityComponent <MeshFilter>(cTransform);

                    if (meshRenderer.MeshID != null && (meshRenderer.MeshFilter.mesh.name != meshRenderer.MeshID || meshRenderer.MeshFilter.mesh == null))
                    {
                        Mesh mesh = Resources.Load <Mesh>(meshRenderer.MeshID);
                        meshRenderer.MeshFilter.mesh = mesh;
                    }

                    meshRenderer.MeshID = meshRenderer.MeshFilter.mesh.name;
                }
            }

            return(0);
        }