﻿1
00:00:04,120 --> 00:00:04,630
‫なるほど｡

2
00:00:04,630 --> 00:00:08,980
‫そこで､ このビデオでは､ ポンズにデスを実装することを目標としています｡

3
00:00:08,980 --> 00:00:17,770
‫だから､ うちのタワーから2､ 3回殴られたら､ タンクが死んだから消えたとわかるはずです｡

4
00:00:17,770 --> 00:00:24,220
‫そして､ 私の技量が十分であれば､ 1つでも破壊に踏み切れば､ それも消えるのがわかるはずです｡

5
00:00:24,220 --> 00:00:29,200
‫そこで､ この動画では､ これらのポーンに死を実装します｡

6
00:00:29,290 --> 00:00:31,240
‫こんにちは､ お帰りなさい｡

7
00:00:31,270 --> 00:00:36,790
‫今､ すでにポーンに弾丸が当たったときにダメージを与えています｡

8
00:00:36,790 --> 00:00:40,600
‫あとは､ 死後をどうするかですね｡

9
00:00:40,600 --> 00:00:45,910
‫つまり､ 特定のアクターの破壊を処理するための何らかの関数が必要になるのです｡

10
00:00:45,910 --> 00:00:49,030
‫そこで､ ハンドル破壊機能を作ることにします｡

11
00:00:49,030 --> 00:00:55,510
‫また､ アクターダイ関数も必要です｡ これは､ ゲームモードが､ 私たちの世界のアクターが死んだときに何が起こるかを処理できるようにするもので､

12
00:00:55,510 --> 00:01:03,340
‫特定のポーンの健康値がゼロになったときに､ このアクターダイ関数を呼び出すことにします｡

13
00:01:03,340 --> 00:01:07,630
‫では､ このシステムをどのように導入していくのか､ 少しロードマップのようなものをお話ししましょう｡

14
00:01:07,630 --> 00:01:18,610
‫弾丸があり､ それがダメージの適用を呼び出していて､ その結果､ ダメージを受ける関数がヘルスコンポーネントのデリゲートブロードキャストに応答していることが分かっています｡

15
00:01:18,610 --> 00:01:21,100
‫だから､ そこからどうするか考えないといけない｡

16
00:01:21,100 --> 00:01:26,230
‫さて､ 私たちのゲームモードは､ アクターが死んだときに処理する機能を持つことができます｡

17
00:01:26,230 --> 00:01:30,370
‫つまり､ 受けたダメージでは､ 体力が0になるかどうかを確認することができるのです｡

18
00:01:30,370 --> 00:01:38,440
‫そして､ その時点でゲームモード上のアクター死亡関数を呼び出し､ そこからポーンが破壊を処理できるようになります｡

19
00:01:38,440 --> 00:01:45,010
‫つまり､ 最終的には､ 死んだアクターのハンドル破壊関数を呼び出すのは､ ゲームモード次第ということです｡

20
00:01:45,010 --> 00:01:49,660
‫というわけで､ ちょっとしたゲームプランができましたので､ これを実行するためのステップを概説しましょう｡

21
00:01:49,660 --> 00:01:54,400
‫まず､ 破壊処理関数を作成し､ ポーンのいずれかが死んだときに起こるべき機能を処理するために､

22
00:01:54,400 --> 00:01:58,900
‫これをポーンの基底クラスに配置します｡

23
00:01:58,900 --> 00:02:04,090
‫タンクとタワーのクラスにもこれを実装します｡ タンクとタワーは､ それぞれ死んだときに独自の機能を持つからです｡

24
00:02:04,090 --> 00:02:13,090
‫それから､ アクターの死亡関数を作成して､ これをゲームモード・クラスに置き､ そこから破壊処理を呼び出せるようにします｡

25
00:02:13,090 --> 00:02:23,320
‫その後､ ゲームモード上のアクターdied関数でhandle destructionを呼び出し､ ヘルスが0になったらヘルスコンポーネントからアクターdiedを呼び出せるようにします｡

26
00:02:23,320 --> 00:02:27,640
‫では､ まず最初にハンドルの破壊関数を作ってみましょう｡

27
00:02:27,640 --> 00:02:33,430
‫そこで､ このベースポンドHで､ このハンドル破壊機能を追加したいと思います｡

28
00:02:33,430 --> 00:02:38,740
‫さて､ この関数はゲームモードから呼び出す予定です｡ つまり､ パブリック関数である必要があるので､

29
00:02:38,740 --> 00:02:42,850
‫この関数をパブリックセクションに配置することができます｡

30
00:02:42,940 --> 00:02:46,840
‫voidになるので､ ハンドル破壊と言うことになります｡

31
00:02:47,890 --> 00:02:50,710
‫これで､ 入力パラメータを取る必要がなくなりました｡

32
00:02:50,860 --> 00:02:55,360
‫それは単に､ この特定のポーンの破壊を処理することになるのです｡

33
00:02:55,360 --> 00:03:02,770
‫そこで､ この関数をベースとなるpawn CPファイルに実装してみましょう｡ この関数は､ コンストラクタのすぐ下に配置することにします｡

34
00:03:02,770 --> 00:03:10,180
‫そこで､ ハンドル破壊を行い､ 関数名の直前にベースポーンクラス名を配置することにします｡

35
00:03:10,180 --> 00:03:15,640
‫さて､ これはベースポーンに基づくポーンのどれかが死んだときに起こることになります｡

36
00:03:15,640 --> 00:03:21,040
‫そこで､ ハンドルの破壊関数で何をするのか､ ここにto doを配置します｡

37
00:03:21,040 --> 00:03:26,800
‫ここでは､ ポーンが死ぬことに関係する視覚効果､ 聴覚効果をすべて扱いたいと思います｡

38
00:03:26,800 --> 00:03:32,860
‫ですから､ ビジュアルスラッシュ・サウンドエフェクトということにしておいて､ このコースの特殊効果とサウンドのパートに入ったときに､

39
00:03:32,860 --> 00:03:38,920
‫これを忘れずに実装するようにします｡

40
00:03:38,920 --> 00:03:44,890
‫今､ ハンドル破壊がありますが､ タンクとタワーの両クラスにもハンドル破壊の関数を置いて､

41
00:03:44,890 --> 00:03:50,050
‫これらのポーンが死んだときの処理をしたいと思います｡

42
00:03:50,050 --> 00:03:54,670
‫そして､ 最もシンプルな破壊の実装は､ おそらく我々のタワーのために行われるでしょう｡

43
00:03:54,670 --> 00:04:00,760
‫そこで､ Tower Hに入り､ ここにhandle destructionというパブリック関数を追加してみましょう｡

44
00:04:00,760 --> 00:04:10,060
‫そこで､ void handle destructionと言い､ これを実装してtick関数のすぐ下にCPを塔載することにします｡

45
00:04:10,060 --> 00:04:18,130
‫だから､ ここにあるチックはハンドル破壊で､ 関数名の前にちょうどタワーをつけるんだ｡

46
00:04:18,130 --> 00:04:24,280
‫タワーのハンドル破壊関数では､ スーパーバージョンを呼び出して､ ベースポーンのハンドル破壊が呼び出され､

47
00:04:24,280 --> 00:04:29,800
‫タワーが死んだときの視覚効果や音響効果を得られるようにしたいと思います｡

48
00:04:29,800 --> 00:04:35,650
‫だから､ それが呼ばれることを確認するために､ スーパーハンドル破壊と言うことにしているんだ｡

49
00:04:35,650 --> 00:04:39,040
‫そしてその後は､ 単純にタワーを破壊するだけです｡

50
00:04:39,040 --> 00:04:40,390
‫これで､ この仕組みがわかりました｡

51
00:04:40,390 --> 00:04:45,820
‫destroy関数を呼び出すだけで､ タワーの破壊を処理することができます｡

52
00:04:45,820 --> 00:04:54,910
‫これを保存して､ タワーとCPのファイルを閉じると､ 今度はタンククラスにハンドル破壊関数を配置することができます｡

53
00:04:54,910 --> 00:05:02,620
‫そこで､ tankに行き､ tick関数の下にhandle destructionというパブリック関数を宣言してみます｡

54
00:05:03,640 --> 00:05:13,360
‫そして､ Tank CPに行き､ ここのチックのすぐ下にこれを実装します｡ 関数名の前にタンクを付けるのを忘れないようにします｡

55
00:05:13,510 --> 00:05:17,950
‫さて､ タワークラスと同じように､ スーパーハンドルの破壊を呼び出したいと思います｡

56
00:05:19,300 --> 00:05:22,120
‫そうすれば､ その視覚効果や音響効果を得ることができます｡

57
00:05:22,150 --> 00:05:24,910
‫さて､ タンクのほうは､ ちょっと変わったことをします｡

58
00:05:24,940 --> 00:05:27,700
‫戦車を破壊するのではなく､ 隠したい｡

59
00:05:27,700 --> 00:05:33,730
‫そして､ TIC機能を無効化することで､ 世界に存在し､ 私たちが所有することになるのです｡

60
00:05:33,730 --> 00:05:35,740
‫だから､ 今でもカメラからはその景色が見えるんです｡

61
00:05:35,770 --> 00:05:38,610
‫ただ､ 私たちはそれを見ることも動かすこともできないでしょう｡

62
00:05:38,620 --> 00:05:47,710
‫そこで､ 戦車を隠すために､ ゲーム内でset actor hiddenという関数を呼び出し､ booleanを受け取ります｡

63
00:05:47,710 --> 00:05:51,400
‫そして､ もしtrueでパスすれば､ 効果的に戦車を隠すことができます｡

64
00:05:51,430 --> 00:05:55,420
‫あとは､ テロップを無効にしたいのですが､ そのための機能もあります｡

65
00:05:55,420 --> 00:05:58,810
‫セットアクターチックを有効にするというものです｡

66
00:05:59,770 --> 00:06:05,260
‫そして､ このためにfalseを渡すと､ タンクの刻みを無効にすることができます｡

67
00:06:05,260 --> 00:06:08,800
‫これで､ ハンドルの破壊機能は完了です｡

68
00:06:08,800 --> 00:06:11,590
‫そこで､ ハンドルの破壊関数を用意しました｡

69
00:06:11,620 --> 00:06:16,020
‫次のステップは､ ゲームモードでアクターが死ぬ機能を作ることです｡

70
00:06:16,030 --> 00:06:17,440
‫では､ それを実装してみましょう｡

71
00:06:17,440 --> 00:06:32,200
‫ここでは､ Tune Tanksゲームモードで､ アクターdied関数を作成することができます｡

72
00:06:32,440 --> 00:06:37,590
‫そこで､ publicセクションを追加して､ actor died関数を作成します｡

73
00:06:37,600 --> 00:06:40,930
‫これで無効となり､ アクターが死亡したと言うことになります｡

74
00:06:41,170 --> 00:06:49,740
‫そして､ これは単に死んだアクターと呼ばれるアクターポインターを取ることができ､ 今私たちはタンクゲームモードを調整するために死んだアクターを実装することができます｡

75
00:06:50,110 --> 00:07:00,220
‫CP だから､ ここに置いて､ 名前の前にチューンタンクのゲームモードを付けると､ 今度はアクターが死んでしまう機能です｡

76
00:07:00,220 --> 00:07:07,030
‫今度は､ 死んだアクターがタンクかどうかを確認したいのですが､ そのためにはタンク用の変数が必要になります｡

77
00:07:07,030 --> 00:07:09,460
‫そこで､ ゲームモード「チューンドタンク」に話を戻します｡

78
00:07:09,460 --> 00:07:17,290
‫プライベートセクションを作り､ タンク変数を追加してforward declareするつもりです｡

79
00:07:17,290 --> 00:07:23,290
‫そして､ これはAタンクポインタのタイプで､ 単純にこのタンクを呼び出すつもりです｡ そして､ タンクの池のアドレスでこれを初期化する必要があり､

80
00:07:23,290 --> 00:07:27,760
‫そうすれば再生を開始できます｡

81
00:07:27,760 --> 00:07:33,640
‫begin playはprotected関数なので､ ゲームモードではprotectedのままにして､ begin,

82
00:07:33,640 --> 00:07:36,400
‫playをオーバーライドできるようにします｡

83
00:07:36,400 --> 00:07:44,580
‫そこで､ virtual void, begin, play, overrideと言い､ ここではチューンタンク､ ゲームモードで実装できるようにしました｡

84
00:07:44,860 --> 00:07:45,610
‫うん｡

85
00:07:45,640 --> 00:07:52,840
‫だからvoid begin playになるし､ チューンタンク､ ゲームモードのクラス名を使うつもりです｡

86
00:07:52,990 --> 00:07:56,110
‫そして､ まずはスーパービギープレイを呼び出します｡

87
00:07:57,550 --> 00:08:03,040
‫そうすれば､ 親機能を手に入れることができ､ ゲームプレイのスタティックを使ってプレイヤーのポーンを手に入れることができるのです｡

88
00:08:03,040 --> 00:08:11,680
‫そこで､ まずゲームプレイのスタティックを盛り込みますが､ それはすでに見たようにキスマイスラッシュのゲームプレイのスタティックにあります｡

89
00:08:11,800 --> 00:08:17,290
‫そして､ ここで「タンク」を取り出して､ ユースゲームプレイのスタティックの値を割り当てることができます｡

90
00:08:18,230 --> 00:08:19,550
‫ギタリストの椰子｡

91
00:08:20,360 --> 00:08:26,390
‫さて､ これはワールドコンテキストオブジェクトを受け取りますが､

92
00:08:26,390 --> 00:08:30,200
‫これを利用することができます｡

93
00:08:30,200 --> 00:08:37,430
‫jet playerはAポインタを返し､ tankは子クラスであるA tank型であることがわかりました｡

94
00:08:37,430 --> 00:08:44,510
‫そして､ この結果をAタンクポインタに格納したい場合は､ そのAタンククラスにキャストする必要があることがわかりました｡

95
00:08:44,510 --> 00:08:47,450
‫そこでまず､ タンクヘッダーを搭載します｡

96
00:08:47,450 --> 00:08:53,330
‫だから､ タンクHを含むと言いながら､ タンクにキャストするんです｡

97
00:08:53,390 --> 00:09:00,440
‫そこで､ cast to a tankと言いながら､ get player --から返された値をキャストしています｡

98
00:09:00,440 --> 00:09:02,900
‫だから､ ここの括弧の中に入れておく｡

99
00:09:03,260 --> 00:09:08,720
‫そして今度は､ プレイヤーへのポインター--Aタンクポインターの形で--を持つことになります｡

100
00:09:08,720 --> 00:09:14,090
‫では､ タンクができたので､ 死んだアクターがタンクであるかどうかを確認します｡

101
00:09:14,090 --> 00:09:21,800
‫つまり､ デッドアクターがダブルでタンクに等しい場合､ タンクはヌルになる可能性があると言えるのです｡

102
00:09:21,800 --> 00:09:28,940
‫TankがNULLでdead actorがタンクそのものを参照している場合は､ ifチェックに失敗し､ NULLポインタにアクセスしようとはしないので､

103
00:09:28,940 --> 00:09:35,060
‫この内部まで到達することはないからです｡

104
00:09:35,060 --> 00:09:41,900
‫さて､ 死んだアクターが実は戦車だった場合､ 戦車ハンドルの破壊関数を呼び出したいと思います｡

105
00:09:41,900 --> 00:09:44,870
‫そこで､ タンクハンドル破壊と呼ぶことにします｡

106
00:09:45,680 --> 00:09:52,100
‫さて､ ハンドルの破壊関数を呼び出した後､ タンクポッドの入力も無効にしたいので､ タンクを取得して､

107
00:09:52,100 --> 00:09:58,550
‫タンクが継承するdisable inputという組み込み関数を呼び出すことができるようにします｡

108
00:09:59,540 --> 00:10:03,200
‫無効化入力にはAプレイヤーコントローラが必要になりました｡

109
00:10:03,200 --> 00:10:19,160
‫さて､ タンククラスは､ タンクHに来ると､ プレーヤーコントローラのref変数を持っていることがわかります｡

110
00:10:19,160 --> 00:10:21,320
‫参照ではないので､ ポインタになります｡

111
00:10:21,320 --> 00:10:24,260
‫むしろタンクプレーヤーコントローラーと呼びたいくらいです｡

112
00:10:24,350 --> 00:10:27,200
‫では､ 実際に､ このまま名前を変えてみてはどうでしょう？

113
00:10:27,200 --> 00:10:33,530
‫これは､ 開発者が変数に悪い名前をつけてしまったことに気づいたときに､ よくやることです｡

114
00:10:33,530 --> 00:10:36,290
‫そこで､ このコードでは､ これを簡単に行う方法を用意しています｡

115
00:10:36,290 --> 00:10:42,350
‫この変数をハイライトしてF 2キーを押すと､ 名前を変更するように要求されます｡

116
00:10:42,590 --> 00:10:45,710
‫これをタンクプレーヤーコントローラーと呼ぶことにします｡

117
00:10:46,100 --> 00:10:47,480
‫では､ これをご覧ください｡

118
00:10:47,480 --> 00:10:49,790
‫ここではタンクプレーヤーコントローラーと呼ばれています｡

119
00:10:49,790 --> 00:10:54,350
‫タンクCPに行くと､ ここでもリネームされているのがわかります｡

120
00:10:54,350 --> 00:11:00,530
‫だから､ プレイヤー､ コントローラー､ レフなどのインスタンスをいちいち探しに行かなくてもよかったんです｡

121
00:11:00,530 --> 00:11:06,050
‫タンクプレイヤーコントローラーで検索すると､ ここで使われているのはどこも変わっていることがわかりますね｡

122
00:11:06,050 --> 00:11:08,960
‫だから､ リファクタリングのスキルは高いと思いますね｡

123
00:11:08,960 --> 00:11:17,180
‫さて､ ここ「Tune Tanks」のゲームモードでは､ 戦車の入力を無効にする必要がありますが､ これにはプレイヤーコントローラーが必要です｡

124
00:11:17,360 --> 00:11:25,550
‫そこでまず､ if tankと言って戦車のプレイヤーコントローラーが有効であることを確認し､ そのプレイヤーコントローラーにアクセスする必要があります｡

125
00:11:25,550 --> 00:11:30,440
‫しかし､ tankでは､ プレイヤーコントローラの変数がプライベートであることを思い出してください｡

126
00:11:30,440 --> 00:11:36,860
‫さて､ これを公開してパブリックにするか､ この変数に対してパブリックなゲッター関数を作成することができます｡

127
00:11:36,860 --> 00:11:40,340
‫むしろ､ パブリックゲッターを作った方がプログラミング的には良い｡

128
00:11:40,340 --> 00:11:46,610
‫このパブリック・セクションに､ タンク・プレイヤー・コントローラのパブリック・ゲッターを作成することにします｡

129
00:11:46,610 --> 00:11:55,340
‫この関数は､ get tank playerと呼ばれます｡

130
00:11:55,340 --> 00:12:02,900
‫コントローラゲッターは通常､ 変数名の前にgetを付けます｡ また､ この関数はこのクラス内の何かを変更するためのものではなく､

131
00:12:02,900 --> 00:12:10,970
‫プレイヤーコントローラを返すだけなので､ 一般的にコストをかけて作られています｡

132
00:12:10,970 --> 00:12:16,760
‫そこで､ リターンタンク・プレイヤー・コントローラと言うことにして､ それだけを実行することにしました｡

133
00:12:16,760 --> 00:12:25,640
‫戦車のプレイヤーコントローラのパブリックゲッター関数ができたので､ ゲームモード内からここのプレイヤーコントローラにアクセスできるようになりました｡

134
00:12:25,880 --> 00:12:33,080
‫つまり､ if tankが戦車のプレイヤーコントローラーを取得し､ ここでその関数を呼び出すということです｡

135
00:12:33,080 --> 00:12:38,450
‫そして､ この if 文の内部まで到達したら､ プレイヤー・コントローラは有効なので､ この tank disable

136
00:12:38,450 --> 00:12:46,400
‫input の呼び出しをここに移動して､ disabled input にタンクのプレイヤー・コントローラを渡すことができます｡

137
00:12:48,400 --> 00:12:51,950
‫そこで､ ここでもタンクゲット・プレイヤー・コントローラーと呼ぶことにします｡

138
00:12:51,970 --> 00:12:57,910
‫プレイヤーコントローラにアクセスしている間に､ プレイヤーコントローラのbe show mouse

139
00:12:57,910 --> 00:13:03,640
‫cursor Booleanメンバ変数を取って､ これをfalseに設定したいと思います｡

140
00:13:03,640 --> 00:13:08,830
‫そこで､ 入力を無効化し､ マウスカーソルが表示されないようにもしています｡

141
00:13:08,830 --> 00:13:13,400
‫それで､ タンクが死んだときの機能を処理するようになっています｡

142
00:13:13,420 --> 00:13:21,010
‫さて､ 死んだアクターがタンクでない場合､ それがタワークラスのインスタンスであるかどうかを確認したいと思います｡

143
00:13:21,010 --> 00:13:23,200
‫そこで､ ここにelse ifを追加します｡

144
00:13:23,320 --> 00:13:26,410
‫では､ このelseifの条件はどうなるのでしょうか？

145
00:13:26,440 --> 00:13:35,800
‫さて､ 死んだアクターがAタワーに投げられるかどうかを確認したいのですが､ それにはタワーのクラスが必要です｡

146
00:13:35,890 --> 00:13:37,300
‫だから､ タワーも含めて｡

147
00:13:38,170 --> 00:13:40,270
‫そして､ キャスティングに挑む｡

148
00:13:40,270 --> 00:13:44,770
‫そこで､ 角括弧と括弧を取るcastと言うことにします｡

149
00:13:44,770 --> 00:13:50,410
‫そして､ 私たちも鋳造しているものは塔であり､ 鋳造しているものは死んでいるのです｡

150
00:13:50,410 --> 00:13:53,410
‫アクターは死んだアクターをキャストしようとします｡

151
00:13:53,410 --> 00:13:59,410
‫あとは､ このキャストの結果を実際に代入して､ ローカル変数を作成します｡

152
00:13:59,410 --> 00:14:11,470
‫ここでは条件として､ 塔のポインタを言うことができ､ この破壊された塔を呼び出し､ このキャストから返された値を代入することができる｡

153
00:14:11,470 --> 00:14:18,660
‫そうすると､ この破壊されたアクターにアクセスできるようになります｡ これは､ 死んだアクターをタワーにキャストしたものです｡

154
00:14:18,670 --> 00:14:22,630
‫さて､ これが成功したら､ elseifの中まで作ることになります｡

155
00:14:22,630 --> 00:14:24,670
‫そして､ 破壊されたものを取ることができるのです｡

156
00:14:25,490 --> 00:14:31,430
‫タワー､ そして私たちは単にハンドル破壊と呼ぶことができます｡

157
00:14:32,870 --> 00:14:43,910
‫これで､ ゲームモードのアクターが死ぬ関数ができあがりました｡

158
00:14:44,180 --> 00:14:45,980
‫これでステップ2は完了です｡

159
00:14:45,980 --> 00:14:53,540
‫アクター死亡関数を作成し､ ついでにアクター死亡関数でハンドル破壊も呼び出した｡

160
00:14:53,540 --> 00:14:58,150
‫そこで､ 最後のステップとして､ ヘルスがゼロになったときにアクターが死亡したことを呼び出します｡

161
00:14:58,160 --> 00:15:07,250
‫さて､ ゲームモードに存在するこの関数を呼び出すために､ 健康コンポーネントはゲームモードのアドレスを格納する変数を必要とします｡

162
00:15:07,250 --> 00:15:10,340
‫では､ 健康コンポーネントのクラスに入りましょう｡

163
00:15:10,340 --> 00:15:16,100
‫ここにhealthコンポーネントがあります｡ ここでは､ ちょうど一番下にプライベート変数を追加するつもりです｡

164
00:15:16,100 --> 00:15:25,730
‫そして､ これはタイプAのチューンタンクゲームモードのポインタとなり､ これをチューンタンクゲームモードと呼ぶことにします｡

165
00:15:25,730 --> 00:15:32,480
‫ここで､ ヘッダーファイルをインクルードする必要がないように､ これをフォワード宣言して､ ゲームモードにアクセスする必要があります｡

166
00:15:32,480 --> 00:15:38,990
‫では､ 健康部品CPに移動して､ 上にスクロールすると､ ここにbegin play機能がありますが､

167
00:15:38,990 --> 00:15:41,690
‫ここがゲームモードに最適な場所です｡

168
00:15:41,690 --> 00:15:44,840
‫繰り返しになりますが､ コンストラクタに入れるのは早計です｡

169
00:15:44,840 --> 00:15:50,530
‫ゲームモードにアクセスしようとする前に､ ゲームモードが構築され､ 存在することを確認する必要があります｡

170
00:15:50,540 --> 00:15:57,200
‫ここで､ Get Game Modeというゲームプレイスタティクスに関する便利な関数があり､ 現在のゲームモードのベースを返すか､

171
00:15:57,200 --> 00:16:01,610
‫クライアントなどで取得できない場合はnullを返すと書いてあります｡

172
00:16:01,850 --> 00:16:07,730
‫今､ オン・ザ・クライアントでは､ マルチプレイヤーのプログラミングをする必要がありますが､ その心配はありません｡

173
00:16:07,730 --> 00:16:18,230
‫ゲーム用の唯一無二のマシン上で動作しているので､ スクロールダウンして､ ゲームモードのベースがワールドコンテキストオブジェクトを取ることを見てみましょう｡

174
00:16:18,230 --> 00:16:24,080
‫これはあくまで世界の中のオブジェクトであり､ ワールドコンテキストオブジェクトの扱い方はこれまで見てきたとおりです｡

175
00:16:24,080 --> 00:16:29,030
‫これはゲームプレイのstatic hに存在するので､ これをincludeしてみましょう｡

176
00:16:29,030 --> 00:16:35,330
‫そして､ ここのhealth componentsに､ CPがゲームプレイ統計用のincludeを貼り付け､ ここにゲームモードの取得を呼び出し､

177
00:16:35,330 --> 00:16:37,490
‫プレイを開始します｡

178
00:16:37,790 --> 00:16:40,670
‫そこで､ チューンタンク､ ゲームモードと言うことになります｡

179
00:16:42,030 --> 00:16:44,380
‫そして､ それを自分の価値観に設定する｡

180
00:16:44,400 --> 00:16:50,940
‫ゲームプレイ統計は､ ゲームモードとワールドコンテキストオブジェクトを取得します｡

181
00:16:50,940 --> 00:16:54,750
‫これでパスして､ 今度はゲームモードです｡

182
00:16:54,750 --> 00:17:01,080
‫しかし､ ゲームモードを取得すると､ ゲームモードのベースが返され､ それを子クラスのチューンタンクゲームモードに格納しようとしているので､

183
00:17:01,080 --> 00:17:06,810
‫キャストが必要になります｡

184
00:17:06,810 --> 00:17:07,380
‫そうなんです｡

185
00:17:07,380 --> 00:17:17,580
‫そこで､ cast to a tune tanks game modeと言う必要があり､ get game modeから結果をキャストしています｡

186
00:17:17,580 --> 00:17:20,430
‫だから､ そこのカッコの中に入れるんです｡

187
00:17:20,430 --> 00:17:22,410
‫そして､ ゲームモードはチューンタンクを使用しています｡

188
00:17:22,410 --> 00:17:24,840
‫そこで､ そのヘッダーファイルを一番上にインクルードすることにします｡

189
00:17:24,840 --> 00:17:26,970
‫だから､ 含むと言うことです｡

190
00:17:28,960 --> 00:17:32,120
‫Tune Tanksのゲームモード｡

191
00:17:33,100 --> 00:17:36,960
‫そこで､ この健康部品にゲームモードを搭載しています｡

192
00:17:36,970 --> 00:17:44,080
‫ここでダメージテイクに降りて､ ヘルスがゼロになるかどうか確認する準備が整いました｡

193
00:17:44,140 --> 00:17:52,060
‫この場合､ tune tanksのゲームモードポインタを使用して､

194
00:17:52,060 --> 00:18:06,910
‫死んだアクターを渡す関数actor diedを呼び出すことができます｡

195
00:18:06,940 --> 00:18:11,260
‫その場合は､ ゲームモードを使ってアクターが死んだとコールしてください｡

196
00:18:11,260 --> 00:18:17,800
‫ゲームモードへのポインタを持っているので､ まずこのポインタがヌルでないかどうかを確認することを忘れないでください｡

197
00:18:17,800 --> 00:18:21,940
‫そして､ 一旦アクターが死亡したことを呼び出すと､ アクターで渡す必要が出てきます｡

198
00:18:21,940 --> 00:18:25,000
‫死んだ役者で通すのか｡

199
00:18:25,000 --> 00:18:30,370
‫だから､ ビデオを一時停止して､ 今すぐダメージ取得機能にこれを実装してください｡

200
00:18:33,280 --> 00:18:33,670
‫なるほど｡

201
00:18:33,670 --> 00:18:36,720
‫つまり､ すでに健康状態からダメージを引いているわけです｡

202
00:18:36,730 --> 00:18:41,220
‫これで､ その健康値がゼロになったかどうかを確認する準備が整いました｡

203
00:18:41,230 --> 00:18:49,450
‫だから､ 健康状態がゼロF以下であれば､ 電話をかけるのが適切ということになりますね｡

204
00:18:49,480 --> 00:18:55,090
‫ゲームモードが有効かどうかを確認する必要があるため､ 現在アクターは死亡しています｡

205
00:18:55,090 --> 00:19:02,170
‫私はチューンタンクのゲームモードが有効であるかどうかをチェックし､ 確認する場合は､ この中でここに広告を配置することができます｡

206
00:19:02,170 --> 00:19:07,060
‫もしNULLなら､ ここでfalseを返し､ if文の内部には到達しない｡

207
00:19:07,540 --> 00:19:14,050
‫つまり､ if文の内部まで到達すれば､ チューンタンクのゲームモードが有効で､ 体力がゼロになったことになります｡

208
00:19:14,050 --> 00:19:16,780
‫だから､ チューンタンク､ ゲームモードと言えるのです｡

209
00:19:17,980 --> 00:19:19,900
‫そして､ 俳優を死亡とすることができる｡

210
00:19:20,830 --> 00:19:27,160
‫そして､ これには俳優が必要で､ 死んだ俳優がダメージを受けた俳優になることは分かっているのです｡

211
00:19:27,160 --> 00:19:29,950
‫そこで､ 破損したアクターを渡すことにします｡

212
00:19:30,130 --> 00:19:33,640
‫そして､ これをコンパイルして見ることができるようになりました｡

213
00:19:33,640 --> 00:19:35,380
‫コンパイルに成功しました｡

214
00:19:35,380 --> 00:19:37,180
‫では､ エディタに戻りましょう｡

215
00:19:37,180 --> 00:19:40,690
‫そして､ このエディターで､ 死のテストを進めてみてはどうだろう｡

216
00:19:40,690 --> 00:19:45,790
‫自分が壊される前に､ この戦車を何台か壊せるか試してみよう｡

217
00:19:45,790 --> 00:19:47,680
‫それはちょっと大変そうですね｡

218
00:19:47,710 --> 00:19:48,670
‫あ､ 1人いますね｡

219
00:19:48,670 --> 00:19:52,030
‫一人殺したら､ 二人目を手に入れた｡

220
00:19:52,030 --> 00:19:53,230
‫あ､ あと､ 死にました｡

221
00:19:53,650 --> 00:20:01,840
‫だから､ 池に死と破壊を加えたことで､ このゲームがより楽しくなったことがおわかりいただけると思います｡

222
00:20:01,840 --> 00:20:03,550
‫だから､ これはすごいことなんです｡

223
00:20:03,850 --> 00:20:18,010
‫さて､ このビデオではアクターデスを扱いましたが､ このゲームではこれらのクラスの間でかなりの量の相互作用があります｡

224
00:20:18,100 --> 00:20:24,940
‫今､ 死の実装方法は､ 池が単に消えるだけですが､ そのためにまだいくつかのものが必要です｡

225
00:20:25,030 --> 00:20:26,890
‫勝ち負けの条件が必要なのです｡

226
00:20:26,890 --> 00:20:30,490
‫ゲームの勝敗をプレイヤーに示す方法が必要だ｡

227
00:20:30,490 --> 00:20:33,220
‫そして､ その特殊効果も必要です｡

228
00:20:33,340 --> 00:20:36,430
‫音も必要だし､ 爆発音も必要だ｡

229
00:20:36,430 --> 00:20:39,520
‫そういうものは､ すぐにでもやってきますよ｡

230
00:20:39,520 --> 00:20:41,170
‫だから､ おめでとうございます｡

231
00:20:41,170 --> 00:20:46,570
‫あなたはすでに長い道のりを歩んできており､ あと数歩を残すのみです｡

232
00:20:46,600 --> 00:20:48,310
‫次の動画でお会いしましょう｡

