public static bool SetComponent(PropertyInfo p, object obj, string value, IIDData idData, IGameObjectData gameObjectData, IResFoldersData resFolderData)
        {
            if (p.PropertyType.GetGeneration(typeof(Component)) == -1)
            {
                return(false);
            }

            if (value.IndexOf("id:") == 0)
            {
                idData.WaitForID(value.Replace("id:", ""), go => {
                    var c = go.GetComponent(p.PropertyType);
                    if (c != null)
                    {
                        p.SetValue(obj, c, null);
                    }
                }
                                 );
                return(true);
            }

            object component = ValueGetter.GetComponent(value, p.PropertyType, idData, gameObjectData);

            if (component == null)
            {
                component = ValueGetter.GetResObject(value, p.PropertyType, resFolderData.GetResFolders());
            }

            if (component != null)
            {
                p.SetValue(obj, component, null);
            }

            return(true);
        }
        public static bool SetGameObject(PropertyInfo p, object obj, string value, IIDData idData, IGameObjectData gameObjectData, IResFoldersData resFoldersData)
        {
            if (p.PropertyType != typeof(GameObject))
            {
                return(false);
            }

            if (value.IndexOf("id:") == 0)
            {
                idData.WaitForID(value.Replace("id:", ""), go => p.SetValue(obj, go, null));
                return(true);
            }

            var gameObject = ValueGetter.GetGameObject(value, idData, gameObjectData);

            if (gameObject == null)
            {
                gameObject = ValueGetter.GetResObject(value, typeof(GameObject), resFoldersData.GetResFolders()) as GameObject;
            }

            if (gameObject != null)
            {
                p.SetValue(obj, gameObject, null);
            }

            return(true);
        }
        public static GameObject GetGameObject(string value, IIDData idData, IGameObjectData gameObjectData)
        {
            switch (value)
            {
            case "this":
                return(gameObjectData.GetGameObject());

            case "parent":
                var parent = gameObjectData.GetGameObject().transform.parent;
                return(parent != null ? parent.gameObject : null);

            default:
                return(idData.GetObjectByID(value));
            }
        }
        public static Component GetComponent(string value, Type componentType, IIDData idData, IGameObjectData gameObjectData)
        {
            var gameObject = GetGameObject(value, idData, gameObjectData);

            return(gameObject != null?gameObject.GetComponentInParent(componentType) : null);
        }