我的游戏有多个用户同时登录。出现一个初始输入字段,其中有 输入用户,例如,数字“3”表示三个用户要登录。
为了响应输入的数字,我希望 C# 脚本创建输入字段,每个用户登录一个。
以下代码在运行时接受一个数字,然后尝试创建输入字段对象。 名为“nameInputField”的初始输入字段(接受数字)是使用统一编辑器手动添加的;它是 Canvas 的 child 。
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” block 中的任何代码,引用“IDField”的元素, 生成错误消息:“对象引用未设置为对象的实例”。 例如,“Debug.Log (IDField[i].name);”将产生该错误。
如何在运行时创建这些输入字段并将其放置在 Canvas 上?
最佳答案
从根本上说,您必须了解 Instantiate
,这是游戏引擎中绝对基本的过程。 (游戏引擎是基于帧、基于变换的,并且是一个“ECS”;它不是传统的 OO)。
你的问题需要一个
有关游戏引擎基础知识的完整教程,围绕“实例化”展开:
https://unity3d.com/learn/tutorials/modules/beginner/scripting/instantiate
,它在 QA 表格中并不是真正可以回答的。
作为记录,下面是一些典型的代码来实例化一个 UI 元素,在这个例子中是一个按钮
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 多行代码处理尺寸和定位用户界面元素。在现实生活中,您必须这样做。
除其他外,您还必须掌握 Unity 的响应式(Reactive) UI 自动布局系统
http://docs.unity3d.com/Manual/comp-UIAutoLayout.html
(您可以找到 100 多个教程和视频),和/或掌握在代码中手动定位 UI 元素。
关于c# - 如何通过脚本在 Canvas 上创建和放置输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531980/