﻿1
00:00:04,260 --> 00:00:05,190
‫こんにちは､ ようこそ｡

2
00:00:05,190 --> 00:00:10,170
‫このレクチャーでは､ 敵からプレイヤーへの視線を取得することで､ プレイヤーとして障害物の後ろに隠れ､

3
00:00:10,170 --> 00:00:17,100
‫その敵のフォロワーがそれを持たないようにすることを目指します｡

4
00:00:17,100 --> 00:00:22,560
‫私たちが飛び出してきて見えるようになるまで､ 私たちを狙い続けてください｡

5
00:00:22,560 --> 00:00:25,890
‫だから､ この通り､ 私は角の後ろに隠れていて､ 彼には見つかっていないのです｡

6
00:00:25,890 --> 00:00:29,400
‫それでは､ アンリアル・ツールを使ってどのように実現できるのか見てみましょう｡

7
00:00:30,470 --> 00:00:35,120
‫だから､ この敵のAというのは理想的ではないんです｡  I. は､ 現在､ 角を曲がってもついてくることができます｡

8
00:00:35,120 --> 00:00:40,720
‫どんなに外に出ても､ どんなに柱の陰に隠れても､ 見つかってしまうのです｡

9
00:00:40,720 --> 00:00:43,430
‫まだまだ､ 私たちを狙い続けて来ますよ｡

10
00:00:43,430 --> 00:00:48,680
‫それを修正するために､ 敵からプレイヤーへの視線を確認するのです｡

11
00:00:48,680 --> 00:00:57,260
‫さて､ Unreal では多くのものがそうですが､ 視線制御と呼ばれるこのための関数がすでに用意されています｡

12
00:00:57,260 --> 00:01:01,430
‫そして､ それを検索して行くと､ ブーリアンを返す関数があることがわかります｡

13
00:01:01,430 --> 00:01:06,440
‫つまり､ 視線があるかどうかを教えてくれて､ 視線を確認しようとするアクターを選び､

14
00:01:06,440 --> 00:01:14,900
‫そのポーンの目の位置などを自動的に考慮してくれるのです｡

15
00:01:14,900 --> 00:01:20,300
‫このようなものはすべて､ Unrealにすでにコード化されているので､ かなり簡単なはずです｡

16
00:01:20,300 --> 00:01:28,250
‫AIコントローラーのDHCPに移動して､ 基本的にやりたいことは､ TICを変更して､ まず最初にif

17
00:01:28,250 --> 00:01:32,630
‫line of sightを行うことです｡

18
00:01:33,420 --> 00:01:43,050
‫そして､ 視線が合っていれば､ 移動してフォーカスを合わせたい｡

19
00:01:43,380 --> 00:01:48,960
‫しかし､ 我々はそうでない場合は､ 我々がやりたいことは､ 明確な焦点です｡

20
00:01:48,960 --> 00:01:57,630
‫前にその機能を見たことを思い出して､ 基本的に停止動作を見ましょうということをやりたいのです｡

21
00:01:58,560 --> 00:02:01,470
‫そして､ これもまだ見ぬ機能が存在するのです｡

22
00:02:01,590 --> 00:02:09,000
‫そこで､ 私がここで行うのは､ 自信があれば､ このすべてを自分で実装することに挑戦することです｡

23
00:02:09,120 --> 00:02:14,970
‫他の2つは､ すでにアクターへの移動もセットフォーカスも行っているので､

24
00:02:14,970 --> 00:02:18,480
‫これまでにない複雑さです｡

25
00:02:18,480 --> 00:02:22,500
‫そして､ 先ほど見た､ このif line of sightがあるだけです｡

26
00:02:22,500 --> 00:02:23,460
‫とてもわかりやすいですね｡

27
00:02:23,460 --> 00:02:24,420
‫それを実装すればいいのです｡

28
00:02:24,420 --> 00:02:25,620
‫しかし､ これ以外ではどうでしょう｡

29
00:02:25,620 --> 00:02:29,070
‫ELT条項だけの実装に挑戦してみよう｡

30
00:02:29,070 --> 00:02:35,820
‫しかし､ ELT句を書き出してみましょう｡

31
00:02:36,180 --> 00:02:43,110
‫ですから､ まずフォーカスをクリアすること､ 基本的にはプレーヤーが見えないので､ プレーヤーを追跡するのはやめましょうと言っているのです｡

32
00:02:43,110 --> 00:02:47,610
‫眼球は明らかにプレイヤーの位置情報にアクセスできるので､ プレイヤーの居場所を知っているような印象を与えてはいけない､

33
00:02:47,610 --> 00:02:51,000
‫とかね｡

34
00:02:51,000 --> 00:02:56,160
‫しかし､ AIは見える範囲しか知らないという錯覚を起こさせる必要があります｡

35
00:02:56,370 --> 00:02:59,550
‫そこで､ これから行うのは､ クリアフォーカスを呼び出すことです｡

36
00:02:59,550 --> 00:03:07,410
‫そして､ AIコントローラーHに移動して､ クリアフォーカスを見ると､ クリアすべき優先順位を取り込んでいるのがわかりますね｡

37
00:03:07,410 --> 00:03:13,620
‫さて､ これらの優先順位は､ 基本的に重視するレベルが異なるということを念のためお伝えしておきます｡

38
00:03:13,620 --> 00:03:20,820
‫ですから､ 私たちは典型的にデフォルトの動きとゲームプレイのゲームプレイを最優先事項としています｡

39
00:03:20,820 --> 00:03:24,270
‫そして､ デフォルトで設定されているのはゲームプレイの優先順位です｡

40
00:03:24,270 --> 00:03:29,580
‫つまり､ ゲームプレイの優先順位をクリアすることで､ 例えば､ 動きに基づいてフォーカスを合わせた場合､

41
00:03:29,580 --> 00:03:41,070
‫目がガードポイントに戻りたければ､ そのフォーカスはクリアされず､ ガードポイントに戻ることになるのです｡

42
00:03:41,430 --> 00:03:43,440
‫ピントが合うというのは､ そういうことなんですね｡

43
00:03:43,440 --> 00:03:45,660
‫そこでは､ 優先順位の仕組みがそうなっているのです｡

44
00:03:45,660 --> 00:03:55,440
‫そこで､ このコロンゲームプレイのフォーカス優先度コードをコピーし､ この行でクリアしたい優先度を指定します｡

45
00:03:55,440 --> 00:03:58,020
‫そしてもうひとつは､ 動きを止めることです｡

46
00:03:58,020 --> 00:04:03,150
‫そこで､ 再びAI制御のRHに移動して､ 停止動作を見てみたいと思います｡

47
00:04:03,150 --> 00:04:11,730
‫そして､ 案の定､ stop movementというシンプルな無引数関数があり､ それを使えば､ まさにそれができるのです｡

48
00:04:11,910 --> 00:04:12,780
‫それでは､ どうぞ｡

49
00:04:12,780 --> 00:04:16,020
‫基本的にはそのような文言が書かれています｡

50
00:04:16,020 --> 00:04:25,170
‫ですから､ 今はただ､ ifの部分を視線と移動とフォーカスのセットで実装することが課題として残されているのです｡

51
00:04:25,170 --> 00:04:27,750
‫そして､ 基本的にこのコードはここで削除してください｡

52
00:04:27,750 --> 00:04:33,000
‫それをコメントして､ どこをどうしたいのかを整理していくんです｡

53
00:04:33,000 --> 00:04:33,870
‫だから､ ビデオを一時停止する｡

54
00:04:33,870 --> 00:04:35,130
‫挑戦しない､ ここで滑る｡

55
00:04:35,130 --> 00:04:38,190
‫ただ､ この3行を自分で実行してみてください｡

56
00:04:39,210 --> 00:04:39,690
‫なるほど｡

57
00:04:39,690 --> 00:04:40,270
‫お帰りなさい｡

58
00:04:40,290 --> 00:04:42,150
‫では､ そのことから始めましょう｡

59
00:04:42,150 --> 00:04:54,360
‫もしそうなら､ もしオープンブラケットに視線があって､ それからアクターへの視線を行いたい､ それは私たちがアクセスを得たいプレイヤーのポーンである｡

60
00:04:54,360 --> 00:05:00,900
‫そこで､ このプレイヤーポーンのコメントを解除してみると､ インデントが少し崩れてしまいました｡

61
00:05:00,900 --> 00:05:02,160
‫それを解決しよう｡

62
00:05:02,490 --> 00:05:10,320
‫そして､ ここに括弧をつけ､ アクターに移動させます｡

63
00:05:10,320 --> 00:05:14,460
‫さて､ 実際､ ここでアクターへの移動をコピーしてコメントを解除すればよいのです｡

64
00:05:15,230 --> 00:05:18,380
‫そして､ そのコメントを解除したい｡

65
00:05:18,380 --> 00:05:19,100
‫はい､ どうぞ｡

66
00:05:19,100 --> 00:05:22,490
‫そして､ フォーカスも､ 同様に動かすことができます｡

67
00:05:22,520 --> 00:05:28,070
‫なぜなら､ アクターへの移動はフォーカスを設定しますが､ 優先順位は低く､

68
00:05:28,070 --> 00:05:34,640
‫ゲームプレイのフォーカスではなく､ 移動のフォーカスを設定するからです｡

69
00:05:34,640 --> 00:05:38,900
‫だから､ この2つの操作をどの順番でやってもいいんです｡

70
00:05:38,990 --> 00:05:44,030
‫そして最後に､ begin playでプレイヤーポーンを取得していたこのコメントアウトされた行を削除します｡

71
00:05:44,030 --> 00:05:49,280
‫なぜなら､ この行はもう必要なく､ すべてがtickになっているので､ begin playを削除できます｡

72
00:05:49,280 --> 00:05:54,170
‫後で必要になった時のために､ また追加する手間を省くために残しておこうと思っています｡

73
00:05:54,170 --> 00:05:58,280
‫Unrealに移動してコンパイルし､ それが終わったらプレイしてみましょう｡

74
00:05:58,280 --> 00:06:00,710
‫では､ この俳優から隠れることができるかどうか見てみましょう｡

75
00:06:00,710 --> 00:06:04,370
‫コーナーを適度に速く移動することを心がけます｡

76
00:06:04,760 --> 00:06:09,170
‫これは少し厄介なことで､ 彼らはあなたと同じように速く動くことができますが､ そのようなコーナーを回ると､

77
00:06:09,170 --> 00:06:11,570
‫彼らは「彼は私を見失った」と言うのです｡

78
00:06:11,570 --> 00:06:13,310
‫追いかけようとしなくなった｡

79
00:06:13,310 --> 00:06:16,550
‫移動中に角を曲がって覗くだけで､ それが見えるんです｡

80
00:06:16,550 --> 00:06:20,150
‫フォーカスをクリアしたからといって､ 狙いを変えているわけではありません｡

81
00:06:20,210 --> 00:06:22,370
‫反対側からも覗くことができる

82
00:06:22,640 --> 00:06:23,180
‫見てみよう｡

83
00:06:23,180 --> 00:06:24,560
‫ピックラウンドはこちら

84
00:06:24,590 --> 00:06:25,070
‫これでよしとする｡

85
00:06:25,070 --> 00:06:27,770
‫私がいた最後の場所をまだ狙っているのがわかると思います｡

86
00:06:27,770 --> 00:06:34,220
‫しかし､ 私が視界に飛び込んでくると､ 彼はそのまま狙いを定め､ 受入範囲内に移動してきます｡

87
00:06:34,400 --> 00:06:38,900
‫そういえば､ その受容半径をデザイナーが設定できるようにしてほしいんです｡

88
00:06:38,900 --> 00:06:41,120
‫そこで､ 新しいプロパティに移動してみましょう｡

89
00:06:41,240 --> 00:06:45,350
‫ここでは､ 新しいプロパティでプライベートセクションを作成します｡

90
00:06:46,260 --> 00:06:48,330
‫というのは､ どこでも編集ができそうです｡

91
00:06:48,780 --> 00:06:58,830
‫そして､ 受入半径と呼ばれるフロートを作成し､ デフォルト値として200を与えます｡

92
00:06:59,100 --> 00:07:04,530
‫そして､ この受容半径は､ アクターへの移動に使用することができます｡

93
00:07:04,530 --> 00:07:08,340
‫これをコンパイルすると､ AIコントローラーのブループリントで変更できることを除けば､

94
00:07:08,340 --> 00:07:11,940
‫まったく同じ動作になります｡

95
00:07:11,940 --> 00:07:13,320
‫というわけで､ 今回の講義はここまで｡

96
00:07:13,320 --> 00:07:19,740
‫その視線の機能を発見し､ 目が何かを見ることができるかできないかを確認することができるようになったのです｡

97
00:07:19,740 --> 00:07:26,220
‫そして､ この基本的な隠蔽機能を実装することで､ AIが見えないときに追従しないようにしました｡

98
00:07:26,250 --> 00:07:26,850
‫次の講義

99
00:07:26,850 --> 00:07:33,570
‫このカスタムプログラムされたAIからさらに進化して､ ビヘイビアツリーを使うことになります｡

100
00:07:33,570 --> 00:07:39,000
‫アンリアルの強力なツールで､ 私たちのAIをもっともっとカッコよくしてくれるはずです｡

