如何解决调整可序列化列表大小Unity C#
目前我有一个名为 QuestionAnswers 的可序列化类,其内容如下:
public string question;
public string[] answers;
public int correctAnswer;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class QuestionAnswers
{
public string question;
public string[] answers;
public int correctAnswer;
}
在名为 ListManager 的普通 MonoBehavIoUr 脚本中,我将名为 QuestionAnswers 的可序列化类引用为 QnA:
public List<QuestionAnswers> QnA;
public class ListManager : MonoBehavIoUr
{
public List<QuestionAnswers> QnA;
在检查器中,公共列表QnA显示如下
我的问题是如何通过 inputfield.text 字段在 Listmanger 脚本中更改 QnA 大小值(当前为 1,如上所示)和答案大小值(当前为 4,如上所示)。
注意List QnA的结构(如上图)应该保持不变,正确答案值连接到答案,答案连接到问题。
示例:
当我将 QnA 大小值增加到 3 时,检查员会显示以下内容:
Inspector Image 2 (注意每个元素左边的箭头)
Inspector Image 3 (注意每个答案左边的箭头)
当我点击答案时,检查员会显示以下内容: Inspector Image 4 (我在检查器中的每个答案旁边都添加了值 4)
简单回顾一下我的问题:
如何通过 inputfield.text 字段在 Listmanger 脚本中更改 QnA 大小值(当前为 1,如上所示)和答案大小值(当前为 4,如上所示)。
请注意,List<QuestionAnswers> QnA
(如上所示)的结构应保持不变,正确答案值连接到答案,答案连接到问题。
解决方法
这是一个列表,因此您可以简单地使用 Add
和 RemoveAt
条目,直到列表具有您想要的大小,例如
[SerializeField] InputField input;
private void Start ()
{
input.contentType = ContentType.IntegerNumber;
input.onValueChanged.AddListener(OnValueChanged);
}
private void OnInputValueChanged(string newInput)
{
if(!int.TryParse(newInput,out var newCount)
{
Debug.LogError($"\"{newInput}\" is no valid number!",this);
return;
}
if(newCount < 0)
{
Debug.LogError("Negative values are not allowed!",this);
return;
}
if(newCount == QnA.Count)
{
Debug.Log("Already same count",this);
return;
}
while(newCount > QnA.Count)
{
QnA.Add(new QuestionAnswers());
}
while(newCount < QnA.Count)
{
QnA.RemoveAt(QnA.Count - 1);
}
}
或者简单地创建一个具有正确大小的新列表
private void OnInputValueChanged(string newInput)
{
if(!int.TryParse(newInput,this);
return;
}
if(newCount < 0)
{
Debug.LogError("Negative values are not allowed!",this);
return;
}
QnA = new QuestionAnswers[newCount].ToList();
}
很大程度上取决于您的具体用例。
如果您希望默认情况下已经初始化它们,那么答案将自动具有 4
大小
public string[] answers = new string[4];
,
我想我解决了这个问题。
这是我的名为 QnA 的可序列化列表的代码
int newsize = 3 (This value will eventually come from an inputfield)
[Serializable]
private class QnA
{
public string question;
public string[] answers;
public int correctAnswer;
}
然后我做了一个像这样的serializedField
[SerializeField] private QnA[] qnaArray;
在我的 Start 函数中只是做了以下操作
public void Start()
{
qnaArray = new QnA[newsize];
}
因此,当我运行应用程序时,QnA 大小会自动更改为 newsize int 值。 我现在将继续尝试通过代码更改答案值并实现输入字段以替换newsize int。
感谢大家的帮助。 非常感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。