/* * 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); }
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); }
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); }
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); }
//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); }
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)); } } }
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); }