﻿1
00:00:04,710 --> 00:00:06,600
‫こんにちは､ お帰りなさい｡

2
00:00:06,630 --> 00:00:09,660
‫これで､ ユーザー入力の処理を開始する準備が整いました｡

3
00:00:09,780 --> 00:00:16,650
‫つまり､ キーボードのキーを押して､ マウスを動かして､ マウスをクリックして､ その入力に戦車が反応するのを見たいんです｡

4
00:00:16,770 --> 00:00:22,260
‫さて､ そのためには､ まず､ 実際に入力を得る必要があります｡ まず､ 軸マッピングを使って､

5
00:00:22,260 --> 00:00:24,450
‫それを始めます｡

6
00:00:24,450 --> 00:00:25,980
‫では､ このことについてお話ししましょう｡

7
00:00:26,100 --> 00:00:30,600
‫ここで､ プロジェクトの編集とプロジェクト設定に移動してみましょう｡

8
00:00:30,780 --> 00:00:35,340
‫下にスクロールして入力を選択すると､ ここにバインディングが表示されます｡

9
00:00:35,340 --> 00:00:39,600
‫また､ バインディングの下には､ アクションマッピングと軸マッピングがあります｡

10
00:00:39,630 --> 00:00:42,300
‫まず､ 軸のマッピングに取り掛かります｡

11
00:00:42,350 --> 00:00:47,370
‫さて､ 皆さんはこれらを使った経験があるかもしれませんが､ 今回はこれらが何をするのか､ どのように機能するのかについて､

12
00:00:47,370 --> 00:00:49,700
‫少し掘り下げて考えてみたいと思います｡

13
00:00:49,710 --> 00:00:51,150
‫だから､ 3人いるんです｡

14
00:00:51,240 --> 00:01:00,780
‫ドロップダウンの矢印をクリックすると､ ここにWとSWと表示されますが､ これはキーボードのWとSWキーについてです｡

15
00:01:00,810 --> 00:01:06,960
‫これらは､ この特定の軸マッピングに割り当てられ､ 「Move Forward」と呼ばれています｡

16
00:01:06,960 --> 00:01:09,870
‫そこで､ この軸写像の仕組みについて説明します｡

17
00:01:09,870 --> 00:01:20,820
‫アンリアルエディタで､ Move Forwardという軸マッピングがあり､ WとSCSがこの軸マッピングに割り当てられていることを確認しました｡

18
00:01:20,820 --> 00:01:22,950
‫では､ 具体的にはどのようなことなのでしょうか｡

19
00:01:23,730 --> 00:01:27,870
‫さて､ アンリアル・エンジンでは､ 軸マッピングというものがあります｡

20
00:01:27,870 --> 00:01:32,970
‫そして､ 軸のマッピングは､ ゲームの1フレームごとに処理されるものです｡

21
00:01:33,000 --> 00:01:35,700
‫軸のマッピングにキーを割り当てる｡

22
00:01:35,700 --> 00:01:38,460
‫私たちの場合は､ WとSを割り当てました｡

23
00:01:38,490 --> 00:01:41,370
‫では､ このWキーの隣を見てください｡

24
00:01:41,370 --> 00:01:45,060
‫右の私の小さなスクリーンショットのサンプルでは､ スケールと書いてあります｡

25
00:01:45,060 --> 00:01:48,180
‫そして､ スケールの横には数字の「1」があります｡  0.

26
00:01:48,300 --> 00:01:53,160
‫そして､ SQの横にある､ 目盛りが-1であることにお気づきでしょうか｡  0.

27
00:01:53,160 --> 00:01:58,650
‫つまり､ これらはその入力情報に影響を与える値なのです｡

28
00:01:58,650 --> 00:02:01,080
‫ここでは､ 軸のマッピングの仕組みについて説明します｡

29
00:02:01,320 --> 00:02:08,580
‫私たちの軸となるマッピングの前進は､ C++の関数と関連付けることができるようになっています｡

30
00:02:08,700 --> 00:02:15,060
‫さて､ Axisマッピングに関して言えば､ 関数をAxisマッピングに関連付ける場合､ float型の入力パラメータを取る必要があるので､

31
00:02:15,060 --> 00:02:22,410
‫floatを取るMOVEという関数を池に作成することができます｡

32
00:02:22,410 --> 00:02:24,870
‫これを入力パラメータ値と呼ぶことにする｡

33
00:02:24,930 --> 00:02:30,570
‫さて､ この関数を前進軸のマッピングに関連付ける方法があります｡

34
00:02:30,570 --> 00:02:34,980
‫軸のマッピングに移動関数をバインドすると書いてありました｡

35
00:02:34,980 --> 00:02:43,680
‫そのため､ Unreal Engine の入力システムは､ ゲームの各フレームごとに､ W キーとキーのどちらを押しているかを確認するようになっています｡

36
00:02:43,680 --> 00:02:51,600
‫そして､ これらのキーを押しているかどうかに応じて､ 1フレームごとに軸の値を計算することになるのです｡

37
00:02:51,600 --> 00:02:58,080
‫この関数が呼び出され､ 軸の値が渡されるのです｡

38
00:02:58,080 --> 00:03:03,810
‫その関数の中で何が起こるかは､ C++の開発者である私たち次第なのです｡

39
00:03:03,840 --> 00:03:05,310
‫さて､ その仕組みはこうです｡

40
00:03:05,310 --> 00:03:10,860
‫WやKeyを押していなければ､ この軸の値はゼロです｡

41
00:03:10,860 --> 00:03:19,620
‫つまり､ 前方移動軸マッピングにバインドされている移動関数は1フレームごとに呼び出され､ 渡されるfloat値は0になるわけです｡

42
00:03:19,620 --> 00:03:22,380
‫今､ Wキーを押しているとします｡

43
00:03:22,620 --> 00:03:26,820
‫Wキーは､ スケールが1に設定されています｡  0.

44
00:03:26,850 --> 00:03:33,870
‫これは､ 軸の値が1になることを意味します｡  0となり､ それがMOV関数に渡されます｡

45
00:03:33,870 --> 00:03:39,090
‫そのため､ 1フレームごとに､ 値1で移動関数が呼び出されます｡  0が通過した｡

46
00:03:39,120 --> 00:03:44,910
‫ここで､ 代わりにスケール値が-1であるSRCを押すとします｡  0.

47
00:03:44,940 --> 00:03:51,720
‫つまり､ 1フレームごとに移動関数が呼び出され､ -1されることになります｡  0が渡されます｡

48
00:03:51,720 --> 00:03:58,260
‫さて､ WとSの両方を押す場合､ これらの値は両方とも加算されます｡

49
00:03:58,260 --> 00:04:05,040
‫だから､ 1が出るんです｡  Wキーを押して0とすると､ -1が得られます｡  SRCを押すことで0になります｡

50
00:04:05,070 --> 00:04:07,200
‫これで両者は相殺される｡

51
00:04:07,320 --> 00:04:13,350
‫つまり､ 両方を同時に押している場合は､ ゼロが渡された状態で移動関数が呼ばれることになる｡

52
00:04:13,710 --> 00:04:19,020
‫つまり､ どのキーを押すかによって､ MOVE関数に渡される値が変わり､

53
00:04:19,020 --> 00:04:25,230
‫その値を使ってポーンを移動させるなど､ 好きなことができるのです｡

54
00:04:25,230 --> 00:04:28,500
‫実際にポーンを移動させることについては､ いずれお話しします｡

55
00:04:28,500 --> 00:04:36,390
‫とりあえず､ Axisマッピングシステムからこの情報を扱えるように､ 実際に設定してみましょう｡

56
00:04:36,930 --> 00:04:46,620
‫さて､ Axisマッピングの仕組みがわかったところで､ いよいよmove forward軸マッピングにバインドするコールバック関数を作成します｡

57
00:04:46,620 --> 00:04:50,370
‫そこで､ プロジェクトの設定を閉じて､ VSコードに戻ることにします｡

58
00:04:50,370 --> 00:04:58,470
‫そこで､ VSコードでは､ 前進軸のマッピングにバインドできる関数を作成したいと思います｡

59
00:04:58,470 --> 00:05:02,640
‫そこで､ ここHタンクでは､ プライベート関数を作成することができます｡

60
00:05:02,640 --> 00:05:03,810
‫今､ それがある｡

61
00:05:03,880 --> 00:05:07,180
‫voidの戻り値型ですが､ この動きを呼び出したいと思います｡

62
00:05:07,210 --> 00:05:11,950
‫ここで､ floatの入力パラメータが必要になるので､ この値を呼び出すことにします｡

63
00:05:12,010 --> 00:05:16,750
‫では､ この移動関数をTankで定義してみましょう｡

64
00:05:16,970 --> 00:05:27,310
‫CP コンストラクタのすぐ下に貼り付けて､ 関数名の前にスコープ解決演算子を付けたタンクが必要ですね｡

65
00:05:27,460 --> 00:05:33,550
‫この移動関数を前方移動の軸マッピングにバインドする準備ができました｡

66
00:05:33,670 --> 00:05:39,340
‫そしてそれは､ プレーヤー入力コンポーネントのセットアップという関数の内部で行われます｡

67
00:05:39,370 --> 00:05:40,630
‫聞き覚えがあるはずだ｡

68
00:05:40,630 --> 00:05:51,910
‫実際､ エクスプローラを開いてBase Pont Hに戻ると､ スクロールダウンして公開セクションに関数セットアッププレーヤー入力コンポーネントが表示されます｡

69
00:05:51,910 --> 00:05:56,380
‫これは､ 継承された仮想関数のオーバーライドであることがわかります｡

70
00:05:56,950 --> 00:06:06,010
‫さて､ ベースとなるspawnクラスは､ 実際には入力を設定する必要はなく､ この関数はプレイヤーからの入力を処理するためのものです｡

71
00:06:06,040 --> 00:06:10,810
‫さて､ ベースとなるボンドクラスは入力を処理する必要はありませんが､ タンククラスは入力を処理する必要があります｡

72
00:06:10,810 --> 00:06:19,240
‫そこで､ この関数をbase pond hから取り出すことができるのですが､ tankで必要なのでコピーすることにします｡

73
00:06:19,930 --> 00:06:27,190
‫この関数をコピーして､ Hタンクに移動し､ ここの公開部分に貼り付けます｡

74
00:06:27,190 --> 00:06:32,800
‫そして､ base pondでは必要ないので､ base pondクラスから削除することにします｡

75
00:06:32,800 --> 00:06:38,090
‫そして実際､ 私はベースポンドCPに入り､ ここからも削除するつもりです｡

76
00:06:38,110 --> 00:06:42,250
‫それでは､ Base Pondからセットアッププレイヤー入力コンポーネントを削除してみましょう｡

77
00:06:42,460 --> 00:06:46,540
‫CP そして今､ それはベースとなる池袋のクラスではなくなりました｡

78
00:06:46,540 --> 00:06:52,120
‫それでは､ 変更を保存して､ ベースポンドHとCPを閉じましょう｡

79
00:06:52,150 --> 00:06:59,410
‫そして､ タンクHにプレイヤー入力コンポーネントのセットアップが宣言されましたが､ それとタンクを定義したいと思います｡

80
00:06:59,620 --> 00:07:01,540
‫CP ここタンクでもそうですね｡

81
00:07:01,720 --> 00:07:06,340
‫CP 移動関数のすぐ上に定義を追加しておきます｡

82
00:07:06,430 --> 00:07:12,880
‫これがvoidで､ タンクがセットされたプレイヤー入力コンポーネントですね｡

83
00:07:13,510 --> 00:07:18,000
‫では､ Hタンクに戻り､ その入力パラメータの種類を確認してみましょう｡

84
00:07:18,010 --> 00:07:21,880
‫この括弧の中で前方に宣言されているのがわかると思います｡

85
00:07:21,880 --> 00:07:27,070
‫これは､ ヘッダーファイルでクラス型を宣言して､ 転送する場合にできるものです｡

86
00:07:27,070 --> 00:07:34,990
‫つまり､ ここで前方に宣言され､ この入力コンポーネントのポインタ型が必要で､ パラメータはプレーヤー入力コンポーネントと呼ばれます｡

87
00:07:34,990 --> 00:07:37,450
‫そこで､ この入力パラメータがタンクに必要なのです｡

88
00:07:37,600 --> 00:07:44,980
‫CP だから､ setup player input component の括弧の中に､ ポインターである U input component

89
00:07:45,040 --> 00:07:50,080
‫を入れて､ player input component という名前にしています｡

90
00:07:50,320 --> 00:07:55,300
‫これで､ 関数のシグネチャが関数宣言のそれと一致するようになりました｡

91
00:07:55,450 --> 00:08:02,050
‫さて､ CPファイルに戻り､ この関数に関数ボディを与えましょう｡ この関数を上書きして､ super set

92
00:08:02,050 --> 00:08:07,450
‫up player input componentを呼び出すのは良いアイデアでしょう｡

93
00:08:07,480 --> 00:08:13,030
‫さて､ 親バージョンの setup player input component を呼び出しているので､ you input component

94
00:08:13,030 --> 00:08:15,460
‫タイプの入力を渡す必要があります｡

95
00:08:15,460 --> 00:08:19,900
‫ここでは､ この関数に入力パラメータを渡すことにします｡

96
00:08:19,900 --> 00:08:23,430
‫つまり､ この方法では､ 親クラスがそのバージョンを呼び出すことになります｡

97
00:08:23,440 --> 00:08:26,620
‫現在､ 基地の池の水槽はこの機能を実装していません｡

98
00:08:26,620 --> 00:08:27,700
‫削除したところです｡

99
00:08:27,700 --> 00:08:31,930
‫しかし､ ベースとなる親クラスは -- そのバージョンを呼び出すことになる｡

100
00:08:31,930 --> 00:08:38,410
‫そして､ このように仮想関数をオーバーライドするときは､ 必ずスーパーバージョンを呼び出すことが良いアイデアです｡

101
00:08:38,410 --> 00:08:43,090
‫そのため､ 親バージョンで実装された機能を逃すことはありません｡

102
00:08:43,090 --> 00:08:44,440
‫では､ なぜこのようなことをするのでしょうか｡

103
00:08:44,470 --> 00:08:47,150
‫セットアッププレーヤー入力コンポーネントは何に適していますか？

104
00:08:47,170 --> 00:08:51,730
‫まあ､ アクセスマッピングに関数をバインドするのに向いているのは､ その1つでしょう｡

105
00:08:51,730 --> 00:08:56,140
‫移動関数を前進軸のマッピングにバインドしたいと思います｡

106
00:08:56,140 --> 00:08:57,250
‫そして､ それをここで実現するのです｡

107
00:08:57,250 --> 00:09:01,180
‫そのためには､ この入力パラメータであるプレーヤー入力コンポーネントを使用します｡

108
00:09:01,180 --> 00:09:04,360
‫このオブジェクトは､ そのために設計されています｡

109
00:09:04,390 --> 00:09:14,110
‫プレイヤー入力コンポーネントを取得し､ このポインタに矢印演算子を使ってbind axisという関数にアクセスします｡

110
00:09:14,590 --> 00:09:17,890
‫ここで､ Bind Axisはいくつかの入力パラメータを取ります｡

111
00:09:17,890 --> 00:09:22,450
‫1つ目は文字列リテラルで､ これはテキストマクロを使うことを意味します｡

112
00:09:22,600 --> 00:09:24,430
‫さて､ 引用符の中には何を入れるのでしょうか？

113
00:09:24,520 --> 00:09:27,160
‫軸のマッピングの名前を入れています｡

114
00:09:27,160 --> 00:09:31,690
‫この軸のマッピングをムーブフォワードと呼ぶことをエディターで確認しました｡

115
00:09:32,020 --> 00:09:36,970
‫そこで､ 2番目の入力パラメータにバインドする軸のマッピングを選択します｡

116
00:09:36,970 --> 00:09:43,690
‫これはオブジェクトへのポインタになります｡ この関数をバインドすると､

117
00:09:43,690 --> 00:09:53,280
‫特定のクラスのインスタンスへのポインタになります｡

118
00:09:53,290 --> 00:09:58,120
‫さて､ 3番目のパラメータは､ バインドする関数のアドレスです｡

119
00:09:58,120 --> 00:10:01,720
‫そこで､ 戦車の移動があります｡

120
00:10:01,750 --> 00:10:03,550
‫非常に重要なことで､ 私たちは完全にする必要があります｡

121
00:10:03,660 --> 00:10:06,900
‫関数名をクラス名で修飾する｡

122
00:10:06,900 --> 00:10:13,200
‫そして､ この関数名の前にある､ 演算子のアドレスが必要です｡

123
00:10:13,230 --> 00:10:19,220
‫さて､ このようなことをするのに慣れていなければ､ これは単に関数のアドレスを取っているだけです｡

124
00:10:19,230 --> 00:10:23,040
‫関数も変数と同じようにアドレスを持つことができます｡

125
00:10:23,040 --> 00:10:28,320
‫つまり､ 演算子のアドレスを使うことは､ 関数を他の関数に渡すための方法なのです｡

126
00:10:28,320 --> 00:10:31,380
‫だから､ そのオペレーターのアドレスが必要なんです｡

127
00:10:31,380 --> 00:10:34,050
‫つまり､ アクセスを束縛するための関数呼び出しができたわけです｡

128
00:10:34,200 --> 00:10:41,700
‫ここで､ IntelliSenseのエラー､ incomplete class type you input component is not allowedに気がついたことでしょう｡

129
00:10:41,850 --> 00:10:43,710
‫何が原因なのかがわかった｡

130
00:10:43,710 --> 00:10:46,950
‫ひとつには､ ヘッダーファイルをインクルードする必要があることを意味しているのかもしれない｡

131
00:10:47,220 --> 00:10:50,430
‫もう一つの可能性は､ 誤操作であることです｡

132
00:10:50,430 --> 00:10:55,110
‫コンパイルすれば簡単にわかるので､ コンパイルを試みてみましょう｡

133
00:10:55,440 --> 00:10:57,600
‫コンパイルに成功したことを確認します｡

134
00:10:57,600 --> 00:10:59,640
‫だから､ これは誤ったエラーであることがわかる｡

135
00:10:59,640 --> 00:11:04,290
‫しかし､ もう一度言いますが､ 必要であれば､ それを取り除くためだけにincludeを追加することができます｡

136
00:11:04,290 --> 00:11:05,790
‫だから､ 悩むことはないんです｡

137
00:11:05,820 --> 00:11:10,890
‫これで､ 文句を言っているクラスタイプは入力コンポーネントであることがわかりました｡

138
00:11:11,280 --> 00:11:16,290
‫これがドキュメントにある入力コンポーネントで､ これがインクルードです｡

139
00:11:16,290 --> 00:11:23,100
‫そして､ これをタンクCPファイルの先頭に追加すれば､ あの厄介なfalseエラーを取り除くことができるのです｡

140
00:11:23,100 --> 00:11:29,280
‫また､ pragya wants include ガードがあるため､ 入力コンポーネントが複数回含まれることはありませんし､

141
00:11:29,280 --> 00:11:34,080
‫スクイグルもありません｡

142
00:11:34,350 --> 00:11:44,280
‫これで､ この移動関数が毎フレーム呼び出され､ Wとaskのどちらを押しているかに応じて特定のfloat値を持つことがわかりました｡

143
00:11:44,670 --> 00:11:50,490
‫さて､ ムーブ機能が前進する縛りがあることを知るだけでは､ ちょっと物足りない｡

144
00:11:50,490 --> 00:11:54,750
‫開発者としては､ 物事がうまくいっていることを確認できるのは嬉しいことです｡

145
00:11:54,750 --> 00:12:04,950
‫そこで､ 課題としてやっていただきたいのは､ MOV関数でYUI logを使って､ valueというfloatをmoveに渡している値を表示させることです｡

146
00:12:04,980 --> 00:12:13,110
‫そこで､ uiy logのpercent fを使ってfloatの値を出力ログに記録し､ ゲームをプレイテストしてこれらのキーを押して､

147
00:12:13,110 --> 00:12:17,020
‫ログに何が出力されるかを確認します｡

148
00:12:17,040 --> 00:12:20,370
‫動画を一時停止して､ 今すぐ移動機能に追加してください｡

149
00:12:23,280 --> 00:12:23,590
‫なるほど｡

150
00:12:23,610 --> 00:12:27,960
‫そこで､ mov関数の中で､ uiiログを追加することにします｡

151
00:12:30,200 --> 00:12:33,680
‫そして､ これはログのテンプレ警告になることがあります｡

152
00:12:33,770 --> 00:12:35,960
‫そして､ テキストマクロにも｡

153
00:12:36,230 --> 00:12:42,440
‫単純にバリューパーセントFとバリューをつけるだけなんですけどね｡

154
00:12:42,710 --> 00:12:43,520
‫今は大丈夫です｡

155
00:12:43,520 --> 00:12:48,500
‫もし､ 別の冗長性や警告の種類を使用した場合､ それらの方法を知っていれば｡

156
00:12:48,950 --> 00:12:49,960
‫それは全然構わないんです｡

157
00:12:49,970 --> 00:12:58,100
‫ここでは警告を出すだけで､ パーセントSEなどを使って､ 文字列値でログを整形していますね｡

158
00:12:58,130 --> 00:13:04,300
‫パーセンテージFは､ ご存じない方もいらっしゃると思いますが､ UIログをfloat値でフォーマットする方法です｡

159
00:13:04,310 --> 00:13:16,190
‫では､ これをコンパイルして､ エディタに戻って､ 出力ログを開いて､ 再生ボタンを押して､ 出力ログに無数のメッセージでスパムをかけているところを確認してみましょう｡

160
00:13:16,190 --> 00:13:19,000
‫では､ ビューポートでクリックして､ Wキーを押してみます｡

161
00:13:19,010 --> 00:13:22,030
‫私がリリースする1つの価値観があるんです｡

162
00:13:22,040 --> 00:13:23,180
‫ゼロに戻りました｡

163
00:13:23,210 --> 00:13:26,570
‫キーを押したらマイナス1だ｡

164
00:13:26,570 --> 00:13:30,500
‫そして､ 両方を同時に押すと､ ゼロになるのです｡

165
00:13:30,500 --> 00:13:33,620
‫というわけで､ 予想通りの展開になりました｡

166
00:13:33,800 --> 00:13:34,650
‫完璧です｡

167
00:13:34,670 --> 00:13:35,390
‫わかりました｡

168
00:13:35,390 --> 00:13:39,320
‫このビデオでは､ ユーザー入力を処理するための池を設定しました｡

169
00:13:39,560 --> 00:13:46,180
‫アクセスマッピングについて説明し､ 移動関数を前進アクセスマッピングに結びつけました｡

170
00:13:46,190 --> 00:13:53,300
‫その後､ MOVE関数でYUIログを使ってそのアクセス値を出力しましたが､ 実際には出力ログにいくつかの値を出力するだけでなく､

171
00:13:53,300 --> 00:13:57,130
‫タンクを移動させたいと考えています｡

172
00:13:57,140 --> 00:14:02,720
‫そこで､ これからの講義では､ 実際にタンクを動かし始めることができるようにセットアップしていきます｡

173
00:14:03,290 --> 00:14:04,310
‫また､ お会いしましょう｡

