﻿1
00:00:04,280 --> 00:00:05,540
‫こんにちは､ ようこそ｡

2
00:00:05,540 --> 00:00:09,140
‫この講義では､ 私たちの目が世界中を追いかけているのです｡

3
00:00:09,140 --> 00:00:11,570
‫私の姿が見えなくなったら､ 行って調査します｡

4
00:00:11,570 --> 00:00:13,730
‫だから､ かなり負けず嫌いなんです｡

5
00:00:13,730 --> 00:00:20,120
‫でも､ あまりにコーナーが離れてしまうと､ 彼はついていけなくなって､ そのうち興味を失って､

6
00:00:20,120 --> 00:00:25,160
‫あそこのスタート地点に戻ってしまいそうなんです｡

7
00:00:25,370 --> 00:00:31,010
‫この講義では､ ビヘイビアツリーのタスクを終了させることで､ それを実装することになります｡

8
00:00:31,010 --> 00:00:32,930
‫さっそく潜入してみましょう｡

9
00:00:33,550 --> 00:00:38,380
‫そこで､ タスクを実行させ､ 実際に何かをさせたいのです｡

10
00:00:38,380 --> 00:00:42,400
‫そして特に､ その黒板の価値をクリアにすること､ 書いてあることを実行することができるようになりたいのです｡

11
00:00:42,820 --> 00:00:44,830
‫では､ どうすればいいのか｡

12
00:00:44,860 --> 00:00:49,210
‫そのためには､ ベースクラスまで行って､ そこで何が実装されているかを確認する必要があります｡

13
00:00:49,210 --> 00:00:57,880
‫実は､ 1つ上の階層に行く必要があるのですが､ それは､ タスク黒板の基盤の継承を見ればわかるとおりです｡

14
00:00:57,880 --> 00:01:00,540
‫その上にBTタスクのノードがある｡

15
00:01:00,550 --> 00:01:05,320
‫そこで､ F 12を使って､ そこの実装に移動してみましょう｡

16
00:01:05,320 --> 00:01:13,720
‫BTタスクノードのヘッダーファイルの一番上までスクロールすると､ このクラスに関する情報があるのがわかると思います｡

17
00:01:13,720 --> 00:01:19,960
‫そして､ 最も重要なことは､ これらが最も実装したくなるような仮想関数であるということです｡

18
00:01:20,260 --> 00:01:22,510
‫そこで､ まず最初に実行タスクです｡

19
00:01:22,510 --> 00:01:30,760
‫これはタスクが実行を開始したときに呼び出されます｡ 次にボードタスクがありますが､ これは､ 例えばある条件が偽になったために実行を停止する必要があると判断したときに､

20
00:01:30,760 --> 00:01:37,060
‫そのシグナルを設定します｡

21
00:01:37,060 --> 00:01:38,710
‫そこで､ このタスクを中止する｡

22
00:01:39,040 --> 00:01:43,720
‫Tickタスクは､ タスクが実行されている間は常に発生しますが､ 最初のTickは発生しません｡

23
00:01:43,720 --> 00:01:46,660
‫そのため､ 最初のティックでそれ以降の実行タスクが呼び出されます｡

24
00:01:46,660 --> 00:01:49,540
‫毎回､ ティックタスクを呼び続けます｡

25
00:01:50,140 --> 00:01:57,400
‫また､ これは1ティックよりも長く動作する可能性のある動作の場合です｡ 例えば､ 敵に移動するのに何度もティックが必要になる場合があります｡

26
00:01:57,400 --> 00:01:59,710
‫つまり､ ティックタスクによって､ 私たちは何かをすることができるのです｡

27
00:01:59,710 --> 00:02:05,860
‫すべてのtickとonメッセージは､ このタスクにメッセージを送る可能性のあるアボート以外の他のことのためにあります｡

28
00:02:05,860 --> 00:02:09,250
‫この機能については､ 特に気にする必要はないでしょう｡

29
00:02:09,250 --> 00:02:15,370
‫私たちのタスクは実行されるとすぐに黒板の値をクリアして､

30
00:02:15,370 --> 00:02:21,370
‫すぐに終了するものです｡

31
00:02:21,370 --> 00:02:24,100
‫複数のティックにまたがって何かをする必要はないのです｡

32
00:02:24,100 --> 00:02:30,190
‫このヘッダーファイルでexecuteタスクを検索すると､ フルシグネチャがここにあり､

33
00:02:30,190 --> 00:02:37,420
‫戻り値のタイプがこのブートノードの結果であることがわかります｡

34
00:02:38,080 --> 00:02:43,660
‫そして､ オーナーコンポーネントとノードメモリの2つを取り込みます｡

35
00:02:43,720 --> 00:02:48,880
‫タスククラスやタスククラスのインスタンスは､

36
00:02:48,880 --> 00:02:58,930
‫すべての黒板に対して1つしかありません｡

37
00:02:58,930 --> 00:03:04,960
‫つまり､ ある特定のビヘイビアツリーのノードに関連する情報を保存したい場合､

38
00:03:04,960 --> 00:03:13,660
‫このメモリポインタに保存する必要があるのです｡

39
00:03:13,660 --> 00:03:16,210
‫でも､ それに関連することは一切しないつもりです｡

40
00:03:16,210 --> 00:03:18,670
‫それが必要なのは､ ちょっと高度なことなんです｡

41
00:03:18,670 --> 00:03:23,860
‫また､ これを回避する方法は他にもあります｡ たとえば､ Unreal がビヘイビアツリーごとに複数のインスタンスを作成できるようにすれば､

42
00:03:23,860 --> 00:03:30,430
‫少しはすっきりするかもしれませんが､ これは少し効率的な方法なので､ 気にする必要はないでしょう｡

43
00:03:30,430 --> 00:03:35,620
‫結局のところ､ 私たちが興味があるのは､ 自分たちのaコンポーネントであるビヘイビアツリーコンポーネントにたどり着き､

44
00:03:35,620 --> 00:03:43,270
‫そこからポーンなど他のものにたどり着けることなのです｡ しかし､ それもまた別の講義のテーマとなるのです｡

45
00:03:43,270 --> 00:03:48,910
‫ですから､ 今面白いのは､ 実行タスクを実装することなのです｡

46
00:03:48,910 --> 00:03:55,450
‫この署名をコピーして､ 黒板のクリア値Hに移動し､ この公開ノートとして見てみましょう｡ これはデフォルトのセクションにあるので､

47
00:03:55,450 --> 00:04:00,040
‫保護されることになると思います｡

48
00:04:00,040 --> 00:04:04,930
‫そこで､ 自分自身で保護されたセクションを作成し､ そこに貼り付けます｡

49
00:04:04,930 --> 00:04:08,500
‫そして､ 念のため､ オーバーライドを作成します｡

50
00:04:08,500 --> 00:04:14,500
‫そして､ C++で実装を作成します｡ オーバーライドするときは常にsuperを呼び出すことを忘れないでください｡

51
00:04:14,500 --> 00:04:24,460
‫superはオーナーコンポーネントでタスクを実行し､ ノードメモリは親に呼び出されます｡

52
00:04:24,460 --> 00:04:30,790
‫そして､ 黒板を手に取り､ キーをクリアできるようにしたい｡

53
00:04:30,790 --> 00:04:32,230
‫そして､ ここで重要なことが2つあります｡

54
00:04:32,230 --> 00:04:35,140
‫まず､ どのようなKeyが選ばれたかを知るにはどうしたらよいのでしょうか｡

55
00:04:35,140 --> 00:04:42,340
‫Blackboard Base Hにアクセスすると､ メソッドの1つにget selected Blackboard Keyがあるのがわかります｡

56
00:04:42,340 --> 00:04:48,220
‫C++でこれを呼び出し､ 選択されたBlackboard Keyを取得すれば､ 簡単に返せるわけです｡

57
00:04:48,220 --> 00:04:54,730
‫カーソルを合わせると､ ビヘイビアツリーで選択されていた黒板キーのFネームが返されます｡

58
00:04:54,730 --> 00:05:00,280
‫さて､ もうひとつ必要なことは､ このビヘイビアツリーに関連する黒板を実際に手にすることができるようになることです｡

59
00:05:00,280 --> 00:05:02,380
‫そのために､ 自分たちのア・コンパを用意したわけです｡

60
00:05:02,380 --> 00:05:07,990
‫ここで､ 渡されたオーナーコンプの型は､ 実はポインタではなく､ 参照であることに注目してください｡

61
00:05:07,990 --> 00:05:09,850
‫だから､ まずNULLにはなり得ない｡

62
00:05:09,850 --> 00:05:10,720
‫それは素晴らしいことです｡

63
00:05:10,720 --> 00:05:15,730
‫しかし､ ポインターを使用していないので､ 矢印演算子ではなくドット演算子を使用する必要があり､

64
00:05:15,730 --> 00:05:21,910
‫ここから単純に黒板のコンポーネントを取得することもできます｡

65
00:05:21,910 --> 00:05:26,260
‫これはカーソルを合わせると黒板コンポーネントが表示されるだけですが､ こちらは黒板コンポーネントへのポインタなので､

66
00:05:26,260 --> 00:05:29,470
‫矢印演算子を使う必要があります｡

67
00:05:29,470 --> 00:05:32,680
‫だから､ 黒板のキーをクリアする方法はすでに知っている｡

68
00:05:32,880 --> 00:05:34,590
‫相手､ それが課題になりそうですね｡

69
00:05:34,590 --> 00:05:36,690
‫だから､ あまり複雑な課題でないことを祈ります｡

70
00:05:36,690 --> 00:05:38,620
‫選択したキーを消去したい｡

71
00:05:38,800 --> 00:05:41,730
‫私たちが過去に行ったことのある場所を確認することができます｡

72
00:05:42,240 --> 00:05:44,910
‫これを行うには､ 何かインクルードが必要ですか？

73
00:05:44,910 --> 00:05:53,550
‫黒板には､ クリアしたいキーとして､ ビヘイビアツリーで選択したキーを使用することを含める必要があるのかもしれません｡

74
00:05:53,550 --> 00:05:55,530
‫では､ ビデオを一時停止して､ やってみてください｡

75
00:05:55,560 --> 00:05:56,670
‫では､ お帰りなさい｡

76
00:05:56,670 --> 00:05:58,740
‫では､ これに挑戦してみよう｡

77
00:05:58,740 --> 00:06:01,560
‫まず最初に､ 黒板のコンポーネントを用意しました｡

78
00:06:01,560 --> 00:06:03,060
‫ここでエラー演算子を使ってみましょう｡

79
00:06:03,360 --> 00:06:04,560
‫何も出てきません｡

80
00:06:04,560 --> 00:06:15,960
‫つまり､ ビヘイビアツリーと黒板コンポーネントを作成するために､ ここにハッシュインクルードが必要なのです｡

81
00:06:15,960 --> 00:06:21,300
‫うまくいけば､ オートコンプリートが機能して､ クリアができるようになるはずです｡

82
00:06:21,300 --> 00:06:23,580
‫ちょっと記憶をたどってみよう｡

83
00:06:23,580 --> 00:06:25,230
‫以前はどこでやっていたんだろう？

84
00:06:25,230 --> 00:06:31,500
‫Shooter I､ Controller CPに移動して､ ここにあるものを見てみると､ 明確な価値があることがわかります｡

85
00:06:31,500 --> 00:06:32,790
‫それが､ 私たちが探しているものです｡

86
00:06:32,790 --> 00:06:35,430
‫では､ そのクリアバリューを試してみましょう｡

87
00:06:35,430 --> 00:06:36,600
‫そして､ 何を取り込んでいるのか？

88
00:06:36,600 --> 00:06:41,370
‫FキーかFネームのどちらかを取り込み､ 素晴らしいFネームを得ることができます｡

89
00:06:41,370 --> 00:06:48,030
‫そして､ 親クラスにあるため､ このクラスにある黒板の選択取得キーで取得できると言ったのはどこでしょう｡

90
00:06:48,030 --> 00:06:51,300
‫Blackboard Keyを選択すれば､ あとは簡単です｡

91
00:06:51,300 --> 00:06:53,910
‫選択されたBlackboard Keyの値をクリアしています｡

92
00:06:53,910 --> 00:06:55,590
‫さて､ 最後にもう1つ必要なことがあります｡

93
00:06:55,590 --> 00:06:57,060
‫これはあなたの課題ではないので､ 心配しないでください｡

94
00:06:57,060 --> 00:07:04,680
‫これは､ 黒板クリアの実行タスクに戻り値があるため､ 戻る必要があることを意味しています｡

95
00:07:04,680 --> 00:07:06,810
‫そして､ その返り値がなかなか面白いのです｡

96
00:07:06,810 --> 00:07:07,410
‫見てみよう｡

97
00:07:07,410 --> 00:07:12,600
‫この後､ F12を実行し､ 実行テストからどのような異なるステータスが返されるかを見てみましょう｡

98
00:07:12,600 --> 00:07:14,400
‫これで最初の1枚は成功です｡

99
00:07:14,400 --> 00:07:14,760
‫素晴らしい｡

100
00:07:14,760 --> 00:07:20,910
‫これは基本的に､ このノードの実行が終了し､ 次のノードに移行できることを動作ツリーに通知するものです｡

101
00:07:20,910 --> 00:07:21,930
‫また失敗した｡

102
00:07:21,930 --> 00:07:27,450
‫これは完成しているから次に進めるのですが､ 今回は失敗したと言っています｡

103
00:07:27,450 --> 00:07:36,750
‫そのため､ 例えばシーケンスノードや選択ノードに対して､ それらのノードが実際に何をすべきなのか､ さまざまな指示を与えることができるのです｡

104
00:07:37,260 --> 00:07:44,850
‫これは基本的に失敗と同じで､ 進行中なのです｡

105
00:07:44,850 --> 00:07:51,420
‫実行タスクから進行中に戻った場合､ 基本的には､ 私がそうしないと言うまで､ 私が終了したと言うまで､

106
00:07:51,420 --> 00:07:57,120
‫tickを呼び続けなければならないと言うことになります｡

107
00:07:57,120 --> 00:08:03,660
‫しかし､ 長時間稼働するタスクを作る必要がある場合､ 複数のティックに出くわすことを念頭に置いておくとよいでしょう｡

108
00:08:03,660 --> 00:08:06,060
‫それなら､ 途中で戻るしかない｡

109
00:08:06,060 --> 00:08:08,220
‫しかし､ 先ほども言ったように､ 私たちは成功を望んでいるのです｡

110
00:08:08,400 --> 00:08:10,260
‫では､ その中に入ってやってみましょう｡

111
00:08:10,260 --> 00:08:14,490
‫EB ビートノードの結果をコロン､ コロンと返す｡

112
00:08:14,490 --> 00:08:20,550
‫そして､ 基本的に何があってもその価値をクリアすることに成功したからこそ､ 成功するのだと思います｡

113
00:08:20,760 --> 00:08:25,470
‫では､ この内容をすべて保存して､ エディターでコンパイルを実行します｡

114
00:08:25,470 --> 00:08:31,710
‫そして､ それが完了したら､ AIとビヘイビアツリーを開いてみましょう｡

115
00:08:31,740 --> 00:08:33,020
‫では､ その1拍子はどこにあるのか？

116
00:08:33,030 --> 00:08:35,490
‫そして､ それをメインウインドウにドッキングさせて見てみましょう｡

117
00:08:35,490 --> 00:08:40,800
‫黒板の値をクリアして､ 最後に確認した場所に移動できるようになりました｡

118
00:08:40,800 --> 00:08:47,250
‫黒板の値をクリアして､ 5秒待つと､ この最後に確認したプレイヤーの場所の調査が解除されて､

119
00:08:47,250 --> 00:08:52,200
‫開始地点に移動することが確認できるはずです｡

120
00:08:52,200 --> 00:08:56,790
‫では､ タスクが完全に実装された今､ この動作が機能しているかどうか見てみましょう｡

121
00:08:56,800 --> 00:09:00,450
‫それで､ 彼は私のところにやってきて､ 私を調査しているんです｡

122
00:09:00,480 --> 00:09:01,800
‫隠れてきます｡

123
00:09:01,800 --> 00:09:03,000
‫だから､ 隠れに行こう｡

124
00:09:03,150 --> 00:09:04,200
‫調査に来ている｡

125
00:09:04,200 --> 00:09:05,550
‫もう一度､ 隠れに行こう｡

126
00:09:05,760 --> 00:09:07,290
‫だから､ 行って隠れてください｡

127
00:09:07,830 --> 00:09:10,080
‫あそこで彼を見つけられるかどうか､ 見てみよう｡

128
00:09:10,080 --> 00:09:18,420
‫彼は今待っているはずなのに､ スタート地点に戻ってしまうので､ 残念ながら私と交差してしまうのです｡

129
00:09:18,420 --> 00:09:25,350
‫では､ 実際に期待通りに動いているかどうか､ 敵のウィンドウを出して右にドッキングさせ､

130
00:09:25,350 --> 00:09:29,820
‫メインウィンドウを左側に置いてみてください｡

131
00:09:29,820 --> 00:09:34,890
‫ちょっと窮屈だけど､ 何とかなるだろう｡ それから､ もう一回こいつから逃げてみて､

132
00:09:34,890 --> 00:09:37,800
‫彼の行動がどうなるか見てみよう｡

133
00:09:37,800 --> 00:09:41,910
‫最後に確認されたプレイヤーの場所に移動しているのがわかると思います｡

134
00:09:42,510 --> 00:09:45,990
‫そして今､ 彼はその価値をクリアして待っている｡

135
00:09:45,990 --> 00:09:54,030
‫そして､ 彼が移動していくのがわかります｡ デコレーターの赤いバーは､ この2つの条件がどちらも成立していないことを告げています｡

136
00:09:54,030 --> 00:09:55,950
‫だから､ 彼はそのどちらもできない｡

137
00:09:55,950 --> 00:09:57,840
‫ようやくスタート地点に移動した｡

138
00:09:57,840 --> 00:10:01,170
‫だから今は､ 基本的に何もできないからチカチカしている｡

139
00:10:01,320 --> 00:10:09,810
‫この講義では､ 基本的に､ タスクを取得してコードを実行する方法､ タスクの実行から返されるさまざまなステータスを理解する方法､

140
00:10:09,810 --> 00:10:19,890
‫タスクから黒板を取得する方法､ そして黒板タスクで現在選択されているキーを取得する方法について見てきました｡

141
00:10:19,890 --> 00:10:26,310
‫次回の講義では､ 黒板のビヘイビアツリーの外の世界をどのように手に入れるか､ ビヘイビアツリーのタスクの中からポーンをどのように手に入れるか､

142
00:10:26,310 --> 00:10:30,450
‫について見ていきます｡

143
00:10:30,450 --> 00:10:31,080
‫現地でお会いしましょう｡

