【问题标题】:How to remove spacing between buttons in Unity3D?如何删除 Unity3D 中按钮之间的间距?
【发布时间】:2019-12-17 21:19:48
【问题描述】:

我正在使用 Unity 设计的游戏中以编程方式创建按钮。我实例化按钮预制件并将它们作为画布上的 Panel 对象的父级。我已将面板设置为具有以下属性的水平布局组:

我已将以下组件添加到按钮预制件中以实现我需要的外观:

做完这一切之后,我得到的结果是:

因此,我的问题是,如何删除每个按钮之间的间距?这些按钮应该彼此相邻(但不重叠)以看起来像一个句子。我有单独按钮的原因是用户需要单击句​​子中正确的 2 个字母字符(在上面的示例中是字母 ar)。我已将属性上的间距设置为 0 并选中/取消选中各种选项,但没有运气!

我在 Panel 和 Button 对象上都取消了 Child Force Expand 的宽度选项,但句子看起来都塞满了....如何确保按钮一个接一个整齐地放置(即不重叠)?

与以下评论相关的代码:

 for (int i = 0; i < letterArray.Length; i++)
        {
            button = (GameObject)Instantiate(buttonPrefab);
            button.transform.SetParent(buttonPanel.transform, false);
            button.GetComponentInChildren<Text>().text = letterArray[i];

            FitButtonWidthToText();
        }
    }

    public void FitButtonWidthToText()
    {
        int widthOfTheText = 0;
        CharacterInfo characterInfo;
        foreach (char c in button.GetComponentInChildren<Text>().text)
        {
            button.GetComponentInChildren<Text>().font.GetCharacterInfo(c, out characterInfo, button.GetComponentInChildren<Text>().fontSize);
            widthOfTheText += characterInfo.advance;
        }
        buttonTransform.sizeDelta = new Vector2(widthOfTheText, buttonTransform.sizeDelta.y);
    }

【问题讨论】:

    标签: c# unity3d button layout spacing


    【解决方案1】:

    取消选中子力展开:宽度

    来自the docs

    Child Force Expand:是否强制子布局元素展开以填充额外的可用空间。

    检查 width (resp. height) 将使元素水平填充可用空间 (resp. vertically)。


    编辑:不要Layout Group 的子级上放置 Content Size Fitter。更多信息:Making UI elements fit the size of their content

    根据我们的讨论:因此上述链接中描述的步骤仅适用于 Unity 的最新版本。如果您坚持使用更成熟的版本,您可以保留 ContentSizeFitter 以达到所需的结果,但如果您更改子元素的大小,布局将不会如您所愿自动更新。为了解决这个问题,您可以强制部分重新布局,就像 Stephan-Bthis thread 中解释的那样:

    以下函数LayoutRebuilder.ForceRebuildLayoutImmediate 应该很有用。您可以在层次结构中包含影响相关对象的布局组件的根(顶级父)对象上调用此函数,而不是强制重建所有可能会对性能产生重大影响的画布。

    【讨论】:

    • 谢谢你。我已经取消选中面板和按钮对象上的宽度选项,但是它们都挤在一起了吗?我怎样才能确保他们一个接一个地整齐地坐着?我已在原始帖子中粘贴了该问题的屏幕截图。
    • 好吧,增加 Spacing (同时确保你的单词 RecTransforms 的边界是正确的)
    • 你试过增加Spacing的值吗?成功了吗?
    • 有什么办法可以确保按钮一个接一个?
    • 老实说,我没有使用过这种技术......我的可能更老套,因为我不知道这一点。但是首先尝试文本,然后尝试按钮,如果它不起作用,然后布局如果仍然没有运气。这样你就会知道最有效(工作!)的替代方案。
    【解决方案2】:

    您可以像这样手动计算按钮的宽度。不要使用 LayoutGroup 来控制任何与宽度有关的东西。 您可能想要添加一些额外的空间,按钮非常紧凑,但我将其留给您:D

    using UnityEngine;
    using UnityEngine.UI;
    
    //Just to make sure its put on a button
    [RequireComponent(typeof(Button))]
    public class FitButtonSizeToText : MonoBehaviour
    {
        RectTransform buttonTransform;
        Text buttonText;
    
        void Awake() {
            buttonTransform = GetComponent<RectTransform>();
            buttonText = GetComponentInChildren<Text>();
        }
    
        void Start() {
            FitButtonWidthToText();
        }    
    
        public void FitButtonWidthToText() {
            int widthOfTheText= 0;
            CharacterInfo characterInfo;
            foreach(char c in buttonText.text) {
                buttonText.font.GetCharacterInfo(c, out characterInfo, buttonText.fontSize);
                widthOfTheText += characterInfo.advance;
            }
            buttonTransform.sizeDelta = new Vector2(widthOfTheText, buttonTransform.sizeDelta.y);
        }
    }
    

    【讨论】:

    • 感谢您的代码。我刚刚将它实现到我的项目中,但似乎没有做任何事情......基本上我最初是通过 for 循环创建我的按钮。然后在循环之外我调用你的方法。你认为我的做法正确吗?
    • 脚本在按钮组件所在的同一个游戏对象上的按钮预制件上?按钮的父级也应该有一个布局组(您可以启用除处理宽度的任何内容之外的所有内容,这就是脚本的用途),但在父级、按钮或子级上都没有更适合的内容大小。
    • 但一般来说,您只需要我在FitButtonWidthToText() 中输入的内容,您可以提取该代码并在适合的地方使用它。 widthOfTheText 是文本(我从 Text 组件中提取它,但您也可以将其作为参数传递)在 fontSize (在 Text零件)。如果对您有帮助,我可以逐行评论脚本!?
    • 谢谢。嗯,好吧,所以我在 ButtonPrefab 下制作了一个脚本,将您的代码复制到其中,确保按钮父级有一个水平布局组(未选中宽度)但它不起作用:/可能是您的脚本在我之前运行其他脚本有机会将文本填充到按钮中?
    • 我刚刚意识到,我在Awake 中调用了函数,也许将它移到Start(我也会在答案中编辑)和/或在你设置后手动调用它向上文本。
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多