如何通过脚本在 canvas 上创建和放置输入字段

How to create and place input fields on a canvas via script

我的游戏有多个用户同时登录。出现一个初始输入字段,其中有 输入用户,例如,数字“3”表示三个用户要登录。

为了响应输入的数字,我希望 C# 脚本创建输入字段,每个用户登录一个。

以下代码在运行时接受一个数字,然后尝试创建输入字段 objects。 名为 'nameInputField' 的初始输入字段(用于接受数字)是使用统一编辑器手动添加的;它是 child 到 canvas。

using System;
using UnityEngine ;
using UnityEngine.UI ;
using UnityEngine.EventSystems ;

public class LoginWindow : MonoBehaviour 
{
private InputField nameInputField = null; // Assign in editor
string placeHolderText ;
int NUsers ;
InputField[] IDField;

private void Start()
{       
    placeHolderText = nameInputField.placeholder.GetComponent<Text> ().text = "Number of users ...";
    InputField.SubmitEvent submitEvent = new InputField.SubmitEvent();
    submitEvent.AddListener(SubmitName); // Add listener to catch the submit
    nameInputField.onEndEdit = submitEvent;
}

private void SubmitName(string number)
{
    Int32.TryParse(number, out NUsers) ; // convert string to number
    IDField = new InputField[NUsers] ;
    Debug.Log ("IDField.Length = " + IDField.Length );
    for (int i = 0 ; i < NUsers ; i++ ){
               // problems here !  reference to IDField[i] generates an error !
                    } // end 'for'
} // end SubmitName

} // end LoginWindow 

代码似乎创建了一个 InputField 数组; 在运行时,如果我输入“3”,我会收到消息 "IDField.Length = 3"。 但是在任何地方都没有这些输入字段的迹象:无论是在层次结构、场景还是游戏中。 此外,我放在 'if' 块中的任何代码,引用 'IDField' 的元素, 生成错误消息:"Object reference not set to an instance of an object"。 例如,"Debug.Log (IDField[i].name);" 将生成该错误。

如何在运行时在 canvas 上创建和放置这些输入字段?

从根本上讲,您必须了解 Instantiate 这绝对是游戏引擎中的基本过程。 (游戏引擎是基于帧的,基于变换的,并且是“ECS”;它不是传统的 OO)。

您的问题需要

有关游戏引擎基础知识的完整教程,围绕“实例化”展开:

https://unity3d.com/learn/tutorials/modules/beginner/scripting/instantiate

,在 QA 表格中并不是真正可以回答的。

作为记录,以下是实例化一个UI元素的一些典型代码,在这个例子中是一个Button

public SoundButton exampleButton;
...

private void NewOnRight(SBB s)
    {
    GameObject nu = Instantiate(exampleButton.gameObject);
    nu.transform.SetParent(buttonsHolder, false);
    nu.SetActive(true);
    nu.name = s.soundCode;
    
    SoundButton nusb = nu.GetComponent<SoundButton>();
    
    nusb.Info = s;
    nusb.theStar.enabled = false;
    nusb.topColor = daBoss.TopColorFor(s);
    nusb.bottomColor = daBoss.BottomColorFor(s);
    }

作为一个额外的并发症,在该代码中我使用了 Unity 的布局系统 - 所以你看不到 100 行处理 UI 元素的大小和定位的代码。在现实生活中你将不得不做所有这些。

除其他外,您还必须掌握 Unity 的响应式自动布局系统 UI

http://docs.unity3d.com/Manual/comp-UIAutoLayout.html

(您可以找到 100 多个教程和视频),and/or,掌握在代码中手动定位 UI 个元素。