‫こんにちは､ ようこそ｡
‫このレクチャーでは､ 自分のレベルにいる敵をすべて倒せるように､ 勝利条件を作っていくことになります｡
‫そして､ このフロントガラスが表示されるのです｡
‫ばんざーい！！（笑
‫さっそく潜入してみましょう｡
‫だから､ このゲームで実際にプレイヤーが勝てるようにしたいんだ｡
‫今のところ､ それはできません｡
‫では､ どうすればいいのか？
‫まあ､ いろいろなやり方があるでしょうね｡
‫そのひとつが､ Pawn Killedが呼ばれたときに､ ポーンがプレイヤーコントローラーではなく､ AIだった場合です｡
‫世界に何人のAIがいるかという変数から､ 何人殺さなければならないかを引くことができる｡
‫そして､ それがゼロになったとき､ プレイヤーに有利な形でゲームを終了させることができるのです｡
‫ただ､ その場合､ 世界に敵が何人いるのかを2か所に分けて考えなければならないので､ ちょっともろいと思いますね｡
‫本来は､ ゲームモードにも必要ですが､ 敵を配置する際にもワールドに必要で､
‫この2つが同期していないと､ 問題が発生するのです｡
‫ポーンが殺されるたびに世界中の敵を数え､ AI全員の頭数を数え直し､
‫どれがまだ生きているか確認しよう､ というのが私の好む方法です｡
‫もし､ まだ生きている人がいるならば､ まだゲームを終わらせるつもりはない｡
‫基本的にゲームオーバーにはなりませんが､ 全員死んでいて､ プレイコントローラーが死んでいなければ､
‫プレイヤーの勝利となります｡
‫そのためには､ プレーヤーコントローラーが死んでいるかどうかを問い合わせる方法が必要です｡
‫すみません､ AIコントローラのことです｡
‫では､ 撮影者を探してみましょう｡
‫AIコントローラー｡
‫そして､ ここでやりたいことは､ 死んでいるかどうかを問い合わせることができる新しいパブリックメソッドを作ることです｡
‫つまり､ ボールは基本的に死んでいて､ それが呼び出されたときにコントローラで実際に起こっていることを変えてはいけないから､
‫コンテストになるんだ､ ということをやろうと思っています｡
‫そして､ 先に実装を作成することができます｡
‫今､ 私たちがコントロールすべきなのは......死んだかどうかを教えてくれるものです｡
‫もう一度見てみると､ シューターのキャラクターは......｡
‫覚えておいて､ 我々はすでにこれが死んでいる機能することはできません｡
‫つまり､ 本質的にやりたいことは､ 私が今コントロールしているシューターにリクエストを渡すことだけなのです｡
‫はい｡
‫ひとつは､ KMLのゲームモードで､ コントローラーを手に取り､ 操作しているものを手に取り､
‫キャストして､ それが死んでいるかどうかをチェックすることができます｡
‫というのも､ 突然死の計算方法が変わったり､ AIコントローラーが異なる種類のものを操作するようになったりすると､
‫突然ゲームモードを変更しなければならなくなり､ 意味がなくなってしまうからです｡
‫だから､ これをやって､ AI制御の内部で受け渡しをやったほうが､ よりロバストになるんです｡
‫他人のクラスの内部をいじくり回さずに済むので､ 一般に､ 物事が変わるタイミングを制限することができ､
‫触ったり更新したり変更したりしなければならないクラスの数を制限することができます｡
‫だから､ 私たちがやりたいのは､ シューターキャラクターであることを確認するための......キャスティングなんです｡
‫では､ キャストをやってみましょう｡
‫シューターになるんです｡
‫キャラクター
‫そして､ このようにシューターキャラクターを知るために､ アイコントロールの先頭でハッシュインクルードを行う必要がありそうですね｡
‫そして､ キャストをgetして -- これを変数に格納したいので､ シューターとします｡
‫キャラクターポインターは､ コントロールされていると呼ぶことにしましょう｡
‫キャラクター
‫characterというのは､ すでにAIコントローラの変数になっているので､ これを呼ぶわけにはいきません｡ 行の最後にセミコロンをつけて､
‫これがヌルかどうかをチェックすることにします｡
‫つまり､ 制御文字がヌルポインタと等しくない場合､ それが死んでいるかどうか､ その状態を問い合わせることができるはずなのです｡
‫だから､ その制御されたキャラクターを返すことができるはずです｡
‫死んだ｡
‫基本的に､ 制御文字がシューター文字である場合は､ 制御文字へのリクエストで転送します｡
‫しかし､ ここではreturn文がないことに注意してください｡
‫もう一つのケースは､ 戻り値がvoidでなければ必ずreturnになるようなステートメントを用意する必要があります｡
‫そこで､ if文の中でまだreturnしていないケースを捕らえるために､ if文の外にreturn文を置く必要があるのです｡
‫そしてここでは､ このキャラクターは死んだのか？
‫まあ､ そうですね､ 基本的にはそうでないと､ 基本的には死んでしまいます｡
‫もしポーンがなければ､ ポーンをコントロールできなければ､ このコントローラーは私たちにとって死んだも同然なのです｡
‫そして､ ポーンは死ぬとAIコントローラーから切り離されることを思い出して､ そうなる可能性があります｡
‫では､ ゲームモードに戻り､ ここで何をしたいのか？
‫基本的にやりたいことは､ シューターAのIのすべてに対してのforループである｡ I..
‫世界では
‫そしてそのforループで
‫私たちは何をしたいのか？
‫私たちは､ 死んでいる姿を見たいのです｡
‫基本的に､ あるいは基本的に死んではいない｡
‫そして､ どれかひとつでも死んでいなければ､ 全部の目をチェックする必要はまったくないことが瞬時にわかるのです｡
‫Aが1つでもあれば｡ I. が生きていれば､ ゲームオーバーにはならない｡
‫これは､ この関数内のコードをこれ以上実行することなく､
‫この関数を終了させるものです｡
‫つまり､ このアーリーリターンの後はすべて､ forループの実行を停止し､ それ以降はすべて実行を停止します｡
‫しかし､ その後､ 我々はそれが早期に戻ることなく､ この完全なループをうまく乗り切ることができれば､ 生きているAは存在しないことを意味すると言うことができます｡
‫I. ということであれば､ このままゲームを終了させなければなりません｡
‫単純なことです｡
‫さて､ ここで注目すべきは､ パズルの1つである「エンドゲーム」です｡
‫プレイヤーコントローラーでゲームが終了してしまったからです｡
‫シュータープレイヤーのコントローラーが､ 現在どのように対処しているかを見てみましょう｡
‫そのCPのところに行くと､ 現在見えているのは､ B is winnerが勝者かどうかは現在全く無視しているということです｡
‫そこで必要なのは､ Bが勝者であるかどうかということです｡
‫そして､ それ以外のことをするのです｡
‫負け画面を表示することになりました｡
‫そこで､ 負け画面を表示する役割を担っているここのラインをカットしてください｡
‫alt文にそれを入れて､ とにかく両方のケースで再起動させます｡
‫だから現状ではBが勝っている｡
‫どうするんだ？
‫さて､ これからウィンドスクリーンを作るわけですが､ これはかなり簡単なことだと思います｡
‫シュータープレイヤーコントローラーのヘッダーファイルへ移動します｡
‫負け画面のクラスを複製して､ ここに勝ち画面のクラスを作ることができます｡
‫また､ 先に進むこともできます｡
‫そして実は､ これはあなたへのミニ・チャレンジでもあるのです｡
‫ウィンドスクリーンができるように設定してくるかもしれませんね｡
‫なるほど｡
‫お帰りなさい｡
‫だから､ それを試してみてほしい｡
‫私たちは､ すべての敗因の代わりにここにウィンドスクリーンを入れて､ 本質的に他のすべてをコピーして行くだけです｡
‫そうそう｡
‫次に､ これをコンパイルして､ エディタでプレイヤー・コントローラ・クラスを探します｡
‫そして､ 空のウィンドスクリーン・クラスがあることがわかるはずです｡ これから行うのは､
‫UIに移動して､ ウィンドスクリーンを呼び出すためにロスト・スクリーンを複製することです｡
‫でも､ 色を緑に変える以外は､ ほとんど同じように使うつもりです｡
‫そして､ あなたが負けるのではなく､ あなたが勝つようにするのです｡
‫リスタートのロジックが事実上同じになるだけですから｡
‫なぜかそこで色がリセットされてしまいました｡
‫もう一度､ 色を緑に設定してくるだけです｡
‫なるほど､ それは素晴らしい｡
‫しかし､ KMLゲームモードには､ まだ未記入の擬似コードの塊が残っています｡
‫そしてそれは､ 勝利を計算するためのあなたの挑戦でもあるからです｡
‫疑似コードを記入する｡
‫そのクラスの下のTから範囲を参考にしてください｡
‫コントローラで作成したnew is dead関数を使用して､ テストしてください｡
‫世界中のAIを倒したときに､ フロントガラスが表示されるかどうかを確認します｡
‫そこで､ 擬似的なコードを画面に表示したままにしておいて､ 見てもらうことにします｡
‫K おかえりなさい｡
‫では､ まずforループから｡
‫だから､ 4をやるんです｡
‫ループオーバーのために何をするか？
‫現時点ではコントローラーではありません｡
‫シューターのAIコントローラーになりそうですね｡
‫だから､ それを含めてハッシュ化する必要があるのです｡
‫シューターになるんです｡
‫Iコントローラh｡
‫そして､ シューターであるAをループさせるということです｡ I. コントローラ､ スター
‫短パンのコントローラーを呼び出すだけで､ シューターAというtアクターレンジをやり直します｡
‫I. のコントローラーを使用しています｡
‫この2つのタイプを一致させてから､ 世界を手に入れる必要があるのです｡
‫だから､ このレベルでやっているんです｡
‫そして､ このforループの本体は､ 死んでいないかどうかを尋ねているところです｡
‫だから､ そうでなければ､ コントローラの矢は死んでしまう｡
‫基本的には､ 私たちが死んでいないことを確認することを言っているのです｡
‫そして､ 死んでいないのであれば､ まだゲームが終わるはずがないということで､ このまま早々に復帰してしまうのです｡
‫そうでなければ､ もし戻らずにforループの穴を通過してしまった場合､ プレイヤーはレベル内のAIをすべて殺してしまったことになるので､
‫ゲームを終了させる必要があります｡
‫だから､ この場合はエンドゲームをすればいいんです｡
‫本当です｡
‫プレーヤーが持っているからです｡
‫そしてそれは､ 周りのプレイヤー・コントローラーやコントローラーのすべてに通知されるはずです｡
‫かっこいい｡
‫では､ それをコンパイルしてきましょう｡
‫まず､ アンリアルに移ってプレイしてみます｡
‫なぜかエディタがこの編集指定色操作中と勘違いしているので､ 一旦終了して再開します｡
‫再起動したので､ これからプレイを打つと､ 殺されそうです｡
‫まず第一に｡
‫はい､ 今でも負けています｡
‫それは素晴らしいことです｡
‫さて､ 殺される前にこいつを殺せるかどうか｡
‫さあ､ 行こう｡
‫ブーム､ ブーム､ ブーム､ ブーム､ ブーム､ ブーム｡
‫負けるのが早いんです｡
‫もう一度､ 銃を探しに行って､ セットしよう｡
‫テスト用に銃のそのダメージを本当に高くしてあります｡
‫今回はダメージを20くらいに戻してきます｡
‫だから､ 速いことには変わりないのですが､ それほどでもないのです｡
‫こいつを何度か叩いて遊んできてください｡
‫そして､ そこで分かったことは､ レベルが再開されたので､ 実際に私が勝ったということです｡
‫だから､ もし私がもう一度この男を殺しに行っても､ 何も起こらないのがわかるでしょう｡
‫メッセージログに､ nullクラスで呼び出されたcreateと書いてあるのですが｡
‫その理由は､ BPシュータープレイヤーのコントローラーをもう一度見てみると､ ウィンドスクリーンが接続されていないのがわかります｡
‫一つ忘れていたので､ コンパイル､ セーブ､ プレイをしてきてください｡
‫そして今､ うまくいけばこいつを殺してNew Doomに行けば私の勝ちで､ 5秒後にリスタートできる｡
‫そして､ 同じことが言えることを示したいのです｡
‫プレイヤーコントローラーを増やしたら､ 両方殺さないといけなくなりそうだ｡
‫では､ こちらのシューターキャラクターを持ってきましょう｡
‫そして､ これが2番目に殺すべき敵になりそうです｡
‫だからこいつを殺せばいい､ ドカン｡
‫そして､ それは勝っていない｡
‫そして､ 2番目の男のところへ行くと､ ドーン｡
‫そして今､ 私はAIをすべて殺したので1つ持っています｡ そのために変数を変更する必要はありませんでした｡
‫I. 毎回ゼロから
‫ですから､ 現在､ 私たちはかなり静かな世界に住んでいることになります｡
‫そこで次回の講義では､ オーディオをどのようにすればいいのか､ 少しづつ見ていきたいと思います｡
‫現地でお会いしましょう｡