﻿1
00:00:04,710 --> 00:00:06,600
‫Olá e bem-vindo de volta.

2
00:00:06,630 --> 00:00:09,660
‫Agora estamos prontos para começar a lidar com a entrada do usuário.

3
00:00:09,780 --> 00:00:15,000
‫Isso significa que gostaríamos de pressionar as teclas do teclado e mover o mouse e clicar com o mouse e ver

4
00:00:15,000 --> 00:00:16,650
‫nosso tanque reagir a essa entrada.

5
00:00:16,770 --> 00:00:22,260
‫Agora, para fazer isso, primeiro precisamos realmente obter essa entrada e primeiro vamos começar a fazer

6
00:00:22,260 --> 00:00:24,450
‫isso usando mapeamentos de eixo.

7
00:00:24,450 --> 00:00:25,980
‫Então vamos falar sobre isso.

8
00:00:26,100 --> 00:00:30,600
‫Agora aqui no projeto, vamos para as configurações de edição e projeto.

9
00:00:30,780 --> 00:00:35,340
‫E se rolarmos para baixo e selecionarmos entrada, veremos nossas ligações aqui.

10
00:00:35,340 --> 00:00:39,600
‫E sob ligações existem mapeamentos de ação e mapeamentos de eixo.

11
00:00:39,630 --> 00:00:42,300
‫Vamos primeiro entrar em mapeamentos de eixos.

12
00:00:42,350 --> 00:00:47,370
‫Agora você pode ter alguma experiência com isso, mas vamos mergulhar um pouco mais fundo no

13
00:00:47,370 --> 00:00:49,700
‫que eles fazem e como funcionam.

14
00:00:49,710 --> 00:00:51,150
‫Então nós temos três deles.

15
00:00:51,240 --> 00:00:58,800
‫E se eu clicar na seta suspensa, verei aqui W e SW e estão falando sobre as teclas W

16
00:00:58,800 --> 00:01:00,780
‫e SW no teclado.

17
00:01:00,810 --> 00:01:06,960
‫Eles são atribuídos a esse mapeamento de eixo específico, chamado Move Forward.

18
00:01:06,960 --> 00:01:09,870
‫Então, vamos discutir como esse mapeamento de eixos funciona.

19
00:01:09,870 --> 00:01:17,280
‫Então vimos no The Unreal Editor que temos esse mapeamento de eixo chamado Move Forward e tem W

20
00:01:17,280 --> 00:01:20,820
‫e SCS atribuídos a esse mapeamento de eixo.

21
00:01:20,820 --> 00:01:22,950
‫Então o que isso significa exatamente?

22
00:01:23,730 --> 00:01:27,870
‫Bem, no Unreal Engine, temos algo chamado mapeamento de eixo.

23
00:01:27,870 --> 00:01:32,970
‫E o mapeamento de eixos é algo que é processado em cada quadro do jogo.

24
00:01:33,000 --> 00:01:35,700
‫Você atribui chaves a um mapeamento de eixo.

25
00:01:35,700 --> 00:01:38,460
‫No nosso caso, atribuímos W e S.

26
00:01:38,490 --> 00:01:41,370
‫Agora dê uma olhada ao lado da tecla W aqui.

27
00:01:41,370 --> 00:01:45,060
‫Na minha pequena amostra de captura de tela à direita, diz escala.

28
00:01:45,060 --> 00:01:48,180
‫E ao lado da escala há um número 1. 0.

29
00:01:48,300 --> 00:01:53,160
‫E você deve ter notado ao lado do SQ, a escala é -1. 0.

30
00:01:53,160 --> 00:01:58,650
‫Portanto, esses são valores que afetarão essas informações de entrada.

31
00:01:58,650 --> 00:02:01,080
‫Veja como funciona um mapeamento de eixo.

32
00:02:01,320 --> 00:02:08,580
‫Nosso mapeamento de eixos para a frente tem a capacidade de ser associado a uma função em C++.

33
00:02:08,700 --> 00:02:15,060
‫Agora, quando se trata de mapeamentos de eixos, se associarmos uma função a um mapeamento de eixos, ela precisa receber

34
00:02:15,060 --> 00:02:21,810
‫um parâmetro de entrada do tipo float para que possamos criar uma função em nosso lago chamada MOVE que recebe um

35
00:02:21,810 --> 00:02:22,410
‫float.

36
00:02:22,410 --> 00:02:24,870
‫Vamos apenas chamar esse valor de parâmetro de entrada.

37
00:02:24,930 --> 00:02:30,570
‫Agora há uma maneira de pegar essa função e associá-la ao nosso mapeamento de eixo de avanço.

38
00:02:30,570 --> 00:02:34,980
‫Ele disse que vinculamos a função de movimento ao mapeamento do eixo.

39
00:02:34,980 --> 00:02:41,430
‫Assim, cada quadro do sistema de entrada do Unreal Engine do jogo vai verificar se estamos pressionando a

40
00:02:41,430 --> 00:02:43,680
‫tecla W ou a tecla.

41
00:02:43,680 --> 00:02:50,730
‫E vai calcular um valor de eixo dependendo se estamos ou não pressionando essas teclas e cada

42
00:02:50,730 --> 00:02:51,600
‫quadro.

43
00:02:51,600 --> 00:02:58,080
‫Ele vai chamar essa função que temos que seguir em frente e passar o valor do eixo.

44
00:02:58,080 --> 00:03:03,810
‫O que quer que aconteça dentro dessa função depende de nós como desenvolvedores C++.

45
00:03:03,840 --> 00:03:05,310
‫Agora aqui está como funciona.

46
00:03:05,310 --> 00:03:10,860
‫Se não estivermos pressionando W ou as teclas, este valor de eixo tem o valor zero.

47
00:03:10,860 --> 00:03:16,890
‫Portanto, a função de movimento que está vinculada ao mapeamento do eixo de avanço é chamada a cada

48
00:03:16,890 --> 00:03:19,620
‫quadro e o valor flutuante passado é zero.

49
00:03:19,620 --> 00:03:22,380
‫Agora digamos que estamos pressionando a tecla W.

50
00:03:22,620 --> 00:03:26,820
‫A tecla W tem sua escala definida como 1. 0.

51
00:03:26,850 --> 00:03:33,870
‫Isso significa que nosso valor de eixo será 1. 0 e é isso que é passado para a função MOV.

52
00:03:33,870 --> 00:03:39,090
‫Portanto, a cada quadro, a função de movimento é chamada com um valor de 1. 0 passou.

53
00:03:39,120 --> 00:03:44,910
‫Agora digamos que estamos pressionando o SRC que tem um valor de escala de -1. 0.

54
00:03:44,940 --> 00:03:51,720
‫Isso significa que a cada quadro a função de movimento será chamada e -1. 0 será passado.

55
00:03:51,720 --> 00:03:58,260
‫Agora, no caso em que estamos pressionando W e S, ambos os valores são somados.

56
00:03:58,260 --> 00:04:05,040
‫Assim obtemos o 1. 0 pressionando a tecla W e obtemos -1. 0 de pressionar o SRC.

57
00:04:05,070 --> 00:04:07,200
‫Agora, ambos se cancelam.

58
00:04:07,320 --> 00:04:13,350
‫Então, se estivermos pressionando os dois ao mesmo tempo, a função move será chamada com zero passado.

59
00:04:13,710 --> 00:04:19,020
‫Portanto, dependendo de qual combinação de teclas estivermos pressionando, obteremos um valor diferente passado para

60
00:04:19,020 --> 00:04:25,230
‫nossa função MOVE e podemos fazer o que quisermos com esse valor, como usá-lo para mover o peão.

61
00:04:25,230 --> 00:04:28,500
‫Falaremos sobre realmente mover o peão em breve.

62
00:04:28,500 --> 00:04:34,620
‫Por enquanto, vamos apenas trabalhar nos configurando para que possamos lidar com essas informações do

63
00:04:34,620 --> 00:04:36,390
‫sistema de mapeamento Axis.

64
00:04:36,930 --> 00:04:43,260
‫Ok, agora que sabemos como o mapeamento do eixo funciona, é hora de criar uma função de retorno de

65
00:04:43,260 --> 00:04:46,620
‫chamada que podemos vincular ao mapeamento do eixo de avanço.

66
00:04:46,620 --> 00:04:50,370
‫Então, vou fechar as configurações do projeto e voltar para o código VS.

67
00:04:50,370 --> 00:04:58,470
‫Então, aqui no código VS, gostaríamos de criar uma função que podemos vincular ao mapeamento do eixo de avanço.

68
00:04:58,470 --> 00:05:02,640
‫Então aqui no tanque H podemos criar uma função privada.

69
00:05:02,640 --> 00:05:03,810
‫Agora vai ter.

70
00:05:03,880 --> 00:05:07,180
‫O tipo de retorno void, e eu gostaria de chamar esse movimento.

71
00:05:07,210 --> 00:05:11,950
‫Agora ele precisa ter um parâmetro de entrada float, e vamos chamar esse valor.

72
00:05:12,010 --> 00:05:16,750
‫Então vamos pegar nossa função de movimento e defini-la aqui no Tank.

73
00:05:16,970 --> 00:05:25,450
‫CP Vou colocá-lo aqui logo abaixo do construtor e precisamos de um tanque com o operador de resolução de escopo antes

74
00:05:25,450 --> 00:05:27,310
‫do nome da função.

75
00:05:27,460 --> 00:05:33,550
‫Portanto, temos essa função de movimento e estamos prontos para vinculá-la ao nosso mapeamento de eixo de avanço.

76
00:05:33,670 --> 00:05:39,340
‫E isso é feito dentro de uma função chamada setup player input component.

77
00:05:39,370 --> 00:05:40,630
‫Isso deve soar familiar.

78
00:05:40,630 --> 00:05:48,130
‫De fato, se abrirmos nosso explorador e voltarmos à Base Pont H, podemos rolar para baixo e ver na seção pública

79
00:05:48,130 --> 00:05:51,910
‫o componente de entrada do player de configuração da função.

80
00:05:51,910 --> 00:05:56,380
‫Veremos que isso é uma substituição de uma função virtual herdada.

81
00:05:56,950 --> 00:06:03,430
‫Agora, a classe base de spawn não precisa realmente configurar nenhuma entrada, e é isso que esta função é

82
00:06:03,430 --> 00:06:06,010
‫para manipular a entrada de um jogador.

83
00:06:06,040 --> 00:06:10,810
‫Agora, nossa classe de vínculo base não precisa lidar com entrada, mas nossa classe tanque sim.

84
00:06:10,810 --> 00:06:18,160
‫Então, o que podemos fazer é tirar essa função da base pond h, mas vou copiá-la porque precisamos dela

85
00:06:18,160 --> 00:06:19,240
‫no tanque.

86
00:06:19,930 --> 00:06:26,380
‫Então copiando esta função, vou até o Tank H e aqui na seção pública vou

87
00:06:26,380 --> 00:06:27,190
‫colá-la.

88
00:06:27,190 --> 00:06:32,800
‫E como não precisamos dele na base pond, vou removê-lo da classe base pond.

89
00:06:32,800 --> 00:06:38,090
‫E, de fato, vou entrar no tanque base CP e removê-lo daqui também.

90
00:06:38,110 --> 00:06:42,250
‫Então vamos em frente e excluir o componente de entrada do player de configuração do Base Pond.

91
00:06:42,460 --> 00:06:46,540
‫CP E agora não está mais na classe base da lagoa.

92
00:06:46,540 --> 00:06:52,120
‫Então vamos em frente e salvar nossas alterações e fechar a base Pond H e CP.

93
00:06:52,150 --> 00:06:59,410
‫E agora temos o componente de entrada do jogador de configuração declarado no Tanque H, mas também queremos defini-lo e o tanque.

94
00:06:59,620 --> 00:07:01,540
‫CP Então aqui no Tank.

95
00:07:01,720 --> 00:07:06,340
‫CP Vou adicionar a definição logo acima da função de movimento.

96
00:07:06,430 --> 00:07:12,880
‫Portanto, isso é nulo e é um componente de entrada do jogador de configuração do tanque.

97
00:07:13,510 --> 00:07:18,000
‫Agora vamos voltar ao Tank H e ver qual é o tipo de parâmetro de entrada.

98
00:07:18,010 --> 00:07:21,880
‫Você verá que é forward declarado aqui dentro dos parênteses.

99
00:07:21,880 --> 00:07:27,070
‫Isso é algo que você pode fazer se quiser encaminhar, declarar um tipo de classe em um arquivo de cabeçalho.

100
00:07:27,070 --> 00:07:33,370
‫Então é forward declarado aqui e precisamos que você insira o tipo de ponteiro de componente e o parâmetro é chamado de

101
00:07:33,370 --> 00:07:34,990
‫componente de entrada do player.

102
00:07:34,990 --> 00:07:37,450
‫Então, precisamos deste parâmetro de entrada no tanque.

103
00:07:37,600 --> 00:07:44,980
‫CP Então, nos parênteses para configurar o componente de entrada do player, teremos um componente de entrada U que

104
00:07:45,040 --> 00:07:50,080
‫é um ponteiro e é chamado de componente de entrada do player.

105
00:07:50,320 --> 00:07:55,300
‫Portanto, agora a assinatura da função corresponde à declaração da função.

106
00:07:55,450 --> 00:08:02,050
‫Agora, de volta ao arquivo CP, vamos dar a esta função um corpo de função e estamos sobrescrevendo esta

107
00:08:02,050 --> 00:08:07,450
‫função e é uma boa ideia chamar o componente de entrada do player super configurado.

108
00:08:07,480 --> 00:08:13,030
‫Agora, como estamos chamando a versão pai do componente de entrada do player de configuração, temos que passar uma

109
00:08:13,030 --> 00:08:15,460
‫entrada do tipo que você insere componente.

110
00:08:15,460 --> 00:08:19,900
‫Vamos passar o parâmetro de entrada para esta função aqui.

111
00:08:19,900 --> 00:08:23,430
‫Dessa forma, a classe pai chamará sua versão.

112
00:08:23,440 --> 00:08:26,620
‫Agora, o tanque base da lagoa não está implementando esta função.

113
00:08:26,620 --> 00:08:27,700
‫Acabamos de removê-lo.

114
00:08:27,700 --> 00:08:31,930
‫Mas a classe pai para base -- chamará sua versão.

115
00:08:31,930 --> 00:08:38,410
‫E sempre que você substituir uma função virtual como essa, chamar a super versão é uma boa ideia.

116
00:08:38,410 --> 00:08:43,090
‫Portanto, não perdemos nenhuma funcionalidade implementada na versão pai.

117
00:08:43,090 --> 00:08:44,440
‫Então, por que estamos fazendo isso?

118
00:08:44,470 --> 00:08:47,150
‫Para que serve o componente de entrada do player de configuração?

119
00:08:47,170 --> 00:08:51,730
‫Bem, uma das coisas boas para isso é vincular funções para acessar mapeamentos.

120
00:08:51,730 --> 00:08:56,140
‫Gostaríamos de vincular nossa função de movimento ao mapeamento de eixo de avanço.

121
00:08:56,140 --> 00:08:57,250
‫E fazemos isso aqui.

122
00:08:57,250 --> 00:09:01,180
‫Fazemos isso usando este componente de entrada do player de parâmetro de entrada.

123
00:09:01,180 --> 00:09:04,360
‫É para isso que este objeto foi projetado.

124
00:09:04,390 --> 00:09:12,160
‫Pegamos o componente de entrada do player e nesse ponteiro usamos o operador de seta para acessar uma função

125
00:09:12,160 --> 00:09:14,110
‫chamada eixo de ligação.

126
00:09:14,590 --> 00:09:17,890
‫Agora Bind Axis recebe alguns parâmetros de entrada.

127
00:09:17,890 --> 00:09:22,450
‫A primeira é uma string literal, o que significa que vamos usar a macro de texto.

128
00:09:22,600 --> 00:09:24,430
‫Agora, o que colocamos nas citações?

129
00:09:24,520 --> 00:09:27,160
‫Colocamos o nome do mapeamento do eixo.

130
00:09:27,160 --> 00:09:31,690
‫Vimos no editor que esse mapeamento de eixos se chama avançar.

131
00:09:32,020 --> 00:09:36,970
‫Então, estamos escolhendo esse mapeamento de eixo para vincular ao segundo parâmetro de entrada.

132
00:09:36,970 --> 00:09:43,690
‫Este será um ponteiro para o objeto onde vincular a função para isso é um ponteiro para

133
00:09:43,690 --> 00:09:50,590
‫a instância da classe específica onde n e como estamos na classe tanque, isso apontará para a instância

134
00:09:50,590 --> 00:09:53,280
‫do peão do tanque no jogos.

135
00:09:53,290 --> 00:09:58,120
‫Agora, o terceiro parâmetro é o endereço da função que estamos vinculando.

136
00:09:58,120 --> 00:10:01,720
‫Então temos um movimento de tanque.

137
00:10:01,750 --> 00:10:03,550
‫Muito importante que precisamos totalmente.

138
00:10:03,660 --> 00:10:06,900
‫Qualifique o nome da função com o nome da classe.

139
00:10:06,900 --> 00:10:13,200
‫E bem aqui na frente do nome da função, precisamos do endereço do operador.

140
00:10:13,230 --> 00:10:18,450
‫Agora, se você não está familiarizado com fazer algo assim, isso é simplesmente pegar o endereço de

141
00:10:18,450 --> 00:10:19,220
‫uma função.

142
00:10:19,230 --> 00:10:23,040
‫As funções podem ter endereços assim como as variáveis.

143
00:10:23,040 --> 00:10:28,320
‫Portanto, usar o endereço do operador é uma maneira de passar funções para outras funções.

144
00:10:28,320 --> 00:10:31,380
‫Então é por isso que precisamos desse endereço de operador.

145
00:10:31,380 --> 00:10:34,050
‫Portanto, temos nossa chamada de função para vincular o acesso.

146
00:10:34,200 --> 00:10:40,650
‫Agora você provavelmente está percebendo que o ponteiro de erro do IntelliSense para o tipo de classe incompleto que o componente de entrada

147
00:10:40,650 --> 00:10:41,700
‫não é permitido.

148
00:10:41,850 --> 00:10:43,710
‫Agora sabemos o que pode causar isso.

149
00:10:43,710 --> 00:10:46,950
‫Por um lado, pode significar que precisamos incluir um arquivo de cabeçalho.

150
00:10:47,220 --> 00:10:50,430
‫Outra possibilidade é que seja um erro falso.

151
00:10:50,430 --> 00:10:55,110
‫Você pode descobrir facilmente compilando, então vamos tentar compilar.

152
00:10:55,440 --> 00:10:57,600
‫Veremos que temos uma compilação bem-sucedida.

153
00:10:57,600 --> 00:10:59,640
‫Portanto, sabemos que este é um erro falso.

154
00:10:59,640 --> 00:11:04,290
‫Mas, novamente, se você quiser, pode adicionar a inclusão apenas para removê-la.

155
00:11:04,290 --> 00:11:05,790
‫Então não está incomodando você.

156
00:11:05,820 --> 00:11:10,890
‫Agora sabemos que o tipo de classe que está reclamando é seu componente de entrada.

157
00:11:11,280 --> 00:11:16,290
‫Então aqui está o componente de entrada na documentação e aqui está o include.

158
00:11:16,290 --> 00:11:23,100
‫E se adicionarmos isso aqui no topo do arquivo CP do tanque, nos livraremos desse erro falso irritante.

159
00:11:23,100 --> 00:11:29,280
‫E, novamente, porque estes têm o pragya quer incluir guardas, sabemos que os componentes de entrada não serão

160
00:11:29,280 --> 00:11:34,080
‫incluídos mais de uma vez e lá se vão os rabiscos, eles desapareceram.

161
00:11:34,350 --> 00:11:39,900
‫Então agora sabemos que essa função de movimento será chamada a cada quadro e o valor

162
00:11:39,900 --> 00:11:44,280
‫terá um valor flutuante específico dependendo se estivermos pressionando W ou ask.

163
00:11:44,670 --> 00:11:50,490
‫Agora, simplesmente saber que a função de movimento está destinada a avançar não é suficiente.

164
00:11:50,490 --> 00:11:54,750
‫Como desenvolvedores, é bom ter algum tipo de confirmação de que as coisas estão funcionando.

165
00:11:54,750 --> 00:12:01,110
‫Então, o que eu gostaria que você fizesse como seu desafio é usar o log YUI na função MOV para imprimir

166
00:12:01,110 --> 00:12:04,950
‫o valor que está sendo passado para mover esse float chamado value.

167
00:12:04,980 --> 00:12:13,110
‫Portanto, use percent f em uiy log para registrar o valor do valor float no log de saída e, em seguida, teste o jogo e

168
00:12:13,110 --> 00:12:17,020
‫pressione essas teclas e veja o que você obtém impresso no log.

169
00:12:17,040 --> 00:12:20,370
‫Pause o vídeo e adicione isso à função de movimento agora.

170
00:12:23,280 --> 00:12:23,590
‫OK.

171
00:12:23,610 --> 00:12:27,960
‫Então aqui na função mov, vou adicionar um log uii.

172
00:12:30,200 --> 00:12:33,680
‫E isso pode ser um aviso de temperatura de log.

173
00:12:33,770 --> 00:12:35,960
‫E para a macro de texto.

174
00:12:36,230 --> 00:12:42,440
‫Vou simplesmente colocar o valor percentual F e o valor.

175
00:12:42,710 --> 00:12:43,520
‫Agora tudo bem.

176
00:12:43,520 --> 00:12:48,500
‫Se você usou um tipo de verbosidade ou aviso diferente, se você sabe como fazer essas coisas.

177
00:12:48,950 --> 00:12:49,960
‫Isso é totalmente bom.

178
00:12:49,970 --> 00:12:56,090
‫Vou usar apenas um aviso aqui e sei que você usou coisas como percent se e formatou seu log

179
00:12:56,090 --> 00:12:58,100
‫com um valor de string.

180
00:12:58,130 --> 00:13:04,300
‫Porcentagem F, se você não estiver ciente, é como você pode formatar seu log de interface do usuário com um valor flutuante.

181
00:13:04,310 --> 00:13:12,380
‫Então, vamos compilar isso e de volta ao editor, vou abrir o log de saída e pressionar play e verificar onde estou

182
00:13:12,380 --> 00:13:16,190
‫enviando spam para o log de saída com inúmeras mensagens.

183
00:13:16,190 --> 00:13:19,000
‫Agora vou clicar na viewport e pressionar a tecla W.

184
00:13:19,010 --> 00:13:22,030
‫Aí está o meu valor de um que vou liberar.

185
00:13:22,040 --> 00:13:23,180
‫Está de volta a zero.

186
00:13:23,210 --> 00:13:26,570
‫Eu vou apertar a tecla e é um negativo.

187
00:13:26,570 --> 00:13:30,500
‫E se pressionarmos os dois ao mesmo tempo, obtemos zero.

188
00:13:30,500 --> 00:13:33,620
‫E assim é exatamente como esperávamos.

189
00:13:33,800 --> 00:13:34,650
‫Perfeito.

190
00:13:34,670 --> 00:13:35,390
‫Tudo bem.

191
00:13:35,390 --> 00:13:39,320
‫Então, neste vídeo, configuramos nosso lago para lidar com algumas entradas do usuário.

192
00:13:39,560 --> 00:13:46,180
‫Falamos sobre mapeamentos de acesso e vinculamos nossa função move ao mapeamento de acesso avançar.

193
00:13:46,190 --> 00:13:53,300
‫Em seguida, imprimimos esse valor de acesso usando o log YUI em nossa função MOVE, mas na verdade gostaríamos de mover nosso tanque

194
00:13:53,300 --> 00:13:57,130
‫em vez de apenas imprimir alguns valores no log de saída.

195
00:13:57,140 --> 00:14:02,720
‫Então, nas próximas palestras, vamos configurá-lo para que possamos realmente começar a mover nosso tanque.

196
00:14:03,290 --> 00:14:04,310
‫Vejo você em breve.

