[Programación] Listas con Unity

marod

A ver, pregunta de noob, pero que no consigo hacer que me salga.

Yo tengo esta clase Questions, donde me creo un constructor con la pregunta, sus respuestas, etc. También dentro de esta, me creo tres listas y luego en un metodo Init() las inicializo y ya las relleno.

using UnityEngine;
using System.Collections.Generic;

public class Questions : MonoBehaviour {
	
private string question, answer1, answer2, answer3, answer4;
private int correctAnswer;

public List<Questions> videogames;
public List<Questions> movies;
public List<Questions> history;


public Questions(string question, string answer1, string answer2, string answer3, string answer4, int correctAnswer)
{

	this.question = question;
	this.answer1 = answer1;
	this.answer2 = answer2;
	this.answer3 = answer3;
	this.answer4 = answer4;
	this.correctAnswer = correctAnswer;

}

	
public void InitQuestions()
{

	videogames = new List<Questions>();
	movies = new List<Questions>();
	history = new List<Questions>();

...

El problema viene cuando me quiero ir al GameManager, y quiero acceder a esas listas. Me declaro una variable de la clase Questions y a partir de ahí accedo a las listas a traves de un metodo.

void ShowQuestionType()
	{
		switch(typeQuestions)
		{
		case QuestionTypes.Movies:

		Questions question = questions.movies[0]; //Me deberia sacar la pregunta 1, con su título, su respuesta1...
                    string answer1 = question.answer1 //Nothing happens



		break;

	case QuestionTypes.Videogames:
		break;

	case QuestionTypes.History:
		break;
	}

Peeeero, en el paso de crear un string para coger la respuesta 1, unity no me detecta nada. ¿Estoy haciendo algo mal?

KoRMuZ

Yo, desde la más absoluta ignorancia, intentaría hacer un dump de questions.movies a ver que te sale. Lo mismo tienes que acceder del rollo questions.movies.0 en vez de como un array, al ser un objeto, o recorrerlo de otra forma.

Si questions.movies está vacío, ya sabes donde está el fallo, al llenarlo. Si tiene cosas, es la forma de acceder

The-Force

#1 private string question, answer1, answer2, answer3, answer4;
Si el campo es privado no puedes acceder a el desde fuera de la propia clase, tendría que ser public.
Lo que esto debería darte un error de compilación.

1 respuesta
Naith

¿Por qué tienes unas lista de "questions" dentro de la propia clase Questions? No lo entiendo. :psyduck:

1 respuesta
marod

#3 Es de ser inutiles. Muchas gracias, era eso y yo no me daba cuenta.

#4 Porque las declaro en el metodo Init, y el metodo Init lo declaro desde el Game Manager

2 respuestas
Naith

#5
No me refiero a eso.

Me refiero a que si lo haces como lo estas haciendo, cuando accedes al objeto Question con la información lo que haces es:

Question -> Lista -> Question donde tienes la información. (A demás que este ultimo objecto question tiene a su vez 3 listas, no inicializadas).

Si declarases las listas en la clase GameManager (no uso unity a si que no se si esto que acabo de poner tiene mucho sentido) lo que harías sería:

Lista -> question que tiene la información.

Si no entiendes lo que quiero decir, luego te hago un ejemplo en código.

3 respuestas
FernandoA

#5 Creo que #6 a lo que se refiere es básicamente a la organización.

Es como si en un videojuego tuvieses el método InicializarInventario() (donde creas la lista de Items) dentro de la clase Item. Es más lógico tener el método en la clase GameManager.

Si lo organizas tal como está, las listas deberían ser campos static. (Campos de clase, vamos)

1 respuesta
marod

#6 Creo que entiendo lo que dices.

#7 Tengo un poco de cacao mental en cuanto al código porqué uso tres clases:

  • La clase de Questions donde tengo las listas sin inicializar, que las inicializo en el metodo de añadir preguntas, y añado las preguntas a las listas.

  • La clase Game Manager donde inicializo la clase Questions para que nada más empiece el juego acceder al metodo de añadir preguntas.

  • La tercera y última, que es donde accedo a los items de las listas a traves de la instancia de Game Manager y la variable de clase Questions creada en Game Manager.

Un lio vamos, y no sé hasta que punto esto estaría bien xD

2 respuestas
E

#8

  • Si tienes una clase Questions (perfecto), en el CONSTRUCTOR es donde inicializas las listas.
  • ¿Que tal si creas una clase Question (sin la S), donde el constructor sea Question (Enum tipoPregunta, String respuestaA, String respuestaB, ... ), dentro de Question te haces un par de métodos que comprueben si la respuesta es correcta o lo que quieras.
  • Si te haces la clase Question, cambia el tipo de List. Y para añadir una pregunta, simplemente haces un list.add(new Question(TypeQuestion.History, ...etc...)
1 1 respuesta
FernandoA

#8 El problema tal como está y que te dice #6 es que:

Por cada objeto Questions que instancies, con sólo uno, ese objeto tendrá:

  • 1 string con la pregunta
  • 4 strings con las respuestas
  • 1 int con la respuesta correcta
  • ¡¡¡Y 3 listas de Questions!!!
  • - Que a su vez tendrán, cada lista
  • - - Un montón de objetos Questions de lo que cada uno de los objetos Questions tendrán
  • - - - 1 string con la pregunta
  • - - - 4 strings con las respuestas
  • - - - 1 int con la respuesta correcta
  • - - - ¡¡¡Y 3 listas de Questions!!!
  • - - - - Que a su vez tendrán, cada lista
  • - - - - - 1 string con la pregunta........ etc etc bucle infinito

Básicamente estás utilizando el mismo objeto (Questions) para la pregunta y para el cuestionario en sí. Si solo vas a tener un cuestionario (con las 3 listas de preguntas que ya tienes ahí) lo solucionas facilísimo como te dije. Simplemente convierte esas listas en propiedades de clase con static.

public static List<Questions> movies;

Así puedes acceder a ellas directamente con

Questions.movies[0]

En este código accedías instanciando primero

//Supongo que instanciabas en este plan
Questions questions = new Questions(blablabla)
//Y lo que pones en tu código
Questions question = questions.movies[0];

El método que tienes para inicializar las listas también tendría que ser de clase

public static void InitQuestions()

Y en el Awake() o Start() de la clase GameManager, lo primero hacer

Questions.InitQuestions()

Si quieres poder tener más cuestionarios, como dice #9, lo normal sería tener una clase para el cuestionario (Por ejemplo Questions) y otra para cada pregunta (Por ejemplo Question). En la clase Questions crear las 3 listas de Question y en la clase Question tener solo la pregunta, las respuestas y la respuesta correcta.

1 1 respuesta
marod

#10 Me parece mucho mas elegante lo de usar Static, gracias. :D

Usuarios habituales

  • marod
  • FernandoA
  • elraro
  • Naith
  • The-Force
  • KoRMuZ