Introducción

1

Game Design del juego

2

La estructura y assets de un proyecto en Unity

3

Convirtiendo nuestros assets en Tiles

4

Tilemaps y creación del escenario

5

Bonus: FastForward de la creación del escenario, sorting layers y creación de colliders

6

Acá encontrarás los archivos de este curso

Personaje principal: Movimiento y Animaciones

7

El jugador y el movimiento

8

Creando nuestra primera animación

9

Creando el grafo de animaciones

10

Usando un árbol de animaciones

11

Mostrando la solución del desafío e implementando transición entre blended trees

12

Programando una cámara que siga al jugador

13

Corrección del bug gráfico

14

límites del escenario, rigid bodies

15

Ejercicio: diseño de interiores

Escenarios Avanzados

16

Transiciones entre escenas

17

Mantener Player y Camera entre escenas

18

Spawning Points: programando que el jugador y la cámara aparezcan en el lugar correcto al cambiar de escena

19

Agregando Identificadores a nuestros Spawning Points para controlar mejor el flujo de nuestro juego

Enemigos Avanzados

20

Creando nuestro enemigo

21

Programando las físicas y el patrullaje del enemigo

22

Generando movimiento completamente aleatorio

23

Programando el ataque del enemigo

24

Crear Manager de Health del Player

25

Crear armas

26

Programando el ataque del Player con arma

27

Mover la espada al caminar

28

Creando el ataque con espada

29

Ejecutando el ataque con un botón

30

Movimiento en diagonal

31

Optimizando nuestro player controller

32

Ataque mejorado

33

Uso de partículas

34

Añadir el daño del enemigo en batalla

35

Programando los contadores de vida del enemigo

36

Colocando más info de UI en pantalla

37

Script de la vida

Personaje principal avanzado

38

Añadir el daño del personaje (ejercicio)

39

Sistema de puntos de experiencia para nuestro personaje principal

40

Level Up!

41

Level Up! Defensa y Reto Final del Módulo: Stats de los enemigos

42

Creando un NPC

43

Limitar el movimiento de nuestro NPC

44

Creando una pantalla de diálogos para nuestro RPG

45

El diálogo del NPC

46

Múltiples líneas de diálogo

47

Parar el NPC durante el diálogo

48

Parar el personaje durante el diálogo

Quests

49

La estructura de una quest

50

Quest 1: Ir a un lugar

51

Quest 2: Encontrar un objeto

52

Quest 3: Matar enemigos

53

Revisión de bugs

54

Mantener la cámara dentro del escenario

55

El problema al cambiar de escena

Audio

56

Agregando SFX a nuestro videojuego

57

Agregando música a nuestro videojuego

58

Ajustar volúmen del audio de cada uno de los efectos de sonido

59

Creando un VolumeManager

60

Agregando economía a nuestro juego y cierre

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Parar el NPC durante el diálogo

47/60
Recursos

¿Cómo parar completamente el movimiento del NPC durante un diálogo?

En el emocionante mundo del desarrollo de videojuegos, crear interacciones dinámicas entre personajes es esencial para una experiencia de usuario envolvente. Uno de los retos comunes es gestionar el movimiento de los NPCs (personajes no jugables) durante los diálogos. En esta sección, aprenderás a detener completamente a un NPC mientras conversas, usando variables y lógica de programación.

¿Qué script controla el movimiento del NPC?

El primer paso es identificar el script que controla el movimiento del NPC. En nuestro proyecto, es el script NPC Movement. Dentro de este script está el método update, que aleatoriamente decide si el NPC debe caminar o detenerse cada ciertos segundos.

Para pausar el movimiento al inicio de un diálogo, necesitaremos una nueva variable:

bool isTalking = false;

Esta variable se colocará junto a isWalking y no es necesario inicializarla porque, por defecto, será false, lo cual es el comportamiento esperado.

¿Cómo detener el movimiento en el momento del diálogo?

Una vez que tenemos la variable isTalking, abrimos la función update para incluir una condición que detenga el movimiento cuando el NPC esté hablando:

void Update() {
    if (isTalking) {
        StopWalking();
        return;
    }
    // Resto de la lógica de caminar
}

Aquí lo que hacemos es verificar al inicio del update si isTalking es verdadero. Si ese es el caso, llamamos a StopWalking() y retornamos de la función para evitar ejecutar la lógica de caminata.

¿Cómo iniciar y controlar el diálogo?

Ahora, en el script encargado del diálogo (NPC Dialog), necesitamos detectar cuando el jugador inicia una conversación. Cuando esto ocurre, estableceremos isTalking en true:

void StartConversation() {
    if (GameObject.GetComponentInParent<NPCMovement>() != null) {
        GameObject.GetComponentInParent<NPCMovement>().isTalking = true;
    }
}

Nos aseguramos de que NPCMovement existe como componente en el padre antes de modificar isTalking. Esto asegura que solo los NPCs con capacidad de movimiento se vean afectados.

¿Cómo reanudar el movimiento después del diálogo?

Finalmente, en el script NPC Movement, necesitamos reiniciar el movimiento una vez que el diálogo termine. Para esto, vinculamos nuestro código con dialogManager y verificamos si el diálogo sigue activo:

void Update() {
    if (!manager.DialogActive) {
        isTalking = false;
    }
    // Verificación de movimiento
}

Esta sencilla verificación permite que, cuando el diálogo ya no esté activo, la variable isTalking vuelva a false, reactivando el ciclo habitual de movimiento.

¿Cómo implementar estos cambios en Unity?

  1. Guardar cambios de scripts: una vez editados los scripts, guárdalos y ve al editor de Unity.
  2. Prueba en el editor: inicia el juego y observa el comportamiento del NPC. Debería detenerse al comenzar un diálogo y reanudar su movimiento al terminarlo.

Observa, por ejemplo, el conejo naranja en el juego. Sigue moviéndose hasta que inicias un diálogo en el que se quedará inmóvil, educadamente atendiendo la conversación. Y así, nuestros NPCs ahora demuestran una interacción más realista y lógica dentro del juego, añadiendo profundidad a la experiencia del jugador.

Te animo a implementar y experimentar con estas mecánicas, adaptándolas a tus necesidades específicas y enriqueciendo tus habilidades de desarrollo de videojuegos.

Aportes 9

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Yo hice que el conejito se moviera una vez el player salga de la zona de diálogo con la función OnTriggerExit2D.

Para el caso del player no he limitado el movimiento, si no que mas bien lo he dejado mal educado jaja pero si sale de la zona del NPC, ejecuto HideDialog() para desactivar y resetear el dialogo:
NPCDialog.cs

En cuanto al NPC, solo desactivo su movimiento si isActive de DialogManager es true:

NPCMovement.cs

Chicos, agregando 4 lineas se hace todo. Cuando el dialogo está activo pongo que el Time.timeScale = 0.
Si el dialogo no está activo lo pongo de nuevo en 1 y listo.
El Time.timeScale maneja todas las fisicas del juego. Con lo cual si lo ponemos a 0 se congela todo.

 if (dialogActive)
            Time.timeScale = 0f;
        
        else
            Time.timeScale = 1.0f;

Metiendo este if en el update del NPCdialog (script) me funciona.

public PlayerController player;
if(!gameObject.GetComponentInParent<NPCMovement>().isTalking)
        {
            player.enabled = true;
        }
        else
        {
            player.enabled = false;
        }

Para detener al player cree una referencia al DialogueManager:
.

.
La definí en el start:
.

.
Y comprobé su estado para saber si el personaje podía moverse o no:
.

Genial

Considero mucho más simple que al entrar en la zona del NPC este desactive su script NPCMovement, tambien como tengo la lógica del movimiento del jugador en un script aparte, desactivo esta lógica solo cuando se encuentra en dialogo. Asi nos evitamos mezclar lógicas en scripts y todo se mantiene en el manager.

Yo lo resolví solo verificando si esta activo algún dialog en donde recibe las instrucciones para caminar. Esto solo editando el PlayerController

//Creé esta variable y la pueden dejar asinada desde el start
        canWalk=GameObject.FindObjectOfType<DialogManager>().dailogActive;
        if ((Mathf.Abs(Input.GetAxisRaw(HORIZONTAL))>0.5f|| Mathf.Abs(Input.GetAxisRaw(VERTICAL))>0.5f) && !canWalk){
            walking=true;
            lastMovement=new Vector2(
                Input.GetAxisRaw(HORIZONTAL),
                Input.GetAxisRaw(VERTICAL));

            playerRigidbody.velocity=lastMovement.normalized * speed*Time.deltaTime;
        }

Hola