﻿1
00:00:04,330 --> 00:00:05,170
‫Hola y bienvenido.

2
00:00:05,170 --> 00:00:12,100
‫En esta lección, vamos a considerar tener alguna opción en nuestros árboles de comportamiento, de modo que pueda

3
00:00:12,100 --> 00:00:20,200
‫hacer que un enemigo corra hacia mí y, si me pierde de vista, venga a mi última ubicación conocida realizando básicamente

4
00:00:20,590 --> 00:00:24,190
‫dos comportamientos por persecución y luego Investigo el comportamiento.

5
00:00:24,190 --> 00:00:26,050
‫Profundicemos y veamos cómo se puede lograr.

6
00:00:26,050 --> 00:00:27,130
‫Uso de árboles de comportamiento.

7
00:00:28,530 --> 00:00:34,530
‫Entonces, si bien este comportamiento de patrullaje es muy instructivo, no es realmente el tipo de comportamiento que

8
00:00:34,530 --> 00:00:35,280
‫queremos implementar.

9
00:00:35,790 --> 00:00:39,150
‫Lo que preferiríamos tener es algo como lo siguiente.

10
00:00:39,330 --> 00:00:44,580
‫Cuando podemos ver al jugador, vamos y nos movemos lo más cerca posible de él.

11
00:00:45,330 --> 00:00:51,840
‫Y cuando el jugador se pierde de vista, intentamos movernos a la última ubicación conocida del jugador para

12
00:00:51,840 --> 00:00:52,500
‫encontrarlo.

13
00:00:52,800 --> 00:00:58,410
‫Y una vez que hayamos agotado esa opción, tal vez volvamos a un lugar diferente, o tal vez

14
00:00:58,410 --> 00:01:00,150
‫nos quedemos allí por ahora.

15
00:01:00,930 --> 00:01:02,400
‫Entonces, ¿cómo podemos lograr esto?

16
00:01:02,430 --> 00:01:05,880
‫Bueno, por el momento, no tenemos forma de lograr esto con una secuencia de acciones.

17
00:01:05,880 --> 00:01:09,200
‫Tenemos que hacer una elección basada en los datos que tenemos disponibles.

18
00:01:09,210 --> 00:01:15,210
‫Tenemos que elegir entre si podemos ver al jugador o si no, si tenemos la última ubicación

19
00:01:15,210 --> 00:01:18,450
‫conocida del jugador o no, ese tipo de cosas.

20
00:01:18,870 --> 00:01:24,000
‫Entonces, para hacer esto, necesitamos un nuevo tipo de nodo en el árbol de comportamiento llamado nota selectora.

21
00:01:24,060 --> 00:01:29,070
‫Entonces, si hacemos clic derecho y miramos nuestros compuestos, una de las opciones es el selector.

22
00:01:29,550 --> 00:01:33,090
‫Ahora el selector a diferencia de la secuencia se ejecuta de esta manera.

23
00:01:33,480 --> 00:01:40,410
‫Si tiene un montón de tareas debajo del selector, se ejecutará hasta que la primera tenga éxito.

24
00:01:40,830 --> 00:01:45,150
‫Y básicamente es esperar que todos fracasen hasta que uno de ellos tenga éxito.

25
00:01:45,780 --> 00:01:48,140
‫Ahora la secuencia hizo lo contrario.

26
00:01:48,150 --> 00:01:50,220
‫Los ejecuta todos hasta que uno de ellos falla.

27
00:01:50,730 --> 00:01:52,750
‫Entonces, ¿por qué es eso útil?

28
00:01:52,800 --> 00:01:56,610
‫¿Por qué es útil que el selector ejecute uno de ellos hasta que uno de ellos tenga éxito?

29
00:01:56,610 --> 00:02:00,900
‫Porque básicamente queremos que elija la primera opción que sea viable.

30
00:02:01,920 --> 00:02:06,780
‫Ahora, la forma en que vamos a hacer esto no es ejecutando tareas debajo del selector,

31
00:02:06,780 --> 00:02:08,910
‫sino ejecutando secuencias debajo del selector.

32
00:02:08,910 --> 00:02:12,120
‫Entonces, en el nivel raíz, vamos a hacer una nota selectora.

33
00:02:12,690 --> 00:02:16,920
‫Y luego, debajo de eso, dejemos esta secuencia a un lado y creemos otras secuencias.

34
00:02:17,250 --> 00:02:19,930
‫Vamos a tener una secuencia aquí.

35
00:02:20,670 --> 00:02:26,640
‫Y lo que podemos hacer es cambiar el nombre de la secuencia de secuencia a algo como Chase.

36
00:02:27,330 --> 00:02:35,010
‫Y luego podemos agregar otra secuencia aquí, que estará en la línea de investigación.

37
00:02:36,050 --> 00:02:41,330
‫Y estos son básicamente nuestros dos comportamientos entre los que queremos poder elegir.

38
00:02:42,260 --> 00:02:48,980
‫Y para que fallen, podemos agregar cosas a los nodos llamados decoradores.

39
00:02:49,370 --> 00:02:54,890
‫Entonces, si hace clic derecho en un nodo y va a agregar un decorador, puede ver aquí que hay un montón de opciones aquí.

40
00:02:55,460 --> 00:02:59,330
‫Y básicamente cambian la forma en que funciona este nodo.

41
00:02:59,450 --> 00:03:00,890
‫Entonces pueden hacerlo de varias maneras.

42
00:03:00,920 --> 00:03:05,810
‫Por ejemplo, tenemos este bucle condicional que le permite repetir todas las acciones de nuevo en

43
00:03:05,810 --> 00:03:08,720
‫la secuencia tantas veces como este condicional sea correcto.

44
00:03:09,200 --> 00:03:15,800
‫Tenemos otras cosas aquí, como una verificación de código, que tiene que ver con la visibilidad y otras cosas maravillosas.

45
00:03:15,800 --> 00:03:17,660
‫Solo tenemos un bucle puro.

46
00:03:18,090 --> 00:03:19,350
‫Tenemos un límite de tiempo.

47
00:03:19,370 --> 00:03:23,240
‫Entonces, esto solo puede permanecer dentro de esta secuencia durante un cierto período de tiempo.

48
00:03:23,540 --> 00:03:27,020
‫Básicamente muchas cosas que modifican el comportamiento de esta secuencia.

49
00:03:27,290 --> 00:03:33,290
‫Pero el que nos interesa es la pizarra, porque esta es una condición de pizarra.

50
00:03:33,290 --> 00:03:38,360
‫Y como puede ver en la escritura debajo, el valor predeterminado es algo similar a ¿está

51
00:03:38,360 --> 00:03:39,710
‫configurado este acto propio?

52
00:03:40,250 --> 00:03:46,940
‫Y si esto no está configurado, automáticamente este nodo y todo lo que está debajo fallará, lo que significa que

53
00:03:46,940 --> 00:03:50,810
‫nuestro selector pasará a la opción dos, que es investigar.

54
00:03:51,290 --> 00:03:53,800
‫Entonces, en este caso, realmente queremos cambiar esto.

55
00:03:53,810 --> 00:03:55,160
‫Queremos cambiar cómo funciona esto.

56
00:03:55,160 --> 00:04:02,120
‫Entonces, nuestra ubicación del jugador, queremos que sea tal que solo se establezca cuando el jugador esté visible.

57
00:04:02,510 --> 00:04:09,980
‫Y luego queremos agregar una nueva variable aquí nuevamente, un vector que será la última ubicación conocida del jugador y

58
00:04:10,400 --> 00:04:16,010
‫la última ubicación conocida del jugador cuando el jugador esté visible será la misma.

59
00:04:16,490 --> 00:04:20,660
‫Pero una vez que el jugador se vuelve invisible, la ubicación del jugador se desarma.

60
00:04:21,080 --> 00:04:23,840
‫Y la última ubicación conocida del jugador es a dónde queremos ir.

61
00:04:24,620 --> 00:04:30,230
‫Así que podemos hacer esto yendo a nuestra condición base de Blackboard y simplemente cambiándola para que

62
00:04:30,230 --> 00:04:31,850
‫la consulta sea Sí.

63
00:04:32,300 --> 00:04:35,300
‫Pero lo que queremos que esté establecido es la ubicación del jugador.

64
00:04:35,300 --> 00:04:41,900
‫Entonces, si la ubicación de juego está configurada, entonces vamos a perseguir y vamos a darle a

65
00:04:41,900 --> 00:04:47,960
‫Chase haciendo básicamente solo un movimiento hacia y nos moveremos a la ubicación del jugador.

66
00:04:47,960 --> 00:04:51,730
‫Así que ahora no estamos haciendo mucho más bajo la secuencia.

67
00:04:51,740 --> 00:04:57,240
‫Entonces, de hecho, también podría poner esta condición de pizarra directamente en movimiento.

68
00:04:57,680 --> 00:05:01,700
‫Pero como es posible que queramos hacer otras cosas, como filmar, lo dejaré como una secuencia por

69
00:05:01,700 --> 00:05:02,150
‫ahora.

70
00:05:02,660 --> 00:05:04,010
‫Entonces tenemos esta investigación.

71
00:05:04,010 --> 00:05:10,430
‫Investigar básicamente también hará un movimiento, pero en lugar de moverse a la ubicación

72
00:05:10,460 --> 00:05:15,980
‫del jugador, se moverá a la última ubicación conocida del jugador.

73
00:05:16,580 --> 00:05:22,730
‫Y pueden ver que no tenemos una condición sobre eso porque esto fracasa si esta condición falla.

74
00:05:23,420 --> 00:05:29,210
‫Una cosa importante a tener en cuenta sobre estas condiciones de pizarra es que, de forma predeterminada, una vez que

75
00:05:29,210 --> 00:05:33,890
‫hayamos tomado la decisión de comenzar a ejecutar este nodo, no vamos a volver a evaluarlo.

76
00:05:34,160 --> 00:05:39,770
‫Entonces, si por alguna razón perdemos de vista al jugador mientras nos movemos a la ubicación de ese

77
00:05:39,770 --> 00:05:41,570
‫jugador, seguiremos intentando llegar allí.

78
00:05:42,080 --> 00:05:49,580
‫Entonces, si quisiéramos poder abortar la ejecución de esta nota, entonces hay una opción para eso.

79
00:05:49,580 --> 00:05:53,720
‫Si va al control de flujo, notifica a los observadores y está debajo.

80
00:05:53,720 --> 00:05:56,030
‫El observador aborta en el momento establecido en ninguno.

81
00:05:56,600 --> 00:05:58,490
‫Pero puede seleccionar entre un par de opciones.

82
00:05:59,180 --> 00:06:00,590
‫Puede establecerlo en uno mismo.

83
00:06:00,860 --> 00:06:07,790
‫Entonces, esto significa que si esta condición de repente se vuelve falsa, detenga lo que esté haciendo y vuelva a

84
00:06:07,790 --> 00:06:09,710
‫evaluar su selector y vea.

85
00:06:09,740 --> 00:06:12,050
‫Tal vez ahora necesitemos hacer la nota de investigación.

86
00:06:12,650 --> 00:06:18,470
‫La otra opción aquí es de menor prioridad y puede ver que ha cambiado lo que está resaltado aquí.

87
00:06:18,470 --> 00:06:24,380
‫Está diciendo que si de repente esta condición de la pizarra se vuelve cierta, detengamos cualquier otra cosa que estuviéramos haciendo

88
00:06:24,380 --> 00:06:26,790
‫y comencemos a ejecutar esta condición de persecución.

89
00:06:27,380 --> 00:06:29,630
‫Y luego la opción final es ambos.

90
00:06:29,900 --> 00:06:31,050
‫Y este es el que queremos.

91
00:06:31,070 --> 00:06:37,160
‫Básicamente, está diciendo que esta condición basada en la pizarra, si se cumple, comenzamos a ejecutar

92
00:06:37,160 --> 00:06:38,480
‫la secuencia inmediatamente.

93
00:06:38,690 --> 00:06:44,100
‫Si se vuelve falso, dejamos de ejecutarlo inmediatamente o dejamos de ejecutar cualquier otra cosa que estuviera pasando.

94
00:06:44,120 --> 00:06:51,350
‫Básicamente, solo queremos ir siempre y hacer cualquier camino que dicte esta condición de pizarra.

95
00:06:51,350 --> 00:06:56,690
‫Entonces, con suerte, tiene sentido que el observador informe que detiene las cosas en acción; de lo contrario, esperará

96
00:06:56,690 --> 00:06:59,720
‫hasta que finalice la acción antes de volver a evaluar.

97
00:07:00,470 --> 00:07:07,370
‫Realmente, ahora queremos seguir adelante e implementar nuestra última ubicación conocida y ubicación de reproducción porque, por el momento, si pasamos

98
00:07:07,640 --> 00:07:13,520
‫a nuestro C++ y nos damos un poco más de espacio, entonces pueden ver que solo estamos configurando

99
00:07:13,520 --> 00:07:16,220
‫esto ubicación de juego en Begin Play.

100
00:07:16,340 --> 00:07:21,380
‫Lo ideal sería que hiciéramos esto cada vez que tuviéramos línea de visión con nuestro grupo de jugadores, por lo que

101
00:07:21,380 --> 00:07:23,540
‫podemos descomentar nuestro código de línea de visión aquí.

102
00:07:24,110 --> 00:07:27,320
‫Y probablemente también queramos descomentar el código else.

103
00:07:27,560 --> 00:07:32,300
‫Pero en este caso no vamos a despejar el foco y detener el movimiento directamente.

104
00:07:32,300 --> 00:07:35,570
‫Puedo seguir adelante y eliminarlos por completo porque.

105
00:07:35,610 --> 00:07:37,590
‫Esa no es la forma en que estamos haciendo las cosas en este momento.

106
00:07:38,130 --> 00:07:47,130
‫En cambio, lo que queremos hacer, si elimino el código, es que queremos estar aquí configurando la ubicación del

107
00:07:47,130 --> 00:07:47,940
‫jugador.

108
00:07:48,300 --> 00:07:53,500
‫También queremos establecer la última ubicación conocida allí.

109
00:07:54,000 --> 00:07:59,520
‫Y de lo contrario, queremos borrar la ubicación del jugador.

110
00:08:00,270 --> 00:08:07,800
‫Ahora, para hacer eso, tenemos una función disponible para nosotros, que es en lugar del valor establecido

111
00:08:07,800 --> 00:08:15,210
‫como vector, si continuamos y abrimos nuestro componente de pizarra dot h, hay un valor claro.

112
00:08:15,630 --> 00:08:21,150
‫Y esto solo toma el nombre f, no necesita tomar un tipo ni nada porque estamos borrando

113
00:08:21,150 --> 00:08:23,850
‫completamente lo que haya en esa variable.

114
00:08:24,570 --> 00:08:27,360
‫Así que aquí tengo un desafío para que completes nuestra marca.

115
00:08:27,780 --> 00:08:30,420
‫Establezca las dos variables cuando la línea de visión.

116
00:08:30,450 --> 00:08:38,790
‫Básicamente, complete este primer bit de la declaración F y luego borre la ubicación del jugador cuando tengamos el

117
00:08:38,790 --> 00:08:39,240
‫resto.

118
00:08:39,240 --> 00:08:41,940
‫Entonces, cuando perdemos la línea de visión, ya no tenemos un lugar de juego.

119
00:08:42,360 --> 00:08:48,300
‫Reduce la velocidad del enemigo que hay en el mundo para que puedas alejarte de él más fácilmente.

120
00:08:48,630 --> 00:08:54,720
‫Y luego verifique la funcionalidad, verifique que pueda esconderse detrás de una esquina y que él vaya a la última

121
00:08:54,720 --> 00:08:56,920
‫ubicación conocida para tratar de encontrarlo.

122
00:08:57,330 --> 00:08:59,190
‫Pausa el video y prueba esto.

123
00:09:00,460 --> 00:09:00,780
‫Bueno.

124
00:09:00,790 --> 00:09:01,370
‫Bienvenido de nuevo.

125
00:09:01,390 --> 00:09:02,500
‫Así que vamos a darle una oportunidad a esto.

126
00:09:02,530 --> 00:09:04,210
‫En primer lugar, estamos configurando la ubicación de juego.

127
00:09:04,210 --> 00:09:06,970
‫Voy a mover eso fuera del juego inicial y moverlo aquí en su lugar.

128
00:09:07,480 --> 00:09:12,670
‫Entonces, para establecer la ubicación del jugador, necesitamos traer al jugador aquí y tomar de nuevo.

129
00:09:13,000 --> 00:09:14,320
‫Así que voy a descomentar esa línea.

130
00:09:14,800 --> 00:09:21,100
‫Y luego estamos haciendo exactamente lo mismo, exactamente la misma línea de código para nuestra última ubicación de jugador

131
00:09:21,100 --> 00:09:21,930
‫conocida aquí.

132
00:09:21,940 --> 00:09:28,030
‫Entonces, vayamos a nuestra pizarra y asegurémonos de copiarlo para obtener exactamente el mismo nombre y luego solo queremos

133
00:09:28,030 --> 00:09:33,100
‫borrar, eso es lo último que es borrar la ubicación de nuestro jugador aquí.

134
00:09:33,100 --> 00:09:39,550
‫Así que va a ser un valor claro y va a tomar esta ubicación del reproductor de texto como el valor

135
00:09:39,550 --> 00:09:41,740
‫que estamos tratando de borrar al final.

136
00:09:42,400 --> 00:09:46,600
‫Y podemos seguir adelante y compilar y ver si esto funciona.

137
00:09:48,700 --> 00:09:50,500
‫Mientras Compile fue exitoso.

138
00:09:50,500 --> 00:09:56,500
‫La otra cosa que dije que hacer para facilitar la depuración fue seleccionar al enemigo y

139
00:09:56,500 --> 00:10:04,300
‫podemos ir y cambiar su velocidad bajando a sus componentes de movimiento y encontrando la forma de caminar y encontrando su velocidad.

140
00:10:04,310 --> 00:10:07,060
‫Así que Max Walk Speed es 600 aquí.

141
00:10:07,390 --> 00:10:11,440
‫Pongámoslo en 400 para que podamos alejarnos fácilmente de ellos.

142
00:10:11,440 --> 00:10:15,140
‫Van a caminar un poco lento y seguir adelante y jugar.

143
00:10:15,160 --> 00:10:16,660
‫Están caminando hacia un lento.

144
00:10:16,660 --> 00:10:17,740
‫Podemos huir.

145
00:10:18,130 --> 00:10:20,230
‫Nos escondemos detrás de una esquina y ahí van.

146
00:10:20,230 --> 00:10:22,570
‫Ven a buscarnos cada vez.

147
00:10:22,960 --> 00:10:27,820
‫Pero con suerte, si nos escondemos detrás de dos esquinas, no podrán encontrarnos.

148
00:10:28,240 --> 00:10:30,880
‫Así que me escondo allí, escondo aquí, escondo aquí.

149
00:10:31,330 --> 00:10:35,320
‫Y él va a ir e investigar en el último lugar conocido, ya ves, solo

150
00:10:35,320 --> 00:10:39,490
‫asoma la cabeza por la esquina, pero luego se queda atrapado allí porque no sabe qué hacer.

151
00:10:39,940 --> 00:10:46,870
‫Y si tuviéramos que ir y echar un vistazo a nuestro árbol de comportamiento y dejar esto a un lado y el

152
00:10:46,870 --> 00:10:49,870
‫juego al otro y darme un poco de espacio.

153
00:10:50,350 --> 00:10:54,850
‫Luego, si echamos un vistazo al árbol de comportamiento, podemos ver que está un poco animado aquí porque no

154
00:10:54,850 --> 00:10:56,560
‫puede hacer ninguno de los dos.

155
00:10:56,560 --> 00:11:00,220
‫Está tratando de moverse a la última ubicación conocida que está teniendo éxito.

156
00:11:00,460 --> 00:11:01,720
‫Así que se está quedando un poco atascado aquí.

157
00:11:02,020 --> 00:11:05,710
‫Pero si aparezco a la vista, puedes ver que se está moviendo hacia mí.

158
00:11:06,070 --> 00:11:11,530
‫Si me pierde de vista, entonces pasa a la condición de investigación.

159
00:11:11,920 --> 00:11:12,730
‫Así que pierde de vista.

160
00:11:12,730 --> 00:11:13,840
‫Él va a investigar.

161
00:11:14,230 --> 00:11:17,890
‫Y luego viene y me ve y luego vuelve a perseguirme.

162
00:11:18,250 --> 00:11:20,740
‫Así que este comportamiento realmente está funcionando.

163
00:11:20,740 --> 00:11:29,140
‫Ahora podemos elegir entre tratar de perseguir o tratar de investigar en función de este comportamiento de

164
00:11:29,140 --> 00:11:29,650
‫pizarra.

165
00:11:29,650 --> 00:11:37,060
‫Cambiemos el nombre de esta pizarra a comportamiento aquí para poder ver un signo de interrogación.

166
00:11:37,300 --> 00:11:38,860
‫Así que va a ser mucho más fácil de leer.

167
00:11:38,860 --> 00:11:43,960
‫Ahora que tenemos este selector, podemos ver la reproducción y luego debemos perseguirlo; de lo contrario,

168
00:11:43,960 --> 00:11:48,820
‫debemos investigar y podemos eliminar esta secuencia aquí porque ya no está en uso.

169
00:11:49,300 --> 00:11:54,700
‫Así que espero que ahora comprenda un poco mejor cómo se pueden vincular los árboles

170
00:11:54,700 --> 00:12:01,390
‫de comportamiento para crear opciones y secuencias y juntar muchas tareas para crear comportamientos más complejos con mucha facilidad.

171
00:12:01,780 --> 00:12:07,990
‫En la próxima lección, veremos cómo podemos crear nuestras propias tareas personalizadas en C++ para que podamos

172
00:12:07,990 --> 00:12:10,330
‫tener algo de acción de disparar.

173
00:12:10,450 --> 00:12:11,740
‫Te veré en el próximo video.

