Cambiar el tamaño del tamaño de la lista serializable (Unity C#)

CorePress2024-01-24  13

Actualmente tengo una clase serializable llamada QuestionAnswers con lo siguiente:

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;
}

En mi script MonoBehaviour normal llamado ListManager hago referencia a la clase serializable llamada QuestionAnswers como QnA:

public List<QuestionAnswers> QnA;
public class ListManager : MonoBehaviour
{

public List<QuestionAnswers> QnA;

en el inspector, la lista pública QnA se muestra a continuación

Imagen del inspector 1

Mi pregunta es cómo puedo cambiar el valor del tamaño de QnA (actualmente 1, como se muestra arriba) y el valor del Tamaño de las respuestas (actualmente 4, como se muestra arriba) en mi script ListManger a través de un campo inputfield.text.

Tenga en cuenta que la estructura de la lista QnA (como se muestra arriba) debe permanecer igual ya que el valor de la respuesta correcta está conectado a las respuestas y las respuestas están conectadas a la pregunta.

Ejemplo:

Cuando aumento el valor del tamaño de QnA para decir3 el inspector muestra lo siguiente:

Imagen del inspector 2 (Tenga en cuenta las flechas a la izquierda de cada elemento)

cuando hago clic en cada elemento, el inspector muestra lo siguiente:

Imagen del inspector 3 (tenga en cuenta las flechas a la izquierda de cada respuesta)

Cuando hago clic en Respuestas, el inspector muestra lo siguiente: Imagen del inspector 4 (He añadido el valor 4 al lado de cada Respuesta en el inspector)

Solo para resumir mi pregunta:

¿Cómo puedo cambiar el valor del tamaño de QnA (actualmente 1, como se muestra arriba) y el valor del tamaño de las respuestas (actualmente 4, como se muestra arriba) en mi script ListManger a través de un campo inputfield.text?

Tenga en cuenta que la estructura de la Lista<PreguntasAnswers> QnA (como se muestra arriba) debe permanecer igual ya que el valor de la respuesta correcta está conectado a las respuestas y las respuestas sonconectado a la pregunta.

a través de un campo inputfield.text, ¿quieres decir que quieres un elemento de campo de entrada de UI en tu escena que te permita cambiar el tamaño de tu lista?

-NicknEma

27/03/2021 a las 20:09

Esto es correcto

-DesertFoxx

27 de marzo de 2021 a las 20:20



------------------------------------

Es una lista por lo que puedes simplemente agregar y quitar entradas hasta que la lista tenga el tamaño que deseas, como por ejemplo

[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);
    }   
}

O simplemente crea una nueva lista con el tamaño correcto como

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;
    }

    QnA = new QuestionAnswers[newCount].ToList();
}

Depende mucho de su caso de uso exacto.

Las respuestas tendrían automáticamente el tamaño 4 si prefieres inicializarlas de forma predeterminada como

public string[] answers = new string[4];

2

QnA.Add y QnA.Remove dan errores al ver elQnA como una matriz y no una lista

-DesertFoxx

27/03/2021 a las 20:47

@DesertFoxx en su pregunta es claramente una Lista<QuestionAnswers> y definitivamente no es una matriz... solo podemos proporcionar respuestas basadas en el código que usted proporciona... Por cierto, en la segunda solución ya tengo exactamente lo que está haciendo en su respuesta ahora... Excepto que ya le dije cómo obtenerlo. el valor del campo de entrada en su lugar y si el suyo es una matriz, simplemente omita la llamada ToList()...

-derHugo

27/03/2021 a las 21:03



------------------------------------

Creo que resolví el problema.

Este es mi código para la lista serializable llamada 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;
    }

Luego hice un campo serializado como este

[SerializeField] private QnA[] qnaArray;

En mi función Inicio acabo de hacer lo siguiente

public void Start()
{
    qnaArray = new QnA[newsize];

}

Entonces, cuando ejecuto la aplicación, el tamaño de QnA cambia automáticamente al valor int de tamaño nuevo. Ahora continuaré intentando cambiar el valor de la respuesta a través del código e implementaré el campo de entrada para reemplazar el newsize int.

Gracias por la ayuda de todos. Se agradece mucho.

Compartir Seguir Respondido

27 de marzo de 2021 a las 21:00

DesiertoFoxx

DesiertoFoxx

1

1

1 insignia de bronce

1

La siguiente pregunta es ¿cómo accedo a la cadena pública[]responda en la clase serializable para cambiar su valor.

-DesertFoxx

27/03/2021 a las 21:27

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare