﻿1
00:00:04,470 --> 00:00:05,160
‫こんにちは､ ようこそ｡

2
00:00:05,160 --> 00:00:11,220
‫この講義では､ マウスボタンやトリガーを押したときにログメッセージを取得するように､

3
00:00:11,220 --> 00:00:14,550
‫銃を設計するつもりです｡

4
00:00:14,550 --> 00:00:20,370
‫そして､ このログメッセージは､ この銃のアーキテクチャの背後で他の多くのものを動かすための最初のステップなのです｡

5
00:00:20,370 --> 00:00:22,320
‫さっそく潜入してみましょう｡

6
00:00:23,060 --> 00:00:28,300
‫だから､ この銃は最終的には撃てるようにしたい､ それが核心です｡

7
00:00:28,310 --> 00:00:33,000
‫なぜ､ 銃を核とした撮影アーキテクチャを選択するのか？

8
00:00:33,020 --> 00:00:39,540
‫まあ､ 先ほども少し触れましたが､ さまざまな撮影方法に対応できるようにしたいのです｡

9
00:00:39,540 --> 00:00:42,480
‫さて､ 一般的にどのような撮影方法があるのでしょうか｡

10
00:00:42,500 --> 00:00:49,700
‫直接射撃があり､ 多くの場合､ レイトレーシングと直接視線を用いて被弾の有無を確認する｡

11
00:00:49,700 --> 00:00:52,630
‫だから､ 「よし､ あの敵が見えるぞ」となるわけです｡

12
00:00:52,640 --> 00:00:55,610
‫それは､ 銃から敵までの視線が明瞭であることです｡

13
00:00:55,610 --> 00:00:57,980
‫当たるから､ ダメージを与えるしかない｡

14
00:00:57,980 --> 00:01:01,400
‫そうでないと､ 失敗して敵に当たらなかった場合､ ダメージが与えられないんです｡

15
00:01:01,400 --> 00:01:02,750
‫それは､ とても簡単な方法のひとつです｡

16
00:01:02,750 --> 00:01:05,640
‫弾丸の物理を再現しているわけではありませんが､ その必要はないでしょう｡

17
00:01:05,660 --> 00:01:11,030
‫ですから､ パフォーマンス上の理由から､ 今はロケットランチャーなどでは､ 非常に遅い弾になることが多いんです｡

18
00:01:11,030 --> 00:01:16,640
‫その弾丸が空中を移動する効果を見たいのですが､ 時間の遅れが重要になる場合があります｡

19
00:01:16,640 --> 00:01:21,830
‫その場合､ その弾丸を発射して5秒後に命中するかどうかを確認したり､ 弾丸の落下やライフル､

20
00:01:21,830 --> 00:01:29,000
‫スナイパーライフルを長距離で使用するなど､ 別のルートで行うかもしれません｡

21
00:01:29,000 --> 00:01:32,990
‫だから､ 我々の銃の実装次第で､ すべてが変わる可能性があるのです｡

22
00:01:32,990 --> 00:01:36,220
‫さて､ このセクションの間に1つの銃を実装することになります｡

23
00:01:36,230 --> 00:01:38,840
‫ライフル､ 直射式の銃になるんです｡

24
00:01:38,840 --> 00:01:46,550
‫しかし､ そのアーキテクチャを拡張できるようにするために､ 銃を撃つことに責任を持たせようと思っています｡

25
00:01:46,550 --> 00:01:52,010
‫ということは､ 銃に射撃アーキテクチャを導入して行くしかないですね｡

26
00:01:52,010 --> 00:01:52,760
‫だから､ 銃があるんです｡

27
00:01:53,090 --> 00:02:00,710
‫H この関数にパブリック関数を作成して､ シューターキャラクターから､ あるいは入力をバインドしている場所から､

28
00:02:00,710 --> 00:02:05,270
‫本質的に銃の引き金を引くことができるようにしたいのです｡

29
00:02:05,270 --> 00:02:12,590
‫例えば敵の場合､ 目からその引き金を引くことになります｡

30
00:02:12,890 --> 00:02:15,590
‫では､ さっそく空洞を作ってみましょう｡

31
00:02:15,590 --> 00:02:21,020
‫リターン型のプルトリガーメソッドを持つ必要はなく､ 何も取る必要はない｡

32
00:02:21,020 --> 00:02:24,710
‫あとは､ このフレームで引き金を引きたい､ ということだけです｡

33
00:02:24,710 --> 00:02:33,950
‫これで十分なので､ 次にコントロールシフトPで実装を作成し､ 実装を作成することにします｡

34
00:02:34,610 --> 00:02:40,160
‫そして､ この中に､ YUIのログを入れて､ 警告を目立たせて､ メッセージをYou've

35
00:02:40,190 --> 00:02:48,560
‫been shot like thatと変更するだけで､ 素晴らしいです｡

36
00:02:48,560 --> 00:02:53,120
‫だから､ それをキャラクターでDHCPと呼ぶことにしました｡

37
00:02:54,080 --> 00:02:56,080
‫だから､ これはあなたへの挑戦状となるでしょう｡

38
00:02:56,090 --> 00:02:57,470
‫さらに入力の縛りです｡

39
00:02:57,470 --> 00:02:58,790
‫ここでは､ インプットバインディングをたくさん行いました｡

40
00:02:58,790 --> 00:03:01,860
‫インプットバインディングの例はたくさんありますね｡

41
00:03:01,880 --> 00:03:02,990
‫どうぞ､ こうしてください｡

42
00:03:02,990 --> 00:03:09,290
‫撮影アクションをフックするには､ プロジェクト設定で撮影用のアクションを新規に作成する必要があります｡

43
00:03:09,290 --> 00:03:17,120
‫これをキーや右トリガーなど､ 好きなものにバインドして､ キャラクターセットアップのプレイヤー入力コンポーネントメソッドにバインドして､

44
00:03:17,150 --> 00:03:20,360
‫これを実行します｡

45
00:03:20,360 --> 00:03:30,320
‫そして､ キャラクターをバインドした後､ キャラクター上に作成した関数内からプルトリガーを呼び出すことができるはずです｡

46
00:03:30,320 --> 00:03:38,360
‫その銃に直接バインドしようとするのではなく､ バインドを設定するために文字に関数を入れることを忘れないでください｡

47
00:03:38,360 --> 00:03:40,250
‫銃に直接バインドしてもうまくいきません｡

48
00:03:40,250 --> 00:03:42,920
‫そこにちょっとした機能の仲介を入れる必要があるのです｡

49
00:03:43,370 --> 00:03:48,890
‫そこで､ ビデオを一時停止して､ 仲介機能の作成という課題の最後の部分で苦労している方に､

50
00:03:48,890 --> 00:03:53,180
‫ちょっとしたヒントやきっかけを提供します｡

51
00:03:53,990 --> 00:03:56,840
‫では､ ここでヒントを出します｡ ヒントはいらないという方は､ 今すぐポーズをとってください｡

52
00:03:56,840 --> 00:04:03,830
‫しかし､ ヒントはこんな感じです｡ voidという新しいプライベート関数を持って､

53
00:04:03,830 --> 00:04:09,110
‫それをC++で実装するのです｡

54
00:04:09,110 --> 00:04:14,630
‫そして､ この中で銃独自のメソッドに呼び出すことになるのです｡

55
00:04:14,630 --> 00:04:18,620
‫だから､ 銃の引き金を引く､ 銃をやるんです｡

56
00:04:19,340 --> 00:04:24,950
‫そして､ シュートの中からコールトリガーで引き金を引くのです｡

57
00:04:24,950 --> 00:04:26,420
‫そして､ これこそがバインドすることなのです｡

58
00:04:27,350 --> 00:04:34,960
‫では､ もう一度ビデオを一時停止して､ アクションを設定しましょう｡

59
00:04:34,970 --> 00:04:35,260
‫なるほど｡

60
00:04:35,270 --> 00:04:38,000
‫それでは､ プロジェクトの設定に進みます｡

61
00:04:38,000 --> 00:04:47,570
‫設定､ プロジェクト設定､ そしてこれをドッキングして入力に移動し､ 新しいアクションを追加して､ それをshootと呼ぶことにします｡

62
00:04:48,300 --> 00:05:00,870
‫そして､ これをマウスの左ボタンと右トリガーにバインドします｡ 右トリガーの軸ではありません｡

63
00:05:01,140 --> 00:05:02,310
‫右側です｡

64
00:05:02,940 --> 00:05:03,990
‫トリガーだけでいい｡

65
00:05:04,200 --> 00:05:06,390
‫そう思って選んだのに､ そうじゃなかった｡

66
00:05:06,580 --> 00:05:14,630
‫さて､ コントローラとマウスの両方にバインドして､ 次にシューターキャラクターの軸をバインドします｡

67
00:05:14,640 --> 00:05:17,760
‫CP では､ このバインド軸をジャンプ用にコピーしてください｡

68
00:05:17,850 --> 00:05:18,780
‫アクションということです｡

69
00:05:18,780 --> 00:05:21,150
‫もちろん､ この2つはいつもごっちゃになるんですけどね｡

70
00:05:21,480 --> 00:05:24,930
‫ここで全員､ 撮影軸への切り替えを呼びかけます｡

71
00:05:24,930 --> 00:05:32,790
‫pressedは欲しいもので､ jumpにバインドするのではなく､ 代わりにcharacter shootにバインドすることにします｡

72
00:05:33,580 --> 00:05:36,340
‫そうして､ ビルドを進めましょう｡

73
00:05:37,120 --> 00:05:38,940
‫それが成功したようです｡

74
00:05:38,950 --> 00:05:42,580
‫それをダウンで閉じてみて､ 効果があるかどうか見てみましょう｡

75
00:05:42,580 --> 00:05:48,520
‫それでは､ ゲームを終了してもう一度再生ボタンを押し､ 出力されたログを見てみましょう｡

76
00:05:48,520 --> 00:05:50,590
‫決定的なのは､ 再生です｡

77
00:05:50,590 --> 00:05:51,250
‫そうですね｡

78
00:05:51,280 --> 00:05:54,580
‫だから､ マウスのボタンを押せば､ 動いている｡

79
00:05:54,580 --> 00:05:58,540
‫右のトリガーを使っても同じことが起こるかどうか見てみましょう｡

80
00:05:58,810 --> 00:05:59,200
‫うん｡

81
00:05:59,200 --> 00:06:01,720
‫右のトリガーも発射のために働いている｡

82
00:06:01,720 --> 00:06:07,930
‫ですから､ ゲーム内で何かが起こっていることをプレイヤーに知らせるのに､ ログメッセージが最適な方法でないことは明らかです｡

83
00:06:07,930 --> 00:06:12,210
‫そこで次回の講義では､ それを実現するためのパーティクルエフェクトの追加について見ていきたいと思います｡

84
00:06:12,220 --> 00:06:13,210
‫現地でお会いしましょう｡

