Episodix: Iteración 1

A continuación se describirá la Iteración 1 del proyecto Episodix.

El estructura de la Iteración 1 será la siguiente:

  • Learning Phase: El usuario camina (al estilo FPS) por una calle vacía. En el lado derecho aparecen sólidos tridimensionales sencillos (cubo, esfera, cilindro).
  • Recall Phase:  Cuando llega al final de la calle el juego le presenta preguntas sí/no para comprobar si recuerda qué sólidos tridimensionales ha visto mientras caminaba por la calle.
  • Scores: Finalmente el juego presenta la puntuación obtenida. No se guarda en ningún lado.
Scene

La Scene iteration_1 es la única existente y se compondrá de los siguientes objetos:

  • Directional light: alumbrará nuestra Scene.
  • Street: será la calle vacía con los sólidos tridimensionales en su lado derecho. Además tendrá cuatro paredes invisibles para evitar que el jugador caiga al vacío. Se almacenará como prefab.

Scene-street

  • FPSController: personaje con vista en primera persona que manejará el usuario para moverse por la calle y observar el entorno. Está sacado de los Standard Assets de Unity. Se desplazará con las teclas WASD y empleará el ratón para mover la vista.

Scene-FPSController

  • Recall Phase: es una UI (User Interface) en la que se mostrarán las preguntas al usuario, que tendrá que responder haciendo clic el el botón Sí/No (Question 1, Question 2, Question 3). Una vez finalizado el test podrá elegir si quiere reiniciar la prueba o salir del juego (Score_txt). Esta interfaz aparecerá cuando el usuario llegue al final de la calle. Cada pregunta constará de un texto con la pregunta y dos botones (Sí/No) para responderla.

Scene-Recall_Phase_pregunta

  • EventSystem: se creará automáticamente al crear un Canvas ( un elemento usado para el renderizado de pantalla de la UI , el objeto Recall Phase en nuestro caso) para controlar los eventos del mismo.
  • CheckEnd: pared invisible con el collider puesto en modo Trigger que se usará para detectar el momento en el que el jugador llega al final de la calle.

Scene-CheckEnd

  • Scores: objeto vacío que recogerá y almacenará las respuestas del usuario mediante un script asociado.
Scripts

En la Iteración 1 se hará uso de un total de cuatro C# scripts:

  • EndMenu.cs : constará de dos funciones. Una para reiniciar el nivel y otra para cerrar el juego. Este script estará asociado a FPSController.

using UnityEngine;
using System.Collections;

public class EndMenu : MonoBehaviour
{
// Esta funcion reinicia el nivel.
public void ResetLevel ()
{
Application.LoadLevel ("iteration_1");
}

// Esta funcion cierra el juego.
public void ExitGame ()
{
Application.Quit ();
}
}

Script-EndMenu

  • Scores.cs : constará de dos funciones. La primera recogerá la respuesta del usuario a una pregunta. La otra comprobará si es correcta y almacenará los resultados; si es la última pregunta calcula el porcentaje de acierto del usuario. El script estará asociado al objeto Scores.

using UnityEngine;
using System.Collections;

public class Scores : MonoBehaviour {

public float rightAnswers; // Mostrara el numero de respuestas correctas en inspector.
float rA; // Numero de respuestas correctas con las que trabajaran las funciones.
public float totalAnswers; // Mostrara el numero de respuestas totales en inspector.
float tA; // Numero de respuestas totales con las que trabajaran las funciones.
public float totalQuestions; // Numero de preguntas totales. Se establecera su valor en Inpector.
public float results; // Almacenara el porcentaje de acierto de las respuestas.

bool answer; // Almacenara la respuesta a una pregunta (Si o No)

// Recogera la respuesta del usuario a una pregunta.
//
public void CollectAnswer(bool ans)
{
answer = ans;
}

// Comprobara si el usuario ha acertado con su respuesta a la pregunta, añadira el resultado y lo almacenara con el resto.
// Si era la ultima pregunta del test, calculara el porcentaje de acierto del usuario a todas las respuestas.
//
public void AddScore (GameObject solid)
{
rightAnswers = rA;
totalAnswers = tA;

if (solid.activeInHierarchy==answer)
{
++rA;
rightAnswers = rA;
++tA;
totalAnswers = tA;
} else
{
++tA;
totalAnswers = tA;
}

if (totalQuestions == tA) {
results = (rA / tA) * 100;
rA = 0;
tA = 0;
}
}
}

Script-Scores

  • ShowScores.cs : almacenará en el componente Text del objeto al que está asociado el porcentaje de aciertos del usuario a las preguntas, basándose en el script Scores.cs que se le pase por Inspector del que tomará los resultados. El script estará asociado al objeto Scores_txt.

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

// Almacena en el componente Text los resultados obtenidos de las respuestas del test.
//
public class ShowScores : MonoBehaviour
{

Text text; // Almacenara el texto que mostrara el porcentaje de acierto a las preguntas.

float scores; // Almacenara el porcentaje de acierto del usuario.

public Scores scr; // Almacenara el componente Scores(Script) que se le pase en Inspector.

void Awake ()
{
text = GetComponent<Text> ();
}

void Update ()
{
scores = scr.results;
scores *= 100;
scores = Mathf.Round(scores);
scores /= 100;
text.text = "Porcentaje de aciertos: " + scores +"%.";
}
}

Script-ShowScores

  • StartRecallPhase.cs : comprueba si el personaje atraviesa el objeto CheckEnd que marca el fin de la calle. De ser así finaliza la Learning Phase y lanza la Recall Phase. El script estará asociado al objeto CheckEnd.

using UnityEngine;
using System.Collections;

public class StartRecallPhase : MonoBehaviour
{
public GameObject q1; // Almacenara el objeto de la primera pregunta del test.
public GameObject fpsc; // Almacenara el objeto del personaje.
public GameObject cam; // Almacenara el objeto de la camara de la Recall Phase.

// Comprueba si el personaje atraviesa al objeto que marca el fin de la calle y de
// ser asi comienza la Recall Phase.
//
void OnTriggerEnter(Collider other)
{
if (other.CompareTag ("Player"))
{
q1.SetActive (true);
fpsc.SetActive (false);
cam.SetActive (true);
}
}
}

Script-StartRecallPhase

También debemos tener en cuenta que cuando hacemos clic en uno de los botones que saldrán en la pantalla, se llamará a ciertas funciones de los scripts para realizar su acción correspondiente. En los botones de respuesta Sí/No de las preguntas siguen siempre el mismo esquema.

  1. Cuando pulsamos uno de ellos se desactivará el objeto correspondiente a esa pregunta y se activará el objeto de la siguiente pregunta. En caso de ser la última pregunta activará el objeto que muestra el porcentaje de éxito de las respuestas del usuario.
  2. Lo siguiente que hará será llamar a la función CollectAnswer del script Scores, pasándole como parámetro el valor correspondiente de la respuesta (true para Sí, false para No), para recoger la respuesta del usuario a la pregunta.
  3. Por último, se llamará a la función AddScore, a la que se le pasará como parámetro el objeto de la Hierarchy por el cual se pregunta si ha visto el usuario.  La función comprobará si coincide la respuesta del usuario con la existencia en la Scene del objeto en cuestión (dependerá de si está activado o desactivado) y almacenará el resultado. Si es la última pregunta calculará el porcentaje de acierto final.

BotonSiPreguntaBotonNoPregunta

Cuando se muestra el porcentaje de acierto también aparecerán dos botones: «Reiniciar Test» y «Salir». El primero cargará la Scene de nuevo llamando a la función ResetLevel del script EndMenu para realizar la Iteración 1 de nuevo. El segundo cerrará el juego llamando a la función ExitGame del script EndMenu.

BotonRestartBotonExit

Un comentario en “Episodix: Iteración 1

Deja un comentario