TDD_NPCPos - ChristianDominguezVicente/TFM GitHub Wiki

NPC Possessable

Los NPCs contarán con este script, junto con los tres scripts que componen al jugador, pero desactivados. A continuación, se explicará el script base de los NPC que se pueden poseer, esta situado en /Assets/Scripts.

Awake

Esta función al iniciar el nivel se activa, donde conseguimos la referencia para algunas variables.

SetDialogue

Esta función sirve para establecer que DialogueData se va a usar.

Posses

Esta función gestiona la lógica de cuando un jugador interactúa con un NPC, dividiendose en dos caminos posibles:

  • Si el NPC está dentro de alguna cinemática y no ha empezado aún ejecutará el método PlayDialogue() en el CinematicDialogue asociado.
  • Si no, se ejecutarán la siguiente lógica que se explicará en los siguientes apartados, empezando por llamar al método SetDialogue() para establecer el siguiente diálogo.

Si se está en una Cinemática

  • NextPhrase: Si ha terminado de escribir la frase y no se ha preguntado nada al jugador, pasará a la siguiente frase.
  • CompletedPhrase: Si se esta escribiendo la frase y el jugador pulsa E/X, completará la frase.

Si el jugador ya está poseyendo otro NPC

  • NextPhrase: Si ha terminado de escribir la frase y no se ha preguntado nada al jugador, pasará a la siguiente frase.
  • CompletedPhrase: Si se esta escribiendo la frase y el jugador pulsa E/X, completará la frase.

Si el jugador puede Posseer al NPC

Llama al PossesionManager para iniciar la posesión del NPC si es posible.

EnablePossession

En primer lugar, desactiva los componentese del jugador, para posteriormente activar los componentes del NPC para que el jugador lo pueda controlar. Por último, cambia el seguimiento de la cámara al NPC.

DisablePossession

En primer lugar, desactiva los componentese del NPC, para posteriormente reactivar los componentes del jugador, cambia el seguimiento de la cámara al jugador. Por último, llama a DeactivateControl() para detener el movimiento del NPC al terminar.

Por otra parte, para volver a su posición y rotación de origen se activará su NavMeshAgent, habiendo dos opciones:

  • Si el NPC ha pasado por unas Stairs: Llamará a una corrutina llamada PathFinding(), la cual a través de NavMeshAgent.SetDestination(stairs.position), irá en primer lugar hacia las Stairs que uso previamente, para posteriormente realizar la segunda opción.
  • Si el NPC no ha pasado por unas Stairs: Volverá a su posición de origen mediante NavMeshAgent.SetDestination(originalPosition), ejecutando posteriormente la corrutina OriginalRotation(), la cual colocará al NPC en su rotación original antes de ser poseído por el jugador.

NextPhrase

Esta función avanza el diálogo al siguiente nodo del guion, pudiendo ser una frase o una pregunta.

  • Si el índice está fuera de rango: terminará el diálogo llamando a la función EndDialogue().
  • Si se ha conseguido una referencia del blur: se activará el blur mediante la corrutina SetBlur(true).
  • Si el nodo es una frase: empezará a escribir la siguiente frase activando la corrutina WritePhrase("con la frase correspondiente").
  • Si el nodo es una pregunta: mostrará las respuestas correpondientes a la pregunta, llamando a la función ShowChoices("pregunta").

EndDialogue

Esta función termina del diálogo actual, limpiando el estado interno y restablece todas las variables relacionadas.

WritePhrase

Esta corutina escribe letra por letra una frase en pantalla. Se añadirá la frase al histórico.

  • Recorre cada carácter de la frase: Dependiendo si esta activado el modo Skip o no, cambiará la velocidad de escritura.
  • Actualiza el índice del diálogo si es una Frase: Pasa a la siguiente frase de la conversación.

CompletedPhrase

Esta función finaliza la escritura de una frase, mostrandola completa de inmediato, avanzando el índice del diálogo. Se añadirá la frase al histórico.

  • Si el nodo es una Frase: Habiendo una corutina de escritura activa, se desactivará deteniendo la escritura y actualizando el índice al siguiente nodo.

ShowChoices

Esta función muestra una pregunta con sus respuestas para que el jugador responda, pausando la conversación. Se añadirá la frase al histórico.

SelectCurrentChoice

Esta función maneja la selección de una respuesta del jugador a una pregunta, avanzando al siguiente nodo del diálogo mediante NextPhrase(). Se añadirá la frase al histórico.

  • Si el índice está fuera de rango: terminará el diálogo llamando a la función EndDialogue().
  • Si es una Cinemática: Se registrará en el histórico si el jugador estaba poseyendo a un NPC o no al responder la pregunta.
  • Si no es una Cinemática: Se registrará en el histórico que NPC estaba poseyendo.

AutoTalk

Esta función activa la conversación automática, sin que el jugador tenga que interactuar manualmente.

  • Si se activa el modo Auto: Iniciará la corrotina AutoTalkCouroutine().
  • Si se desactiva el modo Auto: Detendrá la corrotina AutoTalkCouroutine().

SkipTalk

Esta función activa omitir la conversación, pasará rápidamente el diálogo sin que el jugador haga nada.

  • Si se activa el modo Skip: Iniciará la corrotina SkipTalkCouroutine().
  • Si se desactiva el modo Skip: Detendrá la corrotina SkipTalkCouroutine().

Update

En esta función, la cual se ejecuta en cada frame, actualizará la rotación del NPC que esta poseyendo el jugador y del NPC con el que interactúa durante una conversación, pero no durante una cinemática.

Por otra parte, si el jugador no esta poseyendo al NPC, si este no esta en su posición original es que está volviendo a ella, por lo que se actualizarán las animación de movimiento mediante el parámetro Speed del Animator. Si ya está en la posición original, se pondrá a 0 el parámetro Speed, ejecutando la animación de Idle.

SetDialogueIndex

Esta función establece un nuevo índice para el diálogo al ser llamada.

StartCinematicDialogue

Esta función inicia un diálogo en una Cinemática, mostrando el diálogo correspondiente, bloqueando al jugador y NPCs durante la Cinemática. Empezará el sistema de diálogo como se explican en las demás funciones al llamar a NextPhrase().

StartListeningDialogue

Esta función inicia el escuchar un diálogo, mostrando el diálogo correspondiente, bloqueando al jugador y NPCs. Se utilizará el ScriptableObject con los diálogos correspondientes a escuchar la conversación. Empezará el sistema de diálogo como se explican en las demás funciones al llamar a NextPhrase().

SetBlur

En cualquier conversación se llamará a esta corrutina, la cual mediante una transición Mathf.Lerp(), se activará o desactivará el blur en la escena, haciendo que el jugador se centre más en los diálogos del juego.

SetTimeBtLetters

Función que permite modificar el tiempo entre letras desde los ajustes del menú.

RemoveBlur

Función que permite remover el blur durante una conversación.