Example #1
0
        public void Create(ref GameObject targetObject, RenderContext renderContext,
                           Dictionary <string, object> rootJson)
        {
            if (EditorApplication.isPlaying)
            {
                EditorApplication.isPlaying = false;
            }

            var rootElement = ElementFactory.Generate(rootJson, null);

            rootElement.Render(ref targetObject, renderContext, null);

            if (renderContext.ToggleGroupMap.Count > 0)
            {
                // ToggleGroupが作成された場合
                var go = new GameObject("ToggleGroup");
                go.transform.SetParent(targetObject.transform);
                foreach (var keyValuePair in renderContext.ToggleGroupMap)
                {
                    var gameObject = keyValuePair.Value;
                    gameObject.transform.SetParent(go.transform);
                }
            }

            // 使われなかったオブジェクトの退避グループ
            var notUsedGroupObject =
                ElementUtil.GetOrCreateGameObject(renderContext, null, $"[{Importer.NAME}] Unused", null);
            var notUsedchilds = renderContext.FreeChildObjects;

            if (notUsedchilds.Count > 0)
            {
                var notUsedGroupRect = ElementUtil.GetOrAddComponent <RectTransform>(notUsedGroupObject);
                foreach (var keyValuePair in notUsedchilds)
                {
                    var go = keyValuePair.Key;
                    if (go != null)
                    {
                        if (PrefabUtility.GetNearestPrefabInstanceRoot(go) == null)
                        {
                            // NestedPrefabの子供でなければNotUsedグループに移動できる
                            var goRect = go.GetComponent <RectTransform>();
                            if (goRect != null)
                            {
                                goRect.SetParent(notUsedGroupRect);
                            }
                        }
                        else
                        {
                            // NestedPrefabの子供を転送しようとするとエラーになるため、
                            // 非アクティブにする
                            //TODO: unusedといった名前をつけるか検討
                            go.SetActive(false);
                        }
                    }
                    else
                    {
                        // Debug.Log("既に廃棄されています");
                    }
                }

                // not used グループに子供があった場合のみ移動
                if (notUsedGroupRect.childCount > 0)
                {
                    notUsedGroupRect.SetParent(targetObject.transform);
                    notUsedGroupObject.SetActive(false);
                }
            }
            else
            {
                Object.DestroyImmediate(notUsedGroupObject);
            }

            foreach (var prefab in renderContext.NewPrefabs.ToList())
            {
                //if we haven't created a prefab out of the referenced GO we do so now
                if (PrefabUtility.GetPrefabAssetType(prefab) == PrefabAssetType.NotAPrefab)
                {
                    //TODO: Ugly path generation
                    var nestedPrefabDirectory = Path.Combine(Application.dataPath.Replace("Assets", ""),
                                                             Path.Combine(Path.Combine(EditorUtil.GetOutputPrefabsFolderAssetPath()), "Components"));

                    if (!Directory.Exists(nestedPrefabDirectory))
                    {
                        Directory.CreateDirectory(nestedPrefabDirectory);
                    }

                    nestedPrefabs.Add(PrefabUtility.SaveAsPrefabAssetAndConnect(prefab,
                                                                                Path.Combine(nestedPrefabDirectory, prefab.name + ".prefab"), InteractionMode.AutomatedAction));
                }
            }
        }