Unity3D C#:如何根据设置为动态的内容调整输入字段的大小

Unity3D C#:如何根据设置为动态的内容调整输入字段的大小,c#,user-interface,text,unity3d,C#,User Interface,Text,Unity3d,我有一个InputField,从服务器返回一个字符串后,在其中填充文本。我们可以调试整个文本,以便正确接收。但是文本太长,无法放入我们的输入字段。 我基本上需要的是unity提供的内容大小fitter(内容大小fitter在设计上不支持InputFields) 目前,我们正试图用以下代码片段更新InputField的大小 var x = new GUIStyle(); var rectTransform = pvText.GetComponent<RectTransform>();

我有一个InputField,从服务器返回一个字符串后,在其中填充文本。我们可以调试整个文本,以便正确接收。但是文本太长,无法放入我们的输入字段。 我基本上需要的是unity提供的内容大小fitter(内容大小fitter在设计上不支持InputFields) 目前,我们正试图用以下代码片段更新InputField的大小

var x = new GUIStyle();
var rectTransform = pvText.GetComponent<RectTransform>();
var words = pvText.text.Split(' ');
var currentWidth = 0f;
var currentHeight = 0f;
foreach (var word in words)
{
     var size = x.CalcSize(new GUIContent(word + "A"));
     var height = x.CalcHeight(new GUIContent(word), size.x);
     currentWidth += size.x;
     if (currentWidth >= rectTransform.sizeDelta.x)
     {
        currentWidth = size.x;
        currentHeight += height + pvText.textComponent.lineSpacing;
     }
 }
 rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, currentHeight);
var x=new GUIStyle();
var rectTransform=pvText.GetComponent();
var words=pvText.text.Split(“”);
var currentWidth=0f;
var currentHeight=0f;
foreach(单词中的var单词)
{
var size=x.CalcSize(新的GUIContent(word+“A”);
var height=x.CalcHeight(新GUIContent(word),size.x);
currentWidth+=size.x;
如果(currentWidth>=rectTransform.sizeDelta.x)
{
currentWidth=size.x;
currentHeight+=height+pvText.textComponent.lineSpacing;
}
}
rectTransform.sizeDelta=新向量2(rectTransform.sizeDelta.x,currentHeight);

您没有指定字体。计算正确的高度需要字体和字体大小

var x = new GUIStyle
{
    font = pvText.textComponent.font,
    fontSize = pvText.textComponent.fontSize
};
var rectTransform = pvText.GetComponent<RectTransform>();
var words = pvText.text.Split(' ');
var currentWidth = 0f;
var currentHeight = 0f;
foreach (var word in words)
{
    var size = x.CalcSize(new GUIContent(word + "A"));
    var height = x.CalcHeight(new GUIContent(word), size.x);
    currentWidth += size.x;
    if (currentWidth >= rectTransform.sizeDelta.x)
    {
        currentWidth = size.x;
        currentHeight += height + pvText.textComponent.lineSpacing;
    }
}
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, currentHeight);
var x=新的图形用户界面样式
{
font=pvText.textComponent.font,
fontSize=pvText.textComponent.fontSize
};
var rectTransform=pvText.GetComponent();
var words=pvText.text.Split(“”);
var currentWidth=0f;
var currentHeight=0f;
foreach(单词中的var单词)
{
var size=x.CalcSize(新的GUIContent(word+“A”);
var height=x.CalcHeight(新GUIContent(word),size.x);
currentWidth+=size.x;
如果(currentWidth>=rectTransform.sizeDelta.x)
{
currentWidth=size.x;
currentHeight+=height+pvText.textComponent.lineSpacing;
}
}
rectTransform.sizeDelta=新向量2(rectTransform.sizeDelta.x,currentHeight);

或将此UnityScript放在InputField游戏对象上:

#pragma strict

private var inputField : InputField;
private var layoutElement : LayoutElement;


function Awake () {
  inputField = GetComponent.<InputField>();
  layoutElement = GetComponent.<LayoutElement>();
}


// Forces InputField to expand by resizing the background image to the unbounded rect of
// its full text. Remember to set the OnChanged event for the InputField to call this fn.
public function ResizeInput () {
  var fullText = inputField.text;
  var extents : Vector2 = inputField.textComponent.rectTransform.rect.size;
  var settings = inputField.textComponent.GetGenerationSettings(extents);
  settings.generateOutOfBounds = false;
  layoutElement.preferredHeight = new TextGenerator().GetPreferredHeight(fullText, settings);
}
#pragma strict
私有变量输入字段:输入字段;
私有变量layoutElement:layoutElement;
函数唤醒(){
inputField=GetComponent.();
layoutElement=GetComponent.();
}
//通过将背景图像调整为无限矩形,强制InputField展开
//全文。记住为InputField设置OnChanged事件以调用此fn。
公共函数ResizeInput(){
var fullText=inputField.text;
变量范围:Vector2=inputField.textComponent.rectTransform.rect.size;
var设置=inputField.textComponent.GetGenerationSettings(范围);
settings.generateoutofounds=false;
layoutElement.preferredHeight=新文本生成器().GetPreferredHeight(全文,设置);
}

内容大小调整器
添加到您的
输入字段
,它们是占位符和文本(
所有子项

InputField
中,将
上的更改值设置为
ContentSizeFitter.SetLayoutVertical
从您的
输入字段设置为Domotor Zsolti:非常感谢

我有一些小改动可能会对某人有所帮助:
我试图创建一个输入字段,该字段随输入的文本一起展开。

层次:场景>画布创建UI:InputField
(我删除了InputField的占位符子元素)
在InputField:InspectorPanel:InputField:Text中输入占位符文本(例如:“txt”)

层次结构视图:输入字段:文本子组件
RectTransform应设置为“拉伸”
(默认情况下应已设置)
文本子组件大小/角应设置为接近或位于InputField角

InputField:添加组件:布局:ContentSizeFile
ContentSizeFile:HorizontalFit>PreferredSize
现在InputField将缩小到文本大小
如果占位符文本的大小设置为小于InputField,则占位符文本将消失
-通过调整文本组件的大小解决了这个问题(我花了很多时间认为这是一个错误)

输入字段:检查器:OnValueChanged
将InputField拖动到对象窗口
+选择函数:ContentSizeFile:SetLayoutAuthorizontal

我想要水平扩展,但垂直扩展也可以


再次感谢Domotor Zsolti,我只是因为他的帖子才明白这一点。

GUI的新版本(即4.6+)还是GUI的旧版本?新版本unity 4.6你能解释一下在我尝试实现时会发生什么吗?当文本换行时,它不会改变输入字段的高度。我已将InputField.OnValueChanged映射到调用ContentSizeFilter.SetLayoutVertical的方法。但是setlayoutvertical什么都不做。我还缺什么吗?“他们是占位符…”是什么意思。将
Content Size Fitter
添加到输入字段2中。将
垂直配合设置为首选尺寸3。将`On Change Value`设置为
ContentSizeFitter.SetLayoutVertical()
非常感谢你,我甚至无法描述这个答案对我有多有用。