Beispiel #1
0
        /*
         * protected void CreateUiGameObject(RenderContext renderContext, [CanBeNull] ref GameObject selfObject, GameObject parentObject)
         * {
         *  selfObject = new GameObject(name);
         *  selfObject.AddComponent<RectTransform>();
         *  ElementUtil.SetLayer(selfObject, Layer);
         *  if (Active != null) selfObject.SetActive(Active.Value);
         * }
         */

        /// <summary>
        ///     Objectの生成か再利用 親子関係の設定、Layer、Activeの設定
        /// </summary>
        /// <param name="renderContext"></param>
        /// <param name="selfObject"></param>
        /// <param name="parentObject"></param>
        /// <returns></returns>
        protected void GetOrCreateSelfObject(RenderContext renderContext, ref GameObject selfObject,
                                             GameObject parentObject)
        {
            // 指定のオブジェクトがある場合は生成・取得せずそのまま使用する
            if (selfObject == null)
            {
                selfObject = ElementUtil.GetOrCreateGameObject(renderContext, Guid, name, parentObject);
            }

            var rect = ElementUtil.GetOrAddComponent <RectTransform>(selfObject);

            if (parentObject)
            {
                var nearestPrefabInstanceRoot = PrefabUtility.GetNearestPrefabInstanceRoot(selfObject);
                if (nearestPrefabInstanceRoot == null)
                {
                    // 子供の並び順を整えるため、親からはずしまたくっつける
                    rect.SetParent(null);
                    rect.SetParent(parentObject.transform);
                }

                if (rect.parent == null)
                {
                    Debug.LogError("使用されないオブジェクトが作成された");
                }
            }

            if (renderContext.OptionAddXdGuidComponent)
            {
                ElementUtil.SetGuid(selfObject, Guid);
            }
            ElementUtil.SetActive(selfObject, Active);
            ElementUtil.SetLayer(selfObject, Layer);
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);
            var rect = targetObject.GetComponent <RectTransform>();

            if (parentObject)
            {
                //親のパラメータがある場合、親にする 後のAnchor定義のため
                rect.SetParent(parentObject.transform);
            }

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
        public override void Render(ref GameObject targetObject,
                                    RenderContext renderContext,
                                    GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var graphic = targetObject.GetComponent <Graphic>() as Component;

            if (graphic != null)
            {
                // Groupには、描画コンポーネントは必要ない Graphicコンポーネントがある 削除する
                // オフにする手もあるかもだが、のちのSetupComponentsとぶつかる可能性あり
                // Debug.LogWarning($"[{Importer.NAME}] {graphic.gameObject.name}: Graphic Component change to {typeof(T)}.", go);
                Object.DestroyImmediate(graphic);
            }
            var canvasRenderer = targetObject.GetComponent <CanvasRenderer>();

            if (canvasRenderer != null)
            {
                Object.DestroyImmediate(canvasRenderer);
            }

            RenderedChildren = RenderChildren(renderContext, targetObject);
            ElementUtil.SetupCanvasGroup(targetObject, CanvasGroup);
            ElementUtil.SetupChildImageComponent(targetObject, RenderedChildren);
            ElementUtil.SetupFillColor(targetObject, FillColorJson);
            ElementUtil.SetupContentSizeFitter(targetObject, ContentSizeFitterJson);
            ElementUtil.SetupLayoutGroup(targetObject, LayoutGroupJson);
            ElementUtil.SetupLayoutElement(targetObject, LayoutElementJson);
            ElementUtil.SetupComponents(targetObject, ComponentsJson);
            ElementUtil.SetupMask(targetObject, MaskJson);
            ElementUtil.SetupRectMask2D(targetObject, RectMask2D);
            // ScrollRectを設定した時点で、はみでたContentがアジャストされる PivotがViewport内に入っていればOK
            GameObject goContent = null;

            if (RenderedChildren.Count > 0)
            {
                goContent = RenderedChildren[0].Item1;
            }
            ElementUtil.SetupScrollRect(targetObject, goContent, ScrollRectJson);
            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            ElementUtil.SetLayer(targetObject, Layer);
            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);

            // タッチイベントを取得するイメージコンポーネントになる
            ElementUtil.SetupFillColor(targetObject, FillColorJson);

            // コンテンツ部分を入れるコンテナ
            var goContent = new GameObject("$Content");

            ElementUtil.SetLayer(goContent, Layer); // Viewportと同じレイヤー
            var contentRect = ElementUtil.GetOrAddComponent <RectTransform>(goContent);

            goContent.transform.SetParent(targetObject.transform);

            if (_contentJson != null)
            {
                goContent.name = _contentJson.Get("name") ?? "";
                var rectJson = _contentJson.GetDic("rect_transform");
                if (rectJson != null)
                {
                    ElementUtil.SetupRectTransform(goContent, rectJson);
                }

                var contentLayout = _contentJson.GetDic("layout");
                ElementUtil.SetupLayoutGroup(goContent, contentLayout);

                var contentSizeFitter = _contentJson.GetDic("content_size_fitter");
                ElementUtil.SetupContentSizeFitter(goContent, contentSizeFitter);
            }

            //Viewportのチャイルドはもとより、content向けのAnchor・Offsetを持っている
            RenderChildren(renderContext, goContent);

            ElementUtil.SetupRectMask2D(targetObject, RectMask2D);
            // ScrollRectを設定した時点ではみでたContentがアジャストされる PivotがViewport内に入っていればOK
            ElementUtil.SetupScrollRect(targetObject, goContent, _scrollRectJson);
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var children = RenderChildren(renderContext, targetObject);

            var inputField = ElementUtil.GetOrAddComponent <InputField>(targetObject);

            inputField.transition = Selectable.Transition.None;
            if (InputJson != null)
            {
                var textComponent =
                    ElementUtil.FindComponentByClassName <Text>(children, InputJson.Get("text_component_class"));
                if (textComponent != null)
                {
                    inputField.textComponent = textComponent;
                    if (!textComponent.gameObject.activeSelf)
                    {
                        textComponent.gameObject.SetActive(true);
                    }
                }

                var placeholderText =
                    ElementUtil.FindComponentByClassName <Graphic>(children, InputJson.Get("placeholder_class"));
                if (placeholderText != null)
                {
                    inputField.placeholder = placeholderText;
                }

                var targetGraphic =
                    ElementUtil.FindComponentByClassName <Text>(children, InputJson.Get("target_graphic_class"));
                if (targetGraphic != null)
                {
                    inputField.targetGraphic = targetGraphic;
                }
            }

            ElementUtil.SetLayer(targetObject, Layer);
            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
Beispiel #6
0
        public RenderContext(string spriteOutputFolderAssetPath, string fontFolderAssetPath, GameObject rootObject)
        {
            this.spriteOutputFolderAssetPath = spriteOutputFolderAssetPath;
            this.fontFolderAssetPath         = fontFolderAssetPath;
            this.rootObject          = rootObject;
            OptionAddXdGuidComponent = false;
            FreeChildObjects         = new Dictionary <GameObject, GameObjectIdentifier>();
            if (rootObject != null)
            {
                // 全ての子供を取得する
                var allChildren = new List <GameObject>();
                ElementUtil.GetChildRecursive(rootObject, ref allChildren);
                foreach (var obj in allChildren)
                {
                    if (obj == rootObject)
                    {
                        // 自分自身はスキップする
                        continue;
                    }

                    AddFreeObject(obj);
                }
            }
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var rect = targetObject.GetComponent <RectTransform>();

            if (parentObject)
            {
                //親のパラメータがある場合、親にする 後のAnchor定義のため
                rect.SetParent(parentObject.transform);
            }

            var message  = _textJson.Get("text");
            var fontName = _textJson.Get("font");
            var fontSize = _textJson.GetFloat("size");
            var align    = _textJson.Get("align");
            var type     = _textJson.Get("textType");

            var text = ElementUtil.GetOrAddComponent <Text>(targetObject);

            if (text != null)
            {
                // 検索するフォント名を決定する
                var fontFilename = fontName;

                if (_textJson.ContainsKey("style"))
                {
                    var style = _textJson.Get("style");
                    fontFilename += "-" + style;
                    if (style.Contains("normal") || style.Contains("medium"))
                    {
                        text.fontStyle = FontStyle.Normal;
                    }

                    if (style.Contains("bold"))
                    {
                        text.fontStyle = FontStyle.Bold;
                    }
                }

                text.fontSize = Mathf.RoundToInt(fontSize.Value);
                text.font     = renderContext.GetFont(fontFilename);

                text.text  = message;
                text.color = Color.black;

                var color = _textJson.Get("color");
                text.color = color != null?EditorUtil.HexToColor(color) : Color.black;

                text.verticalOverflow = VerticalWrapMode.Truncate;

                if (type == "point")
                {
                    text.horizontalOverflow = HorizontalWrapMode.Overflow;
                    text.verticalOverflow   = VerticalWrapMode.Overflow;
                }
                else if (type == "paragraph")
                {
                    text.horizontalOverflow = HorizontalWrapMode.Wrap;
                    text.verticalOverflow   = VerticalWrapMode.Overflow;
                }
                else
                {
                    Debug.LogError("unknown type " + type);
                }

                var vertical         = "";
                var horizontal       = "";
                var alignLowerString = align.ToLower();
                if (alignLowerString.Contains("left"))
                {
                    horizontal = "left";
                }
                else if (alignLowerString.Contains("center"))
                {
                    horizontal = "center";
                }
                else if (alignLowerString.Contains("right"))
                {
                    horizontal = "right";
                }

                if (alignLowerString.Contains("upper"))
                {
                    vertical = "upper";
                }
                else if (alignLowerString.Contains("middle"))
                {
                    vertical = "middle";
                }
                else if (alignLowerString.Contains("lower"))
                {
                    vertical = "lower";
                }

                switch ((vertical + "-" + horizontal).ToLower())
                {
                case "upper-left":
                    text.alignment = TextAnchor.UpperLeft;
                    break;

                case "upper-center":
                    text.alignment = TextAnchor.UpperCenter;
                    break;

                case "upper-right":
                    text.alignment = TextAnchor.UpperRight;
                    break;

                case "middle-left":
                    text.alignment = TextAnchor.MiddleLeft;
                    break;

                case "middle-center":
                    text.alignment = TextAnchor.MiddleCenter;
                    break;

                case "middle-right":
                    text.alignment = TextAnchor.MiddleRight;
                    break;

                case "lower-left":
                    text.alignment = TextAnchor.LowerLeft;
                    break;

                case "lower-center":
                    text.alignment = TextAnchor.LowerCenter;
                    break;

                case "lower-right":
                    text.alignment = TextAnchor.LowerRight;
                    break;
                }
            }

            if (_textJson.ContainsKey("strokeSize"))
            {
                var strokeSize  = _textJson.GetInt("strokeSize");
                var strokeColor = EditorUtil.HexToColor(_textJson.Get("strokeColor"));
                var outline     = ElementUtil.GetOrAddComponent <Outline>(targetObject);
                outline.effectColor     = strokeColor;
                outline.effectDistance  = new Vector2(strokeSize.Value / 2.0f, -strokeSize.Value / 2.0f);
                outline.useGraphicAlpha = false;
            }

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);

            var children = RenderChildren(renderContext, targetObject);

            ElementUtil.SetupChildImageComponent(targetObject, children);

            // DotsScrollbarかどうかの判定に、Toggleがあるかどうかを確認する
            var       toggleChild = children.Find(child => child.Item2 is ToggleElement);
            Scrollbar scrollbar;

            if (toggleChild == null)
            {
                scrollbar = ElementUtil.GetOrAddComponent <Scrollbar>(targetObject);
            }
            else
            {
                // DotScrollbarとなる
                var dotScrollbar = targetObject.AddComponent <DotsScrollbar>();
                dotScrollbar.isAutoLayoutEnableOnEditMode = false;
                dotScrollbar.DotContainer = targetObject.GetComponent <RectTransform>();
                dotScrollbar.DotPrefab    = toggleChild.Item1.GetComponent <Toggle>();
                // Toggleボタンの並びレイアウト
                ElementUtil.SetupLayoutGroup(targetObject, LayoutGroupJson);
                dotScrollbar.size = 1; // sizeを1にすることで、Toggleが複数Cloneされることをふせぐ
                scrollbar         = dotScrollbar;
            }

            var direction = _scrollbarJson.Get("direction");

            if (direction != null)
            {
                switch (direction)
                {
                case "left-to-right":
                case "ltr":
                case "x":
                    scrollbar.direction = Scrollbar.Direction.LeftToRight;
                    break;

                case "right-to-left":
                case "rtl":
                    scrollbar.direction = Scrollbar.Direction.RightToLeft;
                    break;

                case "bottom-to-top":
                case "btt":
                case "y":
                    scrollbar.direction = Scrollbar.Direction.BottomToTop;
                    break;

                case "top-to-bottom":
                case "ttb":
                    scrollbar.direction = Scrollbar.Direction.TopToBottom;
                    break;
                }
            }

            var handleClassName = _scrollbarJson.Get("handle_class");

            if (handleClassName != null)
            {
                var found = children.Find(child => child.Item2.HasParsedName(handleClassName));
                if (found != null)
                {
                    scrollbar.handleRect = found.Item1.GetComponent <RectTransform>();
                }
            }

            ElementUtil.SetupContentSizeFitter(targetObject, ContentSizeFitterJson);
        }
Beispiel #9
0
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            targetObject = renderContext.OccupyObject(Guid, name, parentObject);
            if (targetObject != null)
            {
                if (!PrefabUtility.IsAnyPrefabInstanceRoot(targetObject))
                {
                    Debug.LogWarning($"CreateInstanceだが、プレハブのインスタンスではない:{targetObject.name}");
                    // 使われないように xd guidを書き換え
                    var xdGuidComponent = targetObject.GetComponent <XdGuid>();
                    if (xdGuidComponent != null)
                    {
                        xdGuidComponent.guid = "old:" + xdGuidComponent.guid;
                    }
                    // Freeに戻す
                    renderContext.AddFreeObject(targetObject);
                    // 見つからなかったことにする
                    targetObject = null;
                }
            }

            if (targetObject == null)
            {
                // 見つからなかった場合は プレハブの生成をする
                var path         = EditorUtil.GetOutputPrefabsFolderAssetPath() + "/" + master + ".prefab";
                var prefabObject = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                if (prefabObject == null)
                {
                    // 読み込むPrefabが存在しなかった
                    // ダミーのPrefabを作成する
                    Debug.LogWarning($"[{Importer.NAME}] {master}.prefab not found. Create a temporary prefab. path:{path}");
                    var tempObject = new GameObject("temporary object");
                    tempObject.AddComponent <RectTransform>();
                    // ダミーとわかるようにmagentaイメージを置く -> non-destructiive importで、このイメージを採用してしまうためコメントアウト
                    // var image = tempObject.AddComponent<Image>();
                    // image.color = Color.magenta;
                    // フォルダの用意
                    EditorUtil.CreateFolder(path.Substring(0, path.LastIndexOf('/')));
                    // prefabの作成
                    var savedAsset = PrefabUtility.SaveAsPrefabAsset(tempObject, path);
                    AssetDatabase.Refresh();
                    // Debug.Log($"[{Importer.Name}] Created temporary prefab. {path}", savedAsset);
                    Object.DestroyImmediate(tempObject);
                    prefabObject = AssetDatabase.LoadAssetAtPath <GameObject>(path);
                }

                // 仮のプレハブをセットする
                targetObject = PrefabUtility.InstantiatePrefab(prefabObject) as GameObject;
            }

            var rect = ElementUtil.GetOrAddComponent <RectTransform>(targetObject);

            if (parentObject != null)
            {
                /*
                 * if (PrefabUtility.IsPartOfPrefabInstance(parentObject))
                 * {
                 *  Debug.Log($"parent part of prefab:{parentObject.name}");
                 * }
                 */
                rect.SetParent(null);
                rect.SetParent(parentObject.transform);
            }

            if (renderContext.OptionAddXdGuidComponent)
            {
                // PrehabのXdGuidにインスタンスGuidを書き込む
                // 注意点:
                // 仮プレハブに書き込んだ場合、正規のプレハブが生成されたとき、
                // インスタンスGUIDがPrefabGuidにもどってしまうかもしれない
                var xdGuid = ElementUtil.GetOrAddComponent <XdGuid>(targetObject);
                xdGuid.guid = Guid;
            }

            targetObject.name = Name;

            /*
             * ElementUtil.SetLayer(targetObject, Layer);
             * ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
             * if (Active != null) targetObject.SetActive(Active.Value);
             * ElementUtil.SetupLayoutElement(targetObject, LayoutElementJson);
             */

            // Nested Prefab Creator
            var prefabCreator = new PrefabCreator(null);

            // Groupに変更しないと再帰が延々と繰り返される
            instanceRootJson["type"] = "Group";

            var subRenderContext = new RenderContext(renderContext.SpriteOutputFolderAssetPath,
                                                     renderContext.FontFolderAssetPath, targetObject);

            prefabCreator.Create(ref targetObject, subRenderContext, instanceRootJson);
        }
Beispiel #10
0
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var slider = ElementUtil.GetOrAddComponent <Slider>(targetObject);

            var children = RenderChildren(renderContext, targetObject);

            var direction = _sliderJson.Get("direction");

            if (direction != null)
            {
                direction = direction.ToLower();
                switch (direction)
                {
                case "left-to-right":
                case "ltr":
                case "x":
                    slider.direction = Slider.Direction.LeftToRight;
                    break;

                case "right-to-left":
                case "rtl":
                    slider.direction = Slider.Direction.RightToLeft;
                    break;

                case "bottom-to-top":
                case "btt":
                case "y":
                    slider.direction = Slider.Direction.BottomToTop;
                    break;

                case "top-to-bottom":
                case "ttb":
                    slider.direction = Slider.Direction.TopToBottom;
                    break;
                }
            }

            slider.transition = Selectable.Transition.None;
            //slider.interactable = false;

            var fillRect =
                ElementUtil.FindComponentByClassName <RectTransform>(children, _sliderJson.Get("fill_rect_name"));

            if (fillRect != null)
            {
                slider.value    = slider.maxValue;
                slider.fillRect = fillRect;
            }

            var handleRect =
                ElementUtil.FindComponentByClassName <RectTransform>(children, _sliderJson.Get("handle_rect_name"));

            if (handleRect != null)
            {
                slider.handleRect   = handleRect;
                slider.interactable = true;
            }

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var rect = targetObject.GetComponent <RectTransform>();

            if (parentObject)
            {
                //親のパラメータがある場合、親にする 後のAnchor定義のため
                rect.SetParent(parentObject.transform);
            }

            var image = ElementUtil.GetOrAddComponent <Image>(targetObject);

            if (image != null)
            {
                image = ElementUtil.GetOrAddComponent <Image>(targetObject);
                var sourceImageName = ImageJson.Get("source_image");
                if (sourceImageName != null)
                {
                    var sprite = renderContext.GetSprite(sourceImageName);
                    image.sprite = sprite;
                }

                image.color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
                var raycastTarget = ImageJson.GetBool("raycast_target");
                if (raycastTarget != null)
                {
                    image.raycastTarget = raycastTarget.Value;
                }

                image.type = Image.Type.Sliced;
                var imageType = ImageJson.Get("image_type");
                if (imageType != null)
                {
                    switch (imageType.ToLower())
                    {
                    case "sliced":
                        image.type = Image.Type.Sliced;
                        break;

                    case "filled":
                        image.type = Image.Type.Filled;
                        break;

                    case "tiled":
                        image.type = Image.Type.Tiled;
                        break;

                    case "simple":
                        image.type = Image.Type.Simple;
                        break;

                    default:
                        Debug.LogAssertion($"[{Importer.NAME}] unknown image_type:" + imageType);
                        break;
                    }
                }

                var preserveAspect = ImageJson.GetBool("preserve_aspect");
                if (preserveAspect != null)
                {
                    // アスペクト比を保つ場合はSimpleにする
                    // image.type = Image.Type.Simple;
                    image.preserveAspect = preserveAspect.Value;
                }
            }


            ElementUtil.SetupLayoutElement(targetObject, LayoutElementJson);
            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
Beispiel #12
0
        //public override GameObject Render(RenderContext renderer, GameObject parentObject)
        public override void Render(ref GameObject targetObject, RenderContext renderContext,
                                    GameObject parentObject)
        {
            // var go = CreateUiGameObject(renderContext, parentObject, out isPrefabChild);
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);


            var rect = targetObject.GetComponent <RectTransform>();

            if (parentObject)
            {
                //親のパラメータがある場合、親にする 後のAnchor定義のため
                rect.SetParent(parentObject.transform);
            }

            var message   = _textJson.Get("text");
            var fontName  = _textJson.Get("font");
            var fontStyle = _textJson.Get("style");
            var fontSize  = _textJson.GetFloat("size");
            var align     = _textJson.Get("align");
            var type      = _textJson.Get("textType");

            var text = ElementUtil.GetOrAddComponent <TextMeshProUGUI>(targetObject);

            text.font     = renderContext.GetTMPFontAsset(fontName, fontStyle);
            text.text     = message;
            text.fontSize = fontSize.Value;

            // 自動的に改行されることが困ることもあるが、挙動としてはこちらのほうがXDに沿うことになる
            if (text.textInfo != null && text.textInfo.textComponent != null)
            {
                text.textInfo.textComponent.enableWordWrapping = true;
            }
            else
            {
                // Essential がインストールしてない場合に NULLになる可能性
                Debug.LogError("[{Importer.Name}] Can not access text.textInfo.textComponent");
            }

            var color = _textJson.Get("color");

            if (color != null)
            {
                text.color = EditorUtil.HexToColor(color);
            }

            // BAUM2からTextMeshProへの変換を行うと少し横にひろがってしまうことへの対応
            // text.textInfo.textComponent.characterSpacing = -1.7f; // 文字幅を狭める

            var middle = true;

            if (type == "point")
            {
                text.horizontalMapping = TextureMappingOptions.Line;
                text.verticalMapping   = TextureMappingOptions.Line;
                middle = true;
            }
            else if (type == "paragraph")
            {
                text.horizontalMapping = TextureMappingOptions.Paragraph;
                text.verticalMapping   = TextureMappingOptions.Line;
                if (align.Contains("upper"))
                {
                    middle = false;
                }
                else
                {
                    middle = !message.Contains("\n");
                }
            }
            else
            {
                Debug.LogError("unknown type " + type);
            }

            // var fixedPos = rect.anchoredPosition;
            if (align.Contains("left"))
            {
                text.alignment = middle ? TextAlignmentOptions.MidlineLeft : TextAlignmentOptions.TopLeft;
            }
            else if (align.Contains("center"))
            {
                text.alignment = middle ? TextAlignmentOptions.Midline : TextAlignmentOptions.Top;
            }
            else if (align.Contains("right"))
            {
                text.alignment = middle ? TextAlignmentOptions.MidlineRight : TextAlignmentOptions.TopRight;
            }

            if (_textJson.ContainsKey("strokeSize"))
            {
                var strokeSize  = _textJson.GetInt("strokeSize");
                var strokeColor = EditorUtil.HexToColor(_textJson.Get("strokeColor"));
                var outline     = ElementUtil.GetOrAddComponent <Outline>(targetObject);
                outline.effectColor     = strokeColor;
                outline.effectDistance  = new Vector2(strokeSize.Value / 2.0f, -strokeSize.Value / 2.0f);
                outline.useGraphicAlpha = false;
            }

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
Beispiel #13
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));
                }
            }
        }
Beispiel #14
0
        public override void Render(ref GameObject targetObject, RenderContext renderContext, GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var children = RenderChildren(renderContext, targetObject);

            var toggle = ElementUtil.GetOrAddComponent <Toggle>(targetObject);

            // トグルグループ名
            var group = _toggleJson.Get("group");

            if (group != null)
            {
                var toggleToRadio = ElementUtil.GetOrAddComponent <ToggleToRadio>(targetObject);
                toggleToRadio.GroupName = group;
            }

            GameObject targetImageObject = null;
            var        targetGraphics    = _toggleJson.GetArray("target_graphic").Select(o => o.ToString()).ToList();
            var        targetImage       =
                ElementUtil.FindComponentByNames <Image>(children, targetGraphics);

            if (targetImage != null)
            {
                toggle.targetGraphic = targetImage;
                targetImageObject    = targetImage.gameObject;
                //TODO: 強制的にActiveにする
                targetImageObject.SetActive(true);
            }

            // ON graphic
            var onGraphics   = _toggleJson.GetArray("on_graphic").Select(o => o.ToString()).ToList();
            var graphicImage = ElementUtil.FindComponentByNames <Image>(children, onGraphics);

            if (graphicImage != null)
            {
                toggle.graphic = graphicImage;
                if (graphicImage.gameObject.activeSelf)
                {
                    toggle.isOn = true;
                }
                else
                {
                    //TODO: 強制的にActiveにする
                    graphicImage.gameObject.SetActive(true);
                }
            }

            // ON/OFF が画像の入れ替えとして動作するコンポーネント
            var graphicSwap = _toggleJson.GetBool("graphic_swap");

            if (graphicSwap != null && graphicSwap.Value)
            {
                ElementUtil.GetOrAddComponent <ToggleGraphicSwap>(targetObject);
            }

            var deleteObjects   = new Dictionary <GameObject, bool>();
            var spriteStateJson = _toggleJson.GetDic("sprite_state");

            if (spriteStateJson != null)
            {
                var spriteState = ElementUtil.CreateSpriteState(spriteStateJson, RenderedChildren, ref deleteObjects);
                toggle.spriteState = spriteState;
            }

            foreach (var keyValuePair in deleteObjects)
            {
                // 他の状態にtargetImageの画像が使われている可能性もあるためチェックする
                if (keyValuePair.Key != targetImageObject)
                {
                    Object.DestroyImmediate(keyValuePair.Key);
                }
            }


            ElementUtil.SetupLayoutElement(targetObject, LayoutElementJson);
            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
        }
        public override void Render(ref GameObject targetObject,
                                    RenderContext renderContext,
                                    GameObject parentObject)
        {
            GetOrCreateSelfObject(renderContext, ref targetObject, parentObject);

            var children      = RenderChildren(renderContext, targetObject);
            var deleteObjects = new Dictionary <GameObject, bool>();

            var button = ElementUtil.GetOrAddComponent <Button>(targetObject);


            GameObject targetImageObject = null;

            if (ButtonJson != null)
            {
                var targetGraphics = ButtonJson.GetArray("target_graphic").Select(o => o.ToString()).ToList();
                var targetImage    =
                    ElementUtil.FindComponentByNames <Image>(children, targetGraphics);
                if (targetImage != null)
                {
                    button.targetGraphic = targetImage;
                    targetImageObject    = targetImage.gameObject;
                    targetImageObject.SetActive(true);
                }

                // すげ替え画像を探し、設定する
                // 見つかった場合は
                // その画像オブジェクトを削除し
                // SpriteSwapに設定する
                var spriteStateJson = ButtonJson.GetDic("sprite_state");
                if (spriteStateJson != null)
                {
                    var spriteState =
                        ElementUtil.CreateSpriteState(spriteStateJson, RenderedChildren, ref deleteObjects);
                    button.spriteState = spriteState;
                }

                // transitionの設定が明記してある場合は上書き設定する
                var type = ButtonJson.Get("transition");
                switch (type)
                {
                case "sprite-swap":
                    button.transition = Selectable.Transition.SpriteSwap;
                    break;

                case "color-tint":
                    button.transition = Selectable.Transition.ColorTint;
                    break;

                case "animation":
                    button.transition = Selectable.Transition.Animation;
                    break;

                case "none":
                    button.transition = Selectable.Transition.None;
                    break;
                }
            }

            foreach (var keyValuePair in deleteObjects)
            {
                // 他の状態にtargetImageの画像が使われている可能性もあるためチェックする
                if (keyValuePair.Key != targetImageObject)
                {
                    Object.DestroyImmediate(keyValuePair.Key);
                }
            }

            // TargetGraphicが設定されなかった場合
            if (button.targetGraphic == null)
            {
                // 子供からImage持ちを探す

                var image = targetObject.GetComponentInChildren <Image>();
                if (image != null)
                {
                    // アクティブにする
                    image.gameObject.SetActive(true);
                }
                else
                {
                    // componentでないか探す
                    image = targetObject.GetComponent <Image>();
                }

                button.targetGraphic = image;
            }

            ElementUtil.SetupRectTransform(targetObject, RectTransformJson);
            ElementUtil.SetupLayoutElement(targetObject, LayoutElementJson);
            ElementUtil.SetupComponents(targetObject, ComponentsJson);
        }