c# - 如何通过脚本在 Canvas 上创建和放置输入字段

标签 c# unity3d user-input

我的游戏有多个用户同时登录。出现一个初始输入字段,其中有 输入用户,例如,数字“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/

相关文章:

c# - 禁用 Entity Framework 中的自动迁移

c# - 如何从 web.config 添加和访问连接字符串

c# - WPF - ListView 的 ItemsSource 中的绑定(bind)不能是列表

c# - 没有你的车你就没有那么坚强。最快的查找列表

java - 为什么 nextInt() 忽略/n?

python - 权重 python 错误 SyntaxError

c# - unity - 如何在序列化字段更改时更新对象?

java - 无法在 Unity C# 中获取 Activity 的实例

c# - Unity Networking-UNet 中的附加场景加载

java - 如何使用 For 循环获取 Java 中的用户输入?