﻿1
00:00:04,460 --> 00:00:05,180
‫Olá e bem-vindo.

2
00:00:05,180 --> 00:00:10,490
‫Nesta palestra, vamos criar um modo de jogo KML, que será apenas um dos modos

3
00:00:10,490 --> 00:00:17,660
‫de jogo possíveis que podemos criar devido a ter um método virtual -- morto que pode ser chamado em qualquer um

4
00:00:17,660 --> 00:00:19,730
‫dos jogos modos que desejamos.

5
00:00:20,000 --> 00:00:24,290
‫Vamos mergulhar e ver como vamos implementar esse método virtual.

6
00:00:25,600 --> 00:00:28,600
‫Então, gostaríamos que nosso jogo pudesse terminar.

7
00:00:28,610 --> 00:00:29,710
‫O que significa um jogo terminar?

8
00:00:29,710 --> 00:00:34,720
‫Significa que entramos em algum tipo de estado em que temos um ou perdemos.

9
00:00:35,080 --> 00:00:37,210
‫Informamos o jogador usando alguma interface do usuário.

10
00:00:37,210 --> 00:00:42,880
‫Damos a eles a opção de talvez reiniciar e jogar novamente, algo nesse sentido.

11
00:00:43,000 --> 00:00:46,830
‫Agora, as classes envolvidas com isso normalmente são um modo de jogo.

12
00:00:46,840 --> 00:00:52,210
‫O modo de jogo é responsável por decidir as regras do jogo, como quem ganhou e quem perdeu.

13
00:00:52,840 --> 00:00:56,410
‫E para isso, vamos precisar saber quem está sendo morto.

14
00:00:56,410 --> 00:01:02,440
‫Então vamos ter este método virtual aqui chamado peão morto, que será chamado de peão

15
00:01:02,440 --> 00:01:03,940
‫atirador quando morrer.

16
00:01:03,940 --> 00:01:09,130
‫Seja ou não o A. EU. ou é o jogador que está morrendo.

17
00:01:10,450 --> 00:01:15,280
‫E, além disso, quero acrescentar aqui uma pequena complicação, que terá diferentes modos de jogo

18
00:01:15,280 --> 00:01:18,310
‫derivados do nosso principal modo de jogo de tiro.

19
00:01:18,610 --> 00:01:20,290
‫Eles implementarão esse modo de jogo.

20
00:01:20,290 --> 00:01:21,520
‫É isso que a seta significa aqui.

21
00:01:21,520 --> 00:01:25,780
‫Muitas vezes é um pouco contra-intuitivo a maneira como a flecha vai, mas mate todos eles.

22
00:01:25,780 --> 00:01:33,250
‫O modo de jogo herda do modo de jogo de tiro e substitui o peão morto para contar e decidir de forma

23
00:01:33,250 --> 00:01:35,710
‫diferente sobre as regras do jogo.

24
00:01:35,710 --> 00:01:41,740
‫Então é por isso que eu quero colocar um método de morte de peão virtual no modo de jogo de tiro

25
00:01:42,160 --> 00:01:48,100
‫pai e, em seguida, implementá-lo ou substituí-lo novamente no modo de matar tudo, que será o modo de jogo que estamos

26
00:01:48,100 --> 00:01:49,360
‫implementando para nós mesmos.

27
00:01:49,660 --> 00:01:54,430
‫E você pode optar por fazer diferentes modos de jogo, onde talvez você queira apenas matar uma certa

28
00:01:54,430 --> 00:01:58,420
‫quantidade de inimigos no nível, em vez de todos eles ou algo nesse sentido.

29
00:01:58,420 --> 00:02:00,430
‫Talvez um capture a bandeira, algo diferente.

30
00:02:01,960 --> 00:02:08,470
‫Mas basicamente o que vai acontecer é o shooter -- vai encontrar o modo de jogo que tem

31
00:02:08,470 --> 00:02:12,850
‫o tipo de jogo shooter e vai chamá-lo de -- morto.

32
00:02:13,090 --> 00:02:18,970
‫E então, dependendo de qualquer implementação que esteja realmente lá, ela passará para a implementação

33
00:02:18,970 --> 00:02:20,980
‫por meio da substituição.

34
00:02:22,000 --> 00:02:28,330
‫Agora, outra complicação aqui é que nossa lógica de UI e lógica de reinicialização é realmente algo que deveria

35
00:02:28,330 --> 00:02:35,140
‫acontecer na UI do controlador do jogador, geralmente sendo da alçada do jogador ao invés de algo global como o modo

36
00:02:35,140 --> 00:02:36,070
‫de jogo.

37
00:02:36,340 --> 00:02:42,790
‫Isso é especialmente verdadeiro em jogos multiplayer porque o modo de jogo não existe na máquina do

38
00:02:42,790 --> 00:02:45,100
‫jogador, ele existe apenas no servidor.

39
00:02:45,110 --> 00:02:49,060
‫Portanto, qualquer coisa da interface do usuário deve estar acontecendo no controlador do player.

40
00:02:49,600 --> 00:02:52,630
‫Essa é uma complicação com a qual não precisamos nos preocupar porque este

41
00:02:52,630 --> 00:02:57,190
‫não é um jogo multiplayer, mas ainda é bom usar as classes para o que se espera que sejam usadas no Unreal.

42
00:02:57,940 --> 00:03:04,690
‫Portanto, o controlador do jogador, a classe real do controlador do jogador raiz, tem um método virtual chamado game terminou

43
00:03:04,690 --> 00:03:12,550
‫especificamente para esse propósito, para que o modo de jogo possa chamar esse método e possamos implementá-lo em nosso próprio controlador de jogo

44
00:03:12,550 --> 00:03:17,500
‫de tiro para fazer a interface do usuário, reiniciar tudo esse tipo de coisa.

45
00:03:17,950 --> 00:03:23,560
‫Mas precisaremos chamá-lo do nosso modo de jogo quando decidirmos que o jogo acabou.

46
00:03:23,560 --> 00:03:29,950
‫Então, vamos chamar o jogo virtual terminou no controlador do jogador root e, em seguida, porque esse controlador do jogador

47
00:03:29,960 --> 00:03:35,230
‫root é na verdade um jogador de tiro, um controlador acabará desviando de volta e chamando.

48
00:03:35,230 --> 00:03:36,070
‫Este jogo terminou.

49
00:03:36,070 --> 00:03:41,980
‫Portanto, parece uma rota tortuosa que vamos chamar de nosso peão de atirador através do modo de jogo de atirador para o modo

50
00:03:41,980 --> 00:03:46,360
‫de jogo matá-los todos para o controlador de jogador para o controlador de jogador de atirador.

51
00:03:46,690 --> 00:03:52,300
‫Mas isso nos permite muita flexibilidade em termos de dizer, bem, podemos misturar e combinar diferentes controles de jogo que

52
00:03:52,300 --> 00:03:55,720
‫mostrarão a interface do usuário de maneiras diferentes, em diferentes níveis.

53
00:03:55,990 --> 00:04:00,070
‫Podemos misturar e combinar diferentes modos de jogo que funcionarão de maneiras diferentes, e essa é

54
00:04:00,070 --> 00:04:02,200
‫a razão de eu arquitetá-lo dessa maneira.

55
00:04:02,200 --> 00:04:07,720
‫É um pouco exagerado para o nosso projeto, mas mostra como isso pode se estender a outros projetos

56
00:04:07,720 --> 00:04:11,740
‫com captura de modos de jogo e diferentes tipos de controle de jogador.

57
00:04:12,100 --> 00:04:14,170
‫Então, vamos tentar implementá-lo.

58
00:04:14,620 --> 00:04:18,010
‫Nós vamos e, antes de tudo, encontrar um modo de jogo de rota.

59
00:04:18,010 --> 00:04:22,060
‫Já existe um criado porque comecei a partir de um projeto C++.

60
00:04:22,450 --> 00:04:28,090
‫Temos essa base simples de modo de jogo de tiro e o que eu

61
00:04:28,090 --> 00:04:35,770
‫quero fazer aqui é criar uma função pública que retornará void e será -- morta e teremos que passar no --

62
00:04:35,770 --> 00:04:37,420
‫que foi morto aqui.

63
00:04:37,420 --> 00:04:42,310
‫Então vai ser uma -- estrela chamada -- morta assim.

64
00:04:42,400 --> 00:04:46,630
‫E então, no início, vamos fazer disso um método virtual e vamos em

65
00:04:46,630 --> 00:04:50,680
‫frente e criar uma implementação básica que essencialmente não faz nada aqui.

66
00:04:50,710 --> 00:04:52,900
‫Então vamos criar uma subclasse.

67
00:04:52,900 --> 00:05:00,280
‫Então, a nova classe C++, vai mostrar todas as classes e vamos procurar o modo de jogo

68
00:05:00,280 --> 00:05:10,240
‫shooter simples shooter como nossa classe base e vamos chamar isso de modo de jogo kill em all assim e vá em frente e

69
00:05:10,240 --> 00:05:11,830
‫crie aquela aula.

70
00:05:12,010 --> 00:05:17,950
‫Então, quando isso estiver compilado, quero apenas mudar por um segundo e ir para o nosso personagem atirador.

71
00:05:18,100 --> 00:05:23,350
‫CP E você pode ver aqui que temos nosso está morto no método de receber dano.

72
00:05:23,920 --> 00:05:30,430
‫Agora, se isso está morto, o que eu quero fazer é pegar nosso modo de jogo e chamar o --

73
00:05:30,430 --> 00:05:30,880
‫morto.

74
00:05:31,240 --> 00:05:37,660
‫Então, a maneira como fazemos isso é começar chamando para obter o mundo para obter o modo de jogo.

75
00:05:37,900 --> 00:05:40,540
‫Então é sair do modo de jogo.

76
00:05:40,720 --> 00:05:46,690
‫E então o que queremos fazer é que este modo de jogo seja do tipo correto, que é o simples, o

77
00:05:46,690 --> 00:05:52,120
‫root, o modo de jogo de tiro simples que nos permite trocar esse personagem, usá-lo com diferentes modos de jogo,

78
00:05:52,120 --> 00:05:54,670
‫como capturar os modos de jogo da bandeira.

79
00:05:55,210 --> 00:06:01,390
‫Então, da maneira como podemos fazer isso, podemos usar os colchetes angulares bem no modo get ou game aqui.

80
00:06:01,510 --> 00:06:07,570
‫E faremos um modo de jogo de tiro simples e precisaremos incluí-lo no topo.

81
00:06:08,440 --> 00:06:18,040
‫Portanto, inclua a base simples do modo de jogo de tiro, para que eu não acerte o nome da classe inteira.

82
00:06:18,040 --> 00:06:18,460
‫Eu penso.

83
00:06:18,460 --> 00:06:21,880
‫Então, será uma base simples de modo de jogo de tiro.

84
00:06:22,450 --> 00:06:28,420
‫Isso é o que estamos tentando obter e podemos ir em frente e armazenar isso em um ponteiro de variável, vamos chamá-lo de

85
00:06:28,420 --> 00:06:29,290
‫modo de jogo.

86
00:06:29,290 --> 00:06:35,800
‫E então o que queremos fazer é nesta nova linha, provavelmente queremos verificar se temos isso e não é um

87
00:06:35,800 --> 00:06:36,730
‫ponteiro nulo.

88
00:06:36,730 --> 00:06:40,570
‫Portanto, o modo de jogo não é igual a um ponteiro nulo.

89
00:06:40,600 --> 00:06:47,560
‫E então se não for igual a todos os pontos disso é onde queremos chamar o modo de jogo peão de

90
00:06:47,680 --> 00:06:50,530
‫seta morto e o peão morto é assim?

91
00:06:50,620 --> 00:06:54,940
‫Então agora o modo de jogo está ciente de que um peão foi morto.

92
00:06:55,220 --> 00:07:00,460
‫Pequeno mini desafio para você substituir o modo de jogo matá-los todos para que você possa.

93
00:07:00,520 --> 00:07:06,670
‫Saia quando o -- for morto e defina isso como o modo de jogo padrão em seu mapa.

94
00:07:06,850 --> 00:07:07,210
‫OK.

95
00:07:07,210 --> 00:07:09,460
‫Então, espero que você tenha experimentado esse pequeno mini desafio.

96
00:07:09,760 --> 00:07:11,770
‫Vamos seguir em frente e implementar.

97
00:07:11,770 --> 00:07:17,680
‫Então, vou fazer isso copiando a seção pública de nossa base simples de modo de jogo de tiro, e é

98
00:07:17,680 --> 00:07:19,240
‫difícil acompanhar todas essas coisas.

99
00:07:19,660 --> 00:07:23,800
‫Então vamos para a nossa base do modo de matar todos eles, que herda dela.

100
00:07:24,430 --> 00:07:31,300
‫E vamos colar o método virtual e adicionar a palavra-chave override para garantir que estamos

101
00:07:31,300 --> 00:07:33,610
‫substituindo esse método corretamente.

102
00:07:34,760 --> 00:07:39,350
‫Em seguida, criarei uma implementação em C++ para nossa base de modo de jogo KML.

103
00:07:40,130 --> 00:07:42,920
‫É aqui que devemos receber essa mensagem de log.

104
00:07:42,920 --> 00:07:47,030
‫E só para ser super cuidadoso, sabemos que não há nada na implementação.

105
00:07:47,390 --> 00:07:48,380
‫Mas você nunca sabe.

106
00:07:48,390 --> 00:07:52,080
‫As coisas podem mudar mais tarde e podemos ser mordidos pela bomba.

107
00:07:52,100 --> 00:07:54,950
‫Então queremos matar um peão.

108
00:07:56,340 --> 00:07:58,830
‫Super -- morto com o -- morto.

109
00:07:59,280 --> 00:07:59,820
‫Faz sentido.

110
00:08:00,420 --> 00:08:07,830
‫E então queremos fazer um diálogo aqui basicamente dizendo que um -- foi morto.

111
00:08:08,490 --> 00:08:15,900
‫E podemos ver se isso funciona indo para o Unreal e compilando, depois indo para o item

112
00:08:15,900 --> 00:08:20,850
‫blueprints na barra de ferramentas e selecionando nas configurações do projeto.

113
00:08:20,850 --> 00:08:27,420
‫O modo de jogo padrão que queremos ser, se selecionarmos o modo de jogo, classe base, queremos que seja o modo

114
00:08:27,420 --> 00:08:31,710
‫de jogo base para matar todos, basicamente vá em frente e faça isso.

115
00:08:31,710 --> 00:08:35,370
‫Na verdade, não é bem isso que queremos fazer se formos e selecionarmos.

116
00:08:35,730 --> 00:08:44,100
‫Queríamos que fosse realmente um filho de projeto disso e já temos um filho de projeto que tem muitas

117
00:08:44,100 --> 00:08:45,000
‫coisas configuradas.

118
00:08:45,000 --> 00:08:47,520
‫Então vamos fazer um trabalho de paternidade lá.

119
00:08:48,390 --> 00:08:53,850
‫Iremos às raízes, encontraremos o modo de jogo de tiro BP, que temos aqui.

120
00:08:54,360 --> 00:09:03,060
‫Vamos renomear este modo de jogo BP kill all e então podemos abri-lo, encaixar a janela, abrir o editor de blueprint

121
00:09:03,060 --> 00:09:11,160
‫completo, ir para as configurações de classe e alterar o pai para o modo de jogo KML, basicamente

122
00:09:11,160 --> 00:09:11,670
‫C++.

123
00:09:12,150 --> 00:09:18,360
‫E dessa forma, devemos estar executando o código correto se formos para nossa mensagem para log

124
00:09:18,360 --> 00:09:26,490
‫de saída e pressionar play e, em seguida, matar um personagem, temos um problema que parece não ter a configuração correta,

125
00:09:26,820 --> 00:09:35,550
‫portanto, se voltarmos aos padrões de classe e mude o padrão -- class para ser o personagem do atirador BP, que deve

126
00:09:35,550 --> 00:09:36,780
‫estar correto.

127
00:09:36,960 --> 00:09:39,300
‫Salve e compile caso tenha errado.

128
00:09:39,300 --> 00:09:41,910
‫E, em seguida, verifique meus projetos aqui.

129
00:09:41,940 --> 00:09:44,640
‫É selecionado o jogo KML, o jogo C++.

130
00:09:44,640 --> 00:09:49,470
‫Então, na verdade, queremos escolher o modelo aqui e ir em frente e clicar em play.

131
00:09:49,470 --> 00:09:50,820
‫Agora temos nosso peão.

132
00:09:50,820 --> 00:09:55,800
‫Podemos ir em frente e matar esse cara e você pode ver que um peão foi morto.

133
00:09:55,800 --> 00:09:57,090
‫Prince está na mensagem de log?

134
00:09:57,420 --> 00:09:59,820
‫Então isso está funcionando fantasticamente.

135
00:10:00,360 --> 00:10:05,070
‫Agora, na próxima seção, veremos a segunda parte disso, que

136
00:10:05,070 --> 00:10:12,630
‫diz que o jogo terminou quando realmente queremos terminar o jogo e poder reiniciar a partir daí.

137
00:10:13,110 --> 00:10:15,720
‫Então eu vou te ver nessa palestra.

