﻿1
00:00:03,980 --> 00:00:05,900
‫Olá e bem-vindo de volta.

2
00:00:05,930 --> 00:00:10,610
‫Agora criamos um tanque que pode se mover e até girar sua torre.

3
00:00:10,610 --> 00:00:16,190
‫E estamos prontos agora para criar uma classe de torre que pode herdar algumas das funcionalidades que

4
00:00:16,190 --> 00:00:18,830
‫o tanque herdou da classe base do pod.

5
00:00:19,100 --> 00:00:24,560
‫Agora, uma vez que criamos uma classe de torre, vamos substituir a função tick para que possamos

6
00:00:24,560 --> 00:00:26,000
‫girar sua torre também.

7
00:00:26,030 --> 00:00:32,080
‫Portanto, nosso objetivo aqui é fazer com que as torres girem de forma que estejam sempre olhando para o tanque.

8
00:00:32,090 --> 00:00:37,430
‫Dessa forma, quando eles começarem a disparar projéteis, eles atingirão o tanque algumas vezes, desde que o tanque não

9
00:00:37,430 --> 00:00:39,020
‫esteja saindo do caminho rapidamente.

10
00:00:39,630 --> 00:00:43,740
‫E também vamos descobrir como podemos pegar o tanque --.

11
00:00:43,770 --> 00:00:49,380
‫Dessa forma, podemos mirar no tanque -- e girar a torre da torre em direção ao tanque --.

12
00:00:49,410 --> 00:00:52,350
‫Estamos nos preparando para um combate de projéteis.

13
00:00:52,650 --> 00:00:58,200
‫Então, estou aqui no editor e vou entrar na nossa pasta de tanques de ajuste onde estão a base --

14
00:00:58,200 --> 00:00:59,910
‫e as classes de tanques.

15
00:01:00,270 --> 00:01:04,650
‫Agora, eu gostaria de criar uma classe de torre baseada na classe base.

16
00:01:04,770 --> 00:01:07,850
‫Agora, a maneira como fizemos isso com a classe de tanques estava certa.

17
00:01:07,860 --> 00:01:14,430
‫Clicado na base - e selecionado criar classe C++ derivada com base em uma maneira alternativa é

18
00:01:14,430 --> 00:01:18,210
‫ir para ferramentas e selecionar uma nova classe C++.

19
00:01:18,540 --> 00:01:24,630
‫E a partir daqui podemos clicar na guia que diz todas as classes e procurar por base --.

20
00:01:24,750 --> 00:01:27,270
‫E aqui vemos nossa base -- classe.

21
00:01:27,480 --> 00:01:33,050
‫Se eu selecionar isso e clicar em próximo, agora estarei criando uma nova classe baseada em --.

22
00:01:33,060 --> 00:01:38,910
‫Vou deixá-lo no mesmo caminho que todas as nossas outras classes C++ e vou chamar essa torre.

23
00:01:39,210 --> 00:01:41,070
‫Então vamos clicar em Criar classe.

24
00:01:41,610 --> 00:01:44,720
‫Então aqui está minha nova era da torre e Tower Dot.

25
00:01:44,790 --> 00:01:51,360
‫CP Agora, a primeira coisa que precisamos é a função tick porque a torre vai querer girar sua

26
00:01:51,360 --> 00:01:53,520
‫torre para enfrentar o --.

27
00:01:53,730 --> 00:01:56,640
‫Então, vamos substituir a função tick aqui.

28
00:01:56,640 --> 00:02:03,930
‫Então eu vou fazer uma nova seção pública e vamos digitar virtual void tick, que leva um float

29
00:02:03,930 --> 00:02:07,560
‫chamado Delta Time, e isso é uma substituição.

30
00:02:07,560 --> 00:02:14,100
‫Agora entraremos em mais detalhes sobre virtual e substituição em vídeos futuros, mas estamos essencialmente pegando

31
00:02:14,100 --> 00:02:18,600
‫a função tick herdada e criando uma nova implementação para ela.

32
00:02:18,600 --> 00:02:23,520
‫Então vamos pegar a função tick e implementá-la aqui no Tower CP.

33
00:02:23,550 --> 00:02:29,370
‫Agora precisamos prefixar o nome da função tick com uma torre e os dois pontos duplos.

34
00:02:29,370 --> 00:02:34,950
‫E como sempre, é uma boa ideia chamar super tick e precisamos passar no horário Delta.

35
00:02:34,950 --> 00:02:40,830
‫Agora o que eu gostaria de fazer aqui é girar a torre do tanque para que a torre ameace o tanque e

36
00:02:40,830 --> 00:02:42,390
‫esteja pronta para disparar projéteis.

37
00:02:42,390 --> 00:02:45,870
‫Mas eu gostaria de fazer isso apenas se o tanque estiver dentro do alcance.

38
00:02:46,170 --> 00:02:52,620
‫Agora, para saber se o tanque está ou não dentro do alcance, precisamos saber a distância da torre

39
00:02:52,620 --> 00:02:53,750
‫ao tanque.

40
00:02:53,760 --> 00:02:57,510
‫Agora, aqui está um pequeno aparelho que representa a origem do mundo.

41
00:02:57,510 --> 00:03:01,470
‫Em outras palavras, o ponto no espaço onde X, Y e Z são zero.

42
00:03:01,470 --> 00:03:08,220
‫Agora, quando falamos sobre a localização de um ator, estamos falando sobre o vetor da origem até aquela

43
00:03:08,220 --> 00:03:08,970
‫localização.

44
00:03:08,970 --> 00:03:15,060
‫E sempre podemos obter esse vetor de localização usando get ator location para que possamos obter a localização de uma

45
00:03:15,060 --> 00:03:17,430
‫das torres e a localização do tanque.

46
00:03:17,430 --> 00:03:21,930
‫E se conhecermos esses dois locais, podemos calcular a distância entre eles.

47
00:03:21,930 --> 00:03:28,470
‫Agora, poderíamos fazer isso com matemática vetorial, mas a classe de vetor F tem uma função chamada dist, e essa

48
00:03:28,470 --> 00:03:33,810
‫função leva para vetores de localização e o que ela retorna é a distância entre eles.

49
00:03:33,810 --> 00:03:40,440
‫Então aqui no arquivo CP da torre, na função tick, vou escrever algumas notas apenas para sabermos o

50
00:03:40,440 --> 00:03:41,940
‫que devemos fazer.

51
00:03:41,940 --> 00:03:52,890
‫Primeiro, precisamos encontrar a distância até o tanque após essa verificação para ver se o tanque está no alcance e se

52
00:03:52,890 --> 00:03:58,170
‫estiver no alcance, gire a torre em direção ao tanque.

53
00:03:59,070 --> 00:04:00,960
‫Então temos algumas coisas para fazer aqui.

54
00:04:01,140 --> 00:04:05,820
‫Agora, para encontrar a distância até o tanque, precisamos pegar o tanque.

55
00:04:05,850 --> 00:04:08,640
‫Agora, um bom lugar para fazer isso é em Begin Play.

56
00:04:08,640 --> 00:04:13,350
‫Então, além da função tick, vamos em frente e substituir Begin Play.

57
00:04:13,380 --> 00:04:17,580
‫Agora observe no tanque H, o início do jogo está em uma seção protegida.

58
00:04:17,580 --> 00:04:21,210
‫Vamos mantê-lo protegido na torre também.

59
00:04:21,210 --> 00:04:27,870
‫Então, colocaremos a seção protegida logo abaixo da pública e implementaremos o início da reprodução logo abaixo do

60
00:04:27,870 --> 00:04:28,380
‫tick.

61
00:04:28,380 --> 00:04:35,580
‫Então vamos para Tower Dot, CP, implementar, começar a jogar qualificar totalmente o nome da função e como você

62
00:04:35,580 --> 00:04:38,670
‫provavelmente adivinhou, estamos chamando Super Begin Play.

63
00:04:38,790 --> 00:04:44,310
‫Agora para pegar o tanque e armazená-lo em uma variável, precisamos de uma variável do tipo tanque.

64
00:04:44,310 --> 00:04:49,200
‫Então, vamos colocar isso aqui nas Torres H em uma seção privada.

65
00:04:49,200 --> 00:04:55,290
‫Agora este será um tanque A, é um ponteiro e podemos simplesmente chamar este tanque.

66
00:04:55,290 --> 00:05:01,980
‫E para evitar ter que incluir o tanque H aqui, podemos encaminhar declarar que vimos o quão importante isso

67
00:05:01,980 --> 00:05:03,000
‫pode ser.

68
00:05:03,360 --> 00:05:09,540
‫Então agora temos esse ponteiro de tanque e se pudermos descobrir como acessar o tanque, podemos armazená-lo em nosso ponteiro

69
00:05:09,540 --> 00:05:11,970
‫de tanque aqui e começar a jogar.

70
00:05:12,000 --> 00:05:18,510
‫A primeira coisa que vou fazer é incluir o Tank H, para que possamos realmente usar o tipo.

71
00:05:18,510 --> 00:05:20,580
‫Então, como acessamos o tanque?

72
00:05:20,580 --> 00:05:26,220
‫Bem, aqui está a documentação do mecanismo irreal para uma função útil chamada obter peão do jogador.

73
00:05:26,310 --> 00:05:29,100
‫Existe em uma estática de jogo.

74
00:05:29,160 --> 00:05:34,680
‫Então, já que eu tenho isso aberto, vou em frente e copie o include para a estática do jogo e dê

75
00:05:34,680 --> 00:05:35,910
‫uma olhada na sintaxe.

76
00:05:35,910 --> 00:05:39,060
‫Ele tem duas entradas um objeto de contexto mundial.

77
00:05:39,470 --> 00:05:42,950
‫Já sabemos como lidar com isso e um índice de jogadores.

78
00:05:42,950 --> 00:05:49,310
‫E como vimos para jogos single player como o nosso, o índice de jogadores sempre será o jogador

79
00:05:49,310 --> 00:05:53,660
‫zero e isso nos permitirá acessar o peão correspondente ao jogador zero.

80
00:05:54,050 --> 00:05:57,650
‫Então vamos chamar essa função aqui no Tower Dot CP.

81
00:05:57,680 --> 00:06:04,850
‫Vou colar no include para você as estatísticas de jogo e, no início do jogo, vou definir

82
00:06:04,850 --> 00:06:12,290
‫o tanque igual às suas estáticas de jogo, obter jogador - para o objeto de contexto do mundo.

83
00:06:12,290 --> 00:06:17,910
‫Eu posso passar nisso e para o índice de jogadores podemos passar em zero.

84
00:06:17,930 --> 00:06:19,970
‫Agora confira o rabisco vermelho.

85
00:06:19,970 --> 00:06:26,120
‫Diz que um valor do tipo um peão não pode ser atribuído a uma entidade do tipo tanque A.

86
00:06:26,150 --> 00:06:33,290
‫Este é exatamente o mesmo problema que encontramos quando tentávamos chamar, obter o controlador e armazenar o resultado

87
00:06:33,320 --> 00:06:35,810
‫em um controlador de jogador A.

88
00:06:35,870 --> 00:06:42,200
‫Um tanque é filho de um peão, então não podemos armazenar um tipo pai em um ponteiro filho.

89
00:06:42,200 --> 00:06:43,370
‫Temos que.

90
00:06:44,150 --> 00:06:46,060
‫Você adivinhou, temos que lançar.

91
00:06:46,070 --> 00:06:51,830
‫Então, vamos pegar o valor retornado disso e colocá-lo dentro de uma chamada de função de conversão.

92
00:06:51,830 --> 00:06:56,000
‫Então, vamos dizer elenco e estamos lançando para um tanque.

93
00:06:56,000 --> 00:07:02,300
‫E o que estamos passando para o elenco será essa chamada para pegar o jogador da lagoa.

94
00:07:02,300 --> 00:07:04,850
‫Então vamos colocar isso aí entre parênteses.

95
00:07:04,850 --> 00:07:09,260
‫E após o elenco teremos acesso ao tanque.

96
00:07:09,380 --> 00:07:16,310
‫Agora que temos acesso ao tanque, podemos encontrar a distância até o tanque e a distância é uma boia.

97
00:07:16,310 --> 00:07:20,240
‫Assim, podemos fazer uma variável flutuante local chamada distance.

98
00:07:20,600 --> 00:07:27,380
‫E o que vamos igualar é o resultado de chamar a função estática do vetor F dist.

99
00:07:27,410 --> 00:07:31,700
‫Agora dist recebe dois parâmetros de entrada do vetor tipo F.

100
00:07:31,880 --> 00:07:34,850
‫Agora queremos a distância entre dois pontos no espaço.

101
00:07:34,850 --> 00:07:37,010
‫Uma delas é a localização da torre.

102
00:07:37,010 --> 00:07:43,190
‫Estamos na classe da torre, então podemos chamar get ator location e isso nos dá a localização da torre.

103
00:07:43,190 --> 00:07:44,660
‫Mas e o tanque?

104
00:07:44,660 --> 00:07:50,870
‫Bem, podemos ligar para o tanque, obter a localização do ator, e agora temos a distância.

105
00:07:50,870 --> 00:07:56,450
‫Agora, o único problema é que estamos usando o ponteiro do tanque sem primeiro verificar se ele não

106
00:07:56,450 --> 00:07:57,110
‫é nulo.

107
00:07:57,290 --> 00:08:05,600
‫Então temos que dizer if tank primeiro e então podemos pegar essa chamada de função e arrastá-la aqui dentro da

108
00:08:05,600 --> 00:08:06,860
‫instrução if.

109
00:08:06,860 --> 00:08:13,190
‫Portanto, se o tanque for válido, podemos acessar sua localização com get ator location.

110
00:08:13,190 --> 00:08:14,030
‫Excelente.

111
00:08:14,030 --> 00:08:19,130
‫Já que estamos trabalhando nessa instrução if, vou mover esses outros comentários aqui para dentro dela porque

112
00:08:19,130 --> 00:08:24,410
‫sabemos que não podemos verificar se o tanque está dentro do alcance, se o tanque nem é válido.

113
00:08:24,590 --> 00:08:28,790
‫Então eu gostaria de desafiá-lo a girar a torre em direção ao tanque.

114
00:08:28,790 --> 00:08:33,020
‫Agora, só queremos fazer isso se o tanque estiver ao alcance, temos a distância.

115
00:08:33,020 --> 00:08:35,240
‫Então agora precisamos de uma variável de alcance de tiro.

116
00:08:35,240 --> 00:08:40,490
‫Então crie um float chamado fire range na classe tower e exponha isso com sua propriedade.

117
00:08:40,490 --> 00:08:42,980
‫Gostaríamos de poder editar isso a partir do editor.

118
00:08:43,010 --> 00:08:45,890
‫Agora você vai verificar se o tanque está dentro do alcance.

119
00:08:45,890 --> 00:08:50,630
‫Se é chamado de rotação da torre e rotação da torre precisa de uma olhada no alvo.

120
00:08:50,630 --> 00:08:53,180
‫Você vai passar no local dos tanques.

121
00:08:53,180 --> 00:08:56,660
‫Portanto, pause o vídeo e implemente esse comportamento agora.

122
00:09:00,030 --> 00:09:00,420
‫OK.

123
00:09:00,420 --> 00:09:02,370
‫Então, precisamos de uma variável de alcance de tiro.

124
00:09:02,370 --> 00:09:05,940
‫Então aqui na Torre H, temos uma seção privada.

125
00:09:05,940 --> 00:09:07,680
‫Nós vamos fazer um flutuador.

126
00:09:08,340 --> 00:09:15,450
‫Vou chamar esse intervalo de tiro e vou em frente e inicializá-lo com um valor de, digamos,

127
00:09:15,450 --> 00:09:16,650
‫300 F.

128
00:09:16,650 --> 00:09:21,030
‫Mas vamos experimentar isso porque será uma propriedade sua.

129
00:09:21,240 --> 00:09:22,860
‫Então você propriedade.

130
00:09:22,860 --> 00:09:29,070
‫E como eu gostaria que todos os tanques tivessem o mesmo alcance de tiro, eu vou fazer isso e apenas

131
00:09:29,070 --> 00:09:29,910
‫o padrão.

132
00:09:29,910 --> 00:09:33,270
‫Dessa forma, só podemos editá-lo no blueprint padrão.

133
00:09:33,300 --> 00:09:38,940
‫Agora, se você fez a sua edição em qualquer lugar ou talvez edite apenas a instância, tudo bem.

134
00:09:38,940 --> 00:09:42,090
‫É realmente uma questão de preferência e podemos mudar depois.

135
00:09:42,090 --> 00:09:46,710
‫Vou dar uma categoria também e vou chamar essa categoria de combate.

136
00:09:46,740 --> 00:09:50,820
‫Vamos entrar na Torre CP e temos este próximo ponto aqui.

137
00:09:50,820 --> 00:09:57,120
‫Verifique se o tanque está dentro do alcance, o que significa que precisamos verificar se a distância é menor

138
00:09:57,120 --> 00:09:59,160
‫ou igual ao alcance do fogo.

139
00:09:59,160 --> 00:10:04,860
‫Temos menor ou igual a e não apenas igual a, porque de quadro a quadro, a distância pode realmente

140
00:10:04,860 --> 00:10:11,310
‫ser maior que o alcance de tiro, um quadro e menor que o alcance de tiro o próximo quadro passando completamente o alcance

141
00:10:11,310 --> 00:10:11,970
‫de tiro.

142
00:10:11,970 --> 00:10:15,870
‫Então, na verdade, pode nunca se tornar exatamente igual ao alcance de fogo.

143
00:10:15,870 --> 00:10:20,820
‫Na verdade, com valores de ponto flutuante, dois floats sendo exatamente iguais é bastante raro.

144
00:10:20,820 --> 00:10:26,640
‫Então temos isso se checar e se chegarmos ao interior dele, isso significa que a distância é menor ou igual ao

145
00:10:26,640 --> 00:10:27,630
‫alcance do tiro.

146
00:10:27,630 --> 00:10:33,120
‫O tanque está agora ao alcance, o que significa que este comentário pode ser movido para lá.

147
00:10:33,960 --> 00:10:41,190
‫Agora, se estiver dentro do alcance, gire a torre em direção ao tanque, isso significa que vamos chamar a função de rotação

148
00:10:41,190 --> 00:10:42,180
‫da torre.

149
00:10:42,390 --> 00:10:45,690
‫Essa é a nossa função protegida que colocamos no pod base.

150
00:10:45,720 --> 00:10:51,060
‫Agora gire a torre para dar uma olhada no alvo e precisamos da localização do tanque.

151
00:10:51,060 --> 00:10:55,410
‫Então isso vai ser um tanque para obter a localização do ator.

152
00:10:55,410 --> 00:11:02,010
‫E com isso agora estamos chamando a torre rotativa apenas se o tanque estiver ao alcance.

153
00:11:02,010 --> 00:11:05,040
‫Então vamos compilar isso e ver como funciona.

154
00:11:05,340 --> 00:11:12,030
‫Então, estamos de volta aqui no editor e o que precisamos fazer é entrar em plantas, peões e encontrar uma torre de

155
00:11:12,030 --> 00:11:15,120
‫peões BP e abrir o editor de plantas completo.

156
00:11:15,120 --> 00:11:22,170
‫Agora, no canto superior direito, vemos o peão base da classe pai, mas queremos que nossa classe pai seja a torre

157
00:11:22,170 --> 00:11:27,930
‫para que possamos acessar as configurações de classe, classe pai e procurar por torre e selecioná-la.

158
00:11:27,960 --> 00:11:31,980
‫Agora nossa torre de peões é baseada na classe da torre.

159
00:11:31,980 --> 00:11:34,710
‫Agora vamos ver o que acontece quando apertamos o play.

160
00:11:35,070 --> 00:11:37,200
‫Ok, então estou movendo o tanque ao redor.

161
00:11:37,200 --> 00:11:40,560
‫Não estamos ao alcance, então não vemos nenhum movimento das torres.

162
00:11:40,560 --> 00:11:44,100
‫Mas se eu chegar ao alcance, olhe para isso.

163
00:11:44,100 --> 00:11:47,970
‫Agora eles estão me seguindo e parece bastante ameaçador.

164
00:11:48,120 --> 00:11:52,080
‫Agora 300 unidades não está tão longe.

165
00:11:52,080 --> 00:11:55,440
‫Então, o que eu gostaria de fazer é editar essa distância.

166
00:11:55,440 --> 00:12:00,840
‫Então, daqui em BP Pawn Turret, vou selecionar BP Pond Turret self.

167
00:12:00,840 --> 00:12:02,850
‫E aqui está a seção de combate.

168
00:12:02,850 --> 00:12:06,840
‫Eu vou em frente e definir isso para cerca de 700.

169
00:12:07,890 --> 00:12:13,350
‫Agora, se eu apertar o play, verei que eles não estarão girando enquanto eu estiver voltando para cá.

170
00:12:13,350 --> 00:12:16,410
‫Mas assim que chego ao alcance, agora eles estão olhando para mim.

171
00:12:18,180 --> 00:12:19,020
‫Perfeito.

172
00:12:20,030 --> 00:12:23,120
‫Então, em resumo, criamos a classe torre.

173
00:12:23,120 --> 00:12:25,720
‫Agora temos um inimigo para o tanque.

174
00:12:25,730 --> 00:12:32,060
‫Também giramos a torre da torre em direção ao tanque na função tick e só estamos fazendo isso se o tanque

175
00:12:32,060 --> 00:12:33,770
‫estiver ao alcance do fogo.

176
00:12:33,770 --> 00:12:39,650
‫Também expusemos a variável de alcance de tiro para que ela possa ser ajustada no projeto.

177
00:12:39,770 --> 00:12:41,600
‫Estamos quase prontos para o combate.

178
00:12:41,630 --> 00:12:44,450
‫Vamos começar a configurar isso nos próximos vídeos.

179
00:12:44,630 --> 00:12:45,620
‫Vejo você em breve.

