C# 如何删除Unity3D中按钮之间的间距?

C# 如何删除Unity3D中按钮之间的间距?,c#,unity3d,button,layout,spacing,C#,Unity3d,Button,Layout,Spacing,我在Unity中设计的游戏中以编程方式创建按钮。我实例化了按钮预置,并将它们作为画布上Panel对象的父对象。我已将面板设置为具有以下属性的水平布局组: 我已将以下组件添加到按钮预制中,以实现我所需的外观: 完成所有这些之后,我得到的结果是: 因此,我的问题是,如何删除每个按钮之间的间距?按钮应该紧挨着彼此(但不重叠),看起来像一个句子。我之所以有单独的按钮,是因为用户需要单击句子中正确的2个字母字符(在上面的示例中是字母ar)。我已将属性上的间距设置为0,并选中/取消选中了各种选项,但运

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

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

完成所有这些之后,我得到的结果是:

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

我已经在面板和按钮对象上取消选中了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);
    }
for(int i=0;i
取消选中子强制展开:宽度

发件人:

子强制展开:是否强制展开子布局元素以填充其他可用空间

检查宽度(分别为高度)将使元素水平(分别为垂直)填充可用空间


编辑:不要在版面组的子级上放置内容大小调整器。更多信息:

根据我们的讨论:因此上述链接中描述的步骤只适用于Unity的最新版本。如果您使用的是更成熟的版本,您可以保留ContentSizeFilter以获得所需的结果,如果您更改子元素的大小,布局将不会像您预期的那样自动更新。要解决此问题,您可以强制进行部分重新布局,如Stephan-B在:

下面的函数应该被证明是有用的。您可以对层次结构中的根(顶部父对象)对象调用此函数,而不是强制重新生成可能会对性能产生重大影响的所有画布,该层次结构包含影响所述对象的布局组件


您可以像这样手动计算按钮的宽度。不过,不要使用布局组来控制与宽度有关的任何内容。 你可能想增加一些额外的空间,按钮都很紧凑,但我把这留给你: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);
    }
}
使用UnityEngine;
使用UnityEngine.UI;
//只是为了确保它能按上按钮
[要求组件(按钮类型))]
公共类FitButtonSizeToText:单一行为
{
矩形变换按钮变换;
文本按钮文本;
无效唤醒(){
ButtontTransform=GetComponent();
buttonText=GetComponentChildren();
}
void Start(){
FitButtonWidthToText();
}    
公共无效FitButtonWidthToText(){
文本的int宽度=0;
CharacterInfo CharacterInfo;
foreach(buttonText.text中的字符c){
buttonText.font.GetCharacterInfo(c,out characterInfo,buttonText.fontSize);
文本宽度+=characterInfo.advance;
}
ButtontTransform.sizeDelta=新矢量2(文本的宽度,ButtontTransform.sizeDelta.y);
}
}

谢谢你。我已经在面板和按钮对象上取消选中了宽度选项,但是它们都挤在一起了?我怎样才能确保他们一个接一个地整齐地坐着?我已经在我的原始帖子中粘贴了一个问题的截图。那么,增加间距(同时确保单词的矩形转换的边界是正确的)你是否尝试过增加间距的值?它起作用了吗?有没有办法确保按钮一个接一个地放好?老实说,我没有用过这种技术。。。因为我不知道这件事,所以我的可能有点烦人。但是,首先尝试文本,然后按钮,如果它不工作,然后布局,如果仍然没有运气。这样你就会知道最有效的(工作!)选择。谢谢你的代码。我刚刚在我的项目中实现了它,但似乎什么都没做。。。基本上,我最初是通过for循环创建按钮的。然后在循环之外我调用你的方法。你认为我这样做对吗?脚本在按钮组件所在的同一个游戏对象上的按钮预置上?此外,按钮的父级应该有一个布局组(您可以启用除处理宽度的任何内容之外的所有内容,这是脚本的作用),但在父级、按钮或子级上都没有内容大小匹配器。但通常,您只需要我在
FitButtonWidthToText()中输入的内容,您可以提取该代码并在任何适合的地方使用它
widthoftext
是给定字体(我也从文本组件中提取)时,文本(我从文本组件中提取文本,但您也可以将其作为参数传递)在fontSize(在文本com中设置)下所占的空间