在 Unity 中增加 InputField 列表

Growing InputField list in Unity

我需要统一实现输入字段,这些字段将根据列表中的元素动态添加。它应该根据地图中存在的对象增加 "m_myClassMap"。

此外,是否可以获取现有输入字段的位置、布局设置(即 x、y、z 坐标)?我想要这些信息来计算新输入字段的位置。

例如

 List<InputField> inputFieldList = new List<InputField>();

 foreach (MyClass myClassObj in m_myClassMap.Values)
 {
        // code below is just statement and is syntactically wrong
        InputField newInputField = new InputField();
        // Add properties like size or layout
        // set the text
        inputFieldList.Text = myClassObj.getInputBoxString();
        inputFieldList.Add(newInputField );
 }

我不确定它是否可能..欢迎任何帮助:)

谢谢!

这里最可靠的做法是使用布局组。这种方法有很多经过良好测试的功能。

首先添加一个父对象。并向其中添加一个 Vertical Layout Group 组件。我通过向蓝色面板添加红色面板来显示下面的层次结构。红色面板上是 Vertical Layout Group

在此示例中,我使用检查器手动添加了 4 个输入字段。注意这里的布局是自动的。我在下面包含了这个特定输入字段的设置,您将能够在检查器中进行试验,并很快看到各种选项的影响。

现在对于您的特定解决方案,您希望以编程方式而不是通过检查器添加项目。为此,您需要创建一个 GameObject 并引用包含布局组的对象。

程序化创作

下面的代码会将预制件列表添加到 class。 (在这种情况下,父 class 应该包含 Vertical Layout Group 组件)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; 

public class LayoutGroupExample : MonoBehaviour {

    public GameObject layoutObject; 
    public GameObject inputFieldPrefab;     

    void AddInputFields(){
        var inputFieldList = new List<string>(){"First Name", "Last Name", "Email"}; 

        foreach(var fieldName in inputFieldList){
            GameObject go = GameObject.Instantiate(inputFieldPrefab); 
            go.name = fieldName; 
            go.transform.SetParent(layoutObject.transform); 
            var inputField = go.AddComponent<InputField>(); 
        }
    }
}

在检查器中,将包含布局组的对象分配给 layoutObject 字段。

将预制件(应该是 Input Field 对象)分配给 inputFieldPrefab 字段)