﻿1
00:00:04,260 --> 00:00:05,340
‫Bem vindo de volta.

2
00:00:05,700 --> 00:00:11,550
‫Agora temos um modo de jogo e gostaríamos de usar o modo de jogo para determinar quando podemos iniciar o jogo.

3
00:00:11,580 --> 00:00:17,700
‫Agora, alguns jogos têm um atraso ou um cronômetro de contagem regressiva que começa quando o jogo começa.

4
00:00:17,700 --> 00:00:23,460
‫E após um determinado período de tempo, o jogador pode mover o personagem ou, no nosso

5
00:00:23,460 --> 00:00:25,450
‫caso, o tanque pelo mundo.

6
00:00:25,470 --> 00:00:28,500
‫Então, vamos implementar isso neste vídeo.

7
00:00:28,530 --> 00:00:35,520
‫Isso envolverá primeiro desabilitar a entrada para que não possamos nos movimentar quando o jogo começar e, em

8
00:00:35,520 --> 00:00:41,860
‫seguida, definiremos um cronômetro e, após um determinado período de tempo, poderemos habilitar a entrada.

9
00:00:41,880 --> 00:00:47,870
‫Então, vamos voltar ao modo de jogo dos tanques e adicionar algumas coisas aqui.

10
00:00:47,880 --> 00:00:54,030
‫Primeiro, gostaria de adicionar um float para a quantidade de tempo que deve passar quando o jogo começar antes que possamos

11
00:00:54,030 --> 00:00:55,380
‫começar a nos mover.

12
00:00:55,410 --> 00:01:03,120
‫Então esse float vai ser chamado de start delay e eu vou inicializar isso com três pontos F para que tenhamos

13
00:01:03,120 --> 00:01:06,800
‫que esperar 3 segundos antes de podermos começar o jogo.

14
00:01:06,810 --> 00:01:12,420
‫Agora, assim que o jogo começar, eu gostaria de iniciar este cronômetro, o que significa que eu gostaria de uma

15
00:01:12,420 --> 00:01:16,510
‫função que inicie este cronômetro, e eu vou fazer disso uma função privada também.

16
00:01:16,530 --> 00:01:21,180
‫Eu vou fazer disso uma função void chamada handle game start.

17
00:01:21,210 --> 00:01:25,200
‫Agora eu posso implementar o início do jogo no modo de jogo de tanques de sintonia.

18
00:01:25,470 --> 00:01:28,320
‫Desça aqui em começar a jogar.

19
00:01:28,770 --> 00:01:36,090
‫Agora eu não vou esquecer de adicionar o nome da classe do modo de jogo de tanques de ajuste aqui e agora eu tenho uma função de início de

20
00:01:36,090 --> 00:01:36,930
‫jogo de alça.

21
00:01:37,170 --> 00:01:40,410
‫Agora, o lugar para chamar isso seria Begin Play.

22
00:01:40,620 --> 00:01:43,590
‫Já que Begin Play é chamado no início do jogo.

23
00:01:43,590 --> 00:01:47,180
‫Então eu vou chamar handle game, começar aqui e começar a jogar.

24
00:01:47,190 --> 00:01:52,110
‫E como estamos fazendo algumas coisas aqui no início do jogo, onde definir o

25
00:01:52,110 --> 00:01:58,050
‫tanque e os tanques de sintonia, jogador, variáveis de controle, gostaria de movê-los para o início do jogo.

26
00:01:58,050 --> 00:02:03,600
‫Então, vou movê-los para o início do jogo e, dessa forma, o controlador do jogador de tanques e tanques de

27
00:02:03,600 --> 00:02:08,940
‫ajuste será definido, já que estamos chamando o início do jogo de controle aqui e começar a jogar.

28
00:02:08,940 --> 00:02:15,990
‫Então, aqui é onde eu gostaria de iniciar um cronômetro de contagem regressiva após o qual podemos habilitar a entrada do usuário.

29
00:02:15,990 --> 00:02:21,480
‫Agora, antes de iniciar o cronômetro, vou desativar a entrada para que não possamos mover o tanque ainda.

30
00:02:21,690 --> 00:02:24,420
‫E isso vai exigir nossa função.

31
00:02:24,420 --> 00:02:29,670
‫Colocamos aqui nos tanques de sintonia, o controlador do jogador chamado de estado habilitado para o jogador definido.

32
00:02:29,670 --> 00:02:33,690
‫E isso significa que vou usar tanques de sintonia, controle de jogador.

33
00:02:33,690 --> 00:02:38,400
‫E se eu for usar o controle do player do tune tank, é uma boa ideia ter certeza de que é válido.

34
00:02:38,400 --> 00:02:46,200
‫Então, eu vou dizer se tune tanks, player, controller e se chegarmos ao

35
00:02:46,200 --> 00:02:57,570
‫interior desta declaração if, então eu posso pegar tune tanks, player controller e call set player enabled state e passar false.

36
00:02:57,690 --> 00:03:00,720
‫E assim nosso tanque não poderá se mover.

37
00:03:00,720 --> 00:03:06,780
‫E eu vejo os rabiscos vermelhos e isso é porque eu disse tanques de tanques, controle de jogador em vez de tanques

38
00:03:06,780 --> 00:03:07,380
‫de ajuste.

39
00:03:07,830 --> 00:03:11,250
‫Então, soletrando corretamente agora eu não recebo erros lá.

40
00:03:11,250 --> 00:03:13,690
‫Então, em seguida, precisamos iniciar um cronômetro.

41
00:03:13,710 --> 00:03:20,850
‫Agora sabemos que os cronômetros envolvem o uso de um identificador de cronômetro F e podemos criar um identificador de cronômetro F

42
00:03:20,850 --> 00:03:25,110
‫em vez de ter uma variável de membro que pertença à classe.

43
00:03:25,200 --> 00:03:31,470
‫Então eu vou fazer isso e vou chamar esse player de habilitar o timer handle.

44
00:03:31,800 --> 00:03:38,340
‫E em seguida, precisamos definir um timer agora para a função de retorno de chamada do nosso timer, eu

45
00:03:38,340 --> 00:03:45,390
‫gostaria de usar set player enabled state, mas set player enabled state é uma função que requer uma entrada do tipo boolean.

46
00:03:45,990 --> 00:03:51,900
‫Agora não vimos como definir um cronômetro usando um retorno de chamada que requer parâmetros de entrada.

47
00:03:51,900 --> 00:03:56,190
‫Isso envolverá um novo conceito chamado timer delegate.

48
00:03:56,190 --> 00:03:59,310
‫Então, vamos dar uma olhada no sistema de timer do Unreal Engine.

49
00:03:59,310 --> 00:04:07,080
‫Novamente, sabemos que existe um gerenciador de timer mundial que gerencia nossos timers e tem uma função de timer definida.

50
00:04:07,170 --> 00:04:11,280
‫Agora existem várias sobrecargas da função de timer set.

51
00:04:11,370 --> 00:04:13,410
‫Já vimos um deles.

52
00:04:13,440 --> 00:04:16,710
‫Agora vou falar sobre outra versão desta função.

53
00:04:16,710 --> 00:04:24,570
‫E esta versão requer um identificador de cronômetro, uma taxa de cronômetro ou um tempo de atraso durante o qual devemos esperar antes que nossa função

54
00:04:24,570 --> 00:04:26,760
‫de retorno de chamada seja chamada.

55
00:04:26,760 --> 00:04:32,550
‫E em vez de pegar o endereço de uma função de retorno de chamada diretamente, pode pegar algo chamado

56
00:04:32,550 --> 00:04:33,270
‫timer delegate.

57
00:04:33,270 --> 00:04:40,440
‫Esta é uma estrutura do tipo F timer delegate, que nos permite criar um objeto que pode vincular uma função diretamente

58
00:04:40,440 --> 00:04:41,490
‫a ele.

59
00:04:41,490 --> 00:04:45,600
‫E os delegados do temporizador podem vincular funções que exigem parâmetros de entrada.

60
00:04:45,600 --> 00:04:53,370
‫Agora podemos criar uma variável EF timer delegate e inicializá-la usando a função create you object do

61
00:04:53,370 --> 00:04:55,080
‫f timer delegate.

62
00:04:55,110 --> 00:05:00,990
‫Isso criará um novo delegado de timer e o inicializará com base no que passamos para os parênteses.

63
00:05:00,990 --> 00:05:03,810
‫Isso levará um objeto de usuário que é de.

64
00:05:03,860 --> 00:05:08,110
‫Claro, a classe em que nossa função de retorno de chamada existe.

65
00:05:08,120 --> 00:05:15,110
‫E em seguida, ele pega o endereço da própria função de retorno de chamada, seguido por quaisquer valores de entrada que gostaríamos que fossem

66
00:05:15,110 --> 00:05:18,450
‫passados para nosso retorno de chamada assim que ele fosse chamado.

67
00:05:18,470 --> 00:05:24,830
‫A partir daí, podemos chamar set timer do gerenciador de timer mundial e usar a sobrecarga que leva um timer

68
00:05:24,830 --> 00:05:25,450
‫delegado.

69
00:05:25,460 --> 00:05:32,300
‫Essa sobrecarga requer o próprio identificador do cronômetro, o delegado do cronômetro, a taxa de reprodução ou um float que determina o atraso

70
00:05:32,300 --> 00:05:38,630
‫antes do qual nosso retorno de chamada será chamado e, em seguida, um booleano para determinar se nosso cronômetro deve ou

71
00:05:38,630 --> 00:05:43,310
‫não fazer um loop para que saibamos como criar um Delegado do temporizador F.

72
00:05:43,310 --> 00:05:49,610
‫Então eu gostaria que você criasse uma na função handle game start dentro de nossa nova instrução if.

73
00:05:49,610 --> 00:05:54,200
‫Portanto, crie um delegado de temporizador f local e use delegado de temporizador f.

74
00:05:54,200 --> 00:05:55,640
‫Crie seu objeto.

75
00:05:55,640 --> 00:06:01,610
‫Agora vamos precisar passar um objeto de usuário e geralmente estamos usando isso como o objeto de usuário,

76
00:06:01,610 --> 00:06:05,870
‫mas a função que gostaríamos de chamar existe no controlador do player.

77
00:06:05,870 --> 00:06:12,320
‫Então, passe o controlador de jogador de tanques de ajuste variável como a primeira entrada que será o objeto de

78
00:06:12,320 --> 00:06:18,890
‫usuário e a função de retorno de chamada será definida como habilitada para o estado dessa função que adicionamos ao nosso

79
00:06:18,890 --> 00:06:20,300
‫controlador de jogador personalizado.

80
00:06:20,300 --> 00:06:25,730
‫Não esqueça o endereço do operador e como terceira entrada vamos passar o valor.

81
00:06:25,730 --> 00:06:32,330
‫É verdade, isso é o que será passado para o estado ativado do player definido quando nosso retorno de chamada for chamado

82
00:06:32,330 --> 00:06:33,590
‫no final do cronômetro.

83
00:06:33,590 --> 00:06:36,710
‫Então pause o vídeo e experimente agora.

84
00:06:39,560 --> 00:06:46,580
‫Então, logo abaixo do nosso identificador de timer, eu vou criar um delegado de timer F local e

85
00:06:46,580 --> 00:06:50,540
‫vou chamar esse player de delegado de timer de habilitação.

86
00:06:51,140 --> 00:06:51,710
‫Tudo bem.

87
00:06:51,710 --> 00:06:53,030
‫Se você o nomeou outra coisa.

88
00:06:53,030 --> 00:07:00,200
‫Agora vou inicializar isso usando f timer, delegate, criar seu objeto.

89
00:07:00,470 --> 00:07:06,590
‫E isso primeiro pegará um objeto de usuário e esse será nosso controlador de jogador de tanques de sintonia.

90
00:07:06,590 --> 00:07:11,300
‫Então, eu vou dizer tune tanks player controller como a primeira entrada.

91
00:07:11,390 --> 00:07:19,250
‫E para o segundo, precisamos de nossa função de retorno de chamada e isso será um player de tanques de ajuste,

92
00:07:19,910 --> 00:07:23,360
‫estado habilitado para player de conjunto de controle.

93
00:07:23,360 --> 00:07:30,290
‫E eu não posso esquecer, eu preciso do endereço do operador para este endereço de função e o valor que eu gostaria que

94
00:07:30,290 --> 00:07:34,670
‫fosse passado para esta função de retorno de chamada será verdadeiro dessa maneira.

95
00:07:34,670 --> 00:07:41,120
‫No final do tempo de atraso, quando esse retorno de chamada for chamado de true, será o valor passado para a função de

96
00:07:41,120 --> 00:07:42,290
‫retorno de chamada.

97
00:07:42,290 --> 00:07:48,770
‫Agora estou pronto para chamar set timer, o que significa que preciso chamar get world timer manager.

98
00:07:48,950 --> 00:07:51,530
‫E então, a partir daí, posso chamar o timer de set.

99
00:07:52,070 --> 00:07:59,030
‫E a sobrecarga de função que estamos usando primeiro usa um identificador de timer e esse será o identificador de timer

100
00:07:59,060 --> 00:08:00,560
‫de habilitação do jogador.

101
00:08:00,590 --> 00:08:04,370
‫A próxima entrada que vou passar será o delegado.

102
00:08:04,370 --> 00:08:08,630
‫Então isso vai habilitar o jogador, delegar o timer.

103
00:08:10,130 --> 00:08:10,520
‫Próximo.

104
00:08:10,520 --> 00:08:16,700
‫Precisamos do nosso tempo de atraso e será o atraso de início, que é o float que acabamos de criar.

105
00:08:16,730 --> 00:08:20,120
‫Então, em seguida, estou passando em atraso de início.

106
00:08:20,990 --> 00:08:27,590
‫E, finalmente, não quero que esse cronômetro faça um loop, então vou passar false para que não tenhamos um comportamento

107
00:08:27,590 --> 00:08:28,430
‫de loop.

108
00:08:29,300 --> 00:08:33,020
‫Agora vou avançar e indentar essas entradas para que fique bonito.

109
00:08:33,710 --> 00:08:38,690
‫E agora estamos chamando set timer usando nosso novo delegado de timer.

110
00:08:38,690 --> 00:08:45,380
‫E no final desse tempo de atraso, devemos obter nossa função de retorno de chamada set player enabled state chamado com

111
00:08:45,380 --> 00:08:51,440
‫o valor true passado agora, já que o atraso de início é de 3 segundos e estamos chamando set

112
00:08:51,440 --> 00:08:55,190
‫player enabled state passando em false antes de definir nosso timer.

113
00:08:55,190 --> 00:09:00,920
‫Quando pressionamos o play, não devemos ser capazes de nos mover até que esse atraso de três segundos termine.

114
00:09:00,920 --> 00:09:03,590
‫Então vamos compilar isso e ver como funciona.

115
00:09:04,100 --> 00:09:09,140
‫Então eu vou em frente e aperte o play e estou tentando me mover e não consigo.

116
00:09:09,140 --> 00:09:12,470
‫E depois de 3 segundos eu posso me mover de repente.

117
00:09:12,500 --> 00:09:14,210
‫E também confira isso.

118
00:09:14,240 --> 00:09:17,330
‫Observe que meu cursor é a mira.

119
00:09:17,330 --> 00:09:23,000
‫Pode ser difícil ver na tela, mas você deve conseguir vê-lo na tela perfeitamente.

120
00:09:23,000 --> 00:09:27,470
‫E isso torna muito mais fácil para mim mirar e controlar meus tanques.

121
00:09:27,470 --> 00:09:28,820
‫Rotação da torre.

122
00:09:29,210 --> 00:09:30,140
‫Perfeito.

123
00:09:30,140 --> 00:09:36,440
‫Então, em resumo, criamos uma função de início de jogo para o modo de jogo e estamos chamando isso e começamos

124
00:09:36,440 --> 00:09:37,370
‫a jogar.

125
00:09:37,580 --> 00:09:45,830
‫E também definimos um cronômetro usando um delegado de cronômetro ao qual vinculamos nossa função de estado habilitada para o player definido no

126
00:09:45,830 --> 00:09:47,180
‫controlador do player.

127
00:09:47,180 --> 00:09:53,810
‫Isso nos permitiu ter um retorno de chamada de função para nosso timer que recebe parâmetros de entrada e usamos isso para habilitar

128
00:09:53,810 --> 00:09:58,340
‫a entrada do usuário após um atraso de três segundos quando o jogo é iniciado.

129
00:09:58,370 --> 00:10:03,470
‫Agora, isso pode ser frustrante para um jogador se ele não tiver algum tipo de sugestão visual, meio que

130
00:10:03,470 --> 00:10:05,690
‫informando que a entrada não está ativada.

131
00:10:05,690 --> 00:10:08,150
‫Algo como uma contagem regressiva na tela.

132
00:10:08,150 --> 00:10:10,640
‫Vamos cuidar disso em vídeos futuros.

133
00:10:10,640 --> 00:10:12,410
‫Mas por enquanto, parabéns.

134
00:10:12,410 --> 00:10:18,170
‫Agora você sabe como associar uma função que leva parâmetros de entrada para um delegado de timer.

135
00:10:18,170 --> 00:10:19,640
‫Vejo vocês no próximo vídeo.

