‫こんにちは､ お帰りなさい｡
‫これで､ ユーザー入力の処理を開始する準備が整いました｡
‫つまり､ キーボードのキーを押して､ マウスを動かして､ マウスをクリックして､ その入力に戦車が反応するのを見たいんです｡
‫さて､ そのためには､ まず､ 実際に入力を得る必要があります｡ まず､ 軸マッピングを使って､
‫それを始めます｡
‫では､ このことについてお話ししましょう｡
‫ここで､ プロジェクトの編集とプロジェクト設定に移動してみましょう｡
‫下にスクロールして入力を選択すると､ ここにバインディングが表示されます｡
‫また､ バインディングの下には､ アクションマッピングと軸マッピングがあります｡
‫まず､ 軸のマッピングに取り掛かります｡
‫さて､ 皆さんはこれらを使った経験があるかもしれませんが､ 今回はこれらが何をするのか､ どのように機能するのかについて､
‫少し掘り下げて考えてみたいと思います｡
‫だから､ 3人いるんです｡
‫ドロップダウンの矢印をクリックすると､ ここにWとSWと表示されますが､ これはキーボードのWとSWキーについてです｡
‫これらは､ この特定の軸マッピングに割り当てられ､ 「Move Forward」と呼ばれています｡
‫そこで､ この軸写像の仕組みについて説明します｡
‫アンリアルエディタで､ Move Forwardという軸マッピングがあり､ WとSCSがこの軸マッピングに割り当てられていることを確認しました｡
‫では､ 具体的にはどのようなことなのでしょうか｡
‫さて､ アンリアル・エンジンでは､ 軸マッピングというものがあります｡
‫そして､ 軸のマッピングは､ ゲームの1フレームごとに処理されるものです｡
‫軸のマッピングにキーを割り当てる｡
‫私たちの場合は､ WとSを割り当てました｡
‫では､ このWキーの隣を見てください｡
‫右の私の小さなスクリーンショットのサンプルでは､ スケールと書いてあります｡
‫そして､ スケールの横には数字の「1」があります｡ 0.
‫そして､ SQの横にある､ 目盛りが-1であることにお気づきでしょうか｡ 0.
‫つまり､ これらはその入力情報に影響を与える値なのです｡
‫ここでは､ 軸のマッピングの仕組みについて説明します｡
‫私たちの軸となるマッピングの前進は､ C++の関数と関連付けることができるようになっています｡
‫さて､ Axisマッピングに関して言えば､ 関数をAxisマッピングに関連付ける場合､ float型の入力パラメータを取る必要があるので､
‫floatを取るMOVEという関数を池に作成することができます｡
‫これを入力パラメータ値と呼ぶことにする｡
‫さて､ この関数を前進軸のマッピングに関連付ける方法があります｡
‫軸のマッピングに移動関数をバインドすると書いてありました｡
‫そのため､ Unreal Engine の入力システムは､ ゲームの各フレームごとに､ W キーとキーのどちらを押しているかを確認するようになっています｡
‫そして､ これらのキーを押しているかどうかに応じて､ 1フレームごとに軸の値を計算することになるのです｡
‫この関数が呼び出され､ 軸の値が渡されるのです｡
‫その関数の中で何が起こるかは､ C++の開発者である私たち次第なのです｡
‫さて､ その仕組みはこうです｡
‫WやKeyを押していなければ､ この軸の値はゼロです｡
‫つまり､ 前方移動軸マッピングにバインドされている移動関数は1フレームごとに呼び出され､ 渡されるfloat値は0になるわけです｡
‫今､ Wキーを押しているとします｡
‫Wキーは､ スケールが1に設定されています｡ 0.
‫これは､ 軸の値が1になることを意味します｡ 0となり､ それがMOV関数に渡されます｡
‫そのため､ 1フレームごとに､ 値1で移動関数が呼び出されます｡ 0が通過した｡
‫ここで､ 代わりにスケール値が-1であるSRCを押すとします｡ 0.
‫つまり､ 1フレームごとに移動関数が呼び出され､ -1されることになります｡ 0が渡されます｡
‫さて､ WとSの両方を押す場合､ これらの値は両方とも加算されます｡
‫だから､ 1が出るんです｡ Wキーを押して0とすると､ -1が得られます｡ SRCを押すことで0になります｡
‫これで両者は相殺される｡
‫つまり､ 両方を同時に押している場合は､ ゼロが渡された状態で移動関数が呼ばれることになる｡
‫つまり､ どのキーを押すかによって､ MOVE関数に渡される値が変わり､
‫その値を使ってポーンを移動させるなど､ 好きなことができるのです｡
‫実際にポーンを移動させることについては､ いずれお話しします｡
‫とりあえず､ Axisマッピングシステムからこの情報を扱えるように､ 実際に設定してみましょう｡
‫さて､ Axisマッピングの仕組みがわかったところで､ いよいよmove forward軸マッピングにバインドするコールバック関数を作成します｡
‫そこで､ プロジェクトの設定を閉じて､ VSコードに戻ることにします｡
‫そこで､ VSコードでは､ 前進軸のマッピングにバインドできる関数を作成したいと思います｡
‫そこで､ ここHタンクでは､ プライベート関数を作成することができます｡
‫今､ それがある｡
‫voidの戻り値型ですが､ この動きを呼び出したいと思います｡
‫ここで､ floatの入力パラメータが必要になるので､ この値を呼び出すことにします｡
‫では､ この移動関数をTankで定義してみましょう｡
‫CP コンストラクタのすぐ下に貼り付けて､ 関数名の前にスコープ解決演算子を付けたタンクが必要ですね｡
‫この移動関数を前方移動の軸マッピングにバインドする準備ができました｡
‫そしてそれは､ プレーヤー入力コンポーネントのセットアップという関数の内部で行われます｡
‫聞き覚えがあるはずだ｡
‫実際､ エクスプローラを開いてBase Pont Hに戻ると､ スクロールダウンして公開セクションに関数セットアッププレーヤー入力コンポーネントが表示されます｡
‫これは､ 継承された仮想関数のオーバーライドであることがわかります｡
‫さて､ ベースとなるspawnクラスは､ 実際には入力を設定する必要はなく､ この関数はプレイヤーからの入力を処理するためのものです｡
‫さて､ ベースとなるボンドクラスは入力を処理する必要はありませんが､ タンククラスは入力を処理する必要があります｡
‫そこで､ この関数をbase pond hから取り出すことができるのですが､ tankで必要なのでコピーすることにします｡
‫この関数をコピーして､ Hタンクに移動し､ ここの公開部分に貼り付けます｡
‫そして､ base pondでは必要ないので､ base pondクラスから削除することにします｡
‫そして実際､ 私はベースポンドCPに入り､ ここからも削除するつもりです｡
‫それでは､ Base Pondからセットアッププレイヤー入力コンポーネントを削除してみましょう｡
‫CP そして今､ それはベースとなる池袋のクラスではなくなりました｡
‫それでは､ 変更を保存して､ ベースポンドHとCPを閉じましょう｡
‫そして､ タンクHにプレイヤー入力コンポーネントのセットアップが宣言されましたが､ それとタンクを定義したいと思います｡
‫CP ここタンクでもそうですね｡
‫CP 移動関数のすぐ上に定義を追加しておきます｡
‫これがvoidで､ タンクがセットされたプレイヤー入力コンポーネントですね｡
‫では､ Hタンクに戻り､ その入力パラメータの種類を確認してみましょう｡
‫この括弧の中で前方に宣言されているのがわかると思います｡
‫これは､ ヘッダーファイルでクラス型を宣言して､ 転送する場合にできるものです｡
‫つまり､ ここで前方に宣言され､ この入力コンポーネントのポインタ型が必要で､ パラメータはプレーヤー入力コンポーネントと呼ばれます｡
‫そこで､ この入力パラメータがタンクに必要なのです｡
‫CP だから､ setup player input component の括弧の中に､ ポインターである U input component
‫を入れて､ player input component という名前にしています｡
‫これで､ 関数のシグネチャが関数宣言のそれと一致するようになりました｡
‫さて､ CPファイルに戻り､ この関数に関数ボディを与えましょう｡ この関数を上書きして､ super set
‫up player input componentを呼び出すのは良いアイデアでしょう｡
‫さて､ 親バージョンの setup player input component を呼び出しているので､ you input component
‫タイプの入力を渡す必要があります｡
‫ここでは､ この関数に入力パラメータを渡すことにします｡
‫つまり､ この方法では､ 親クラスがそのバージョンを呼び出すことになります｡
‫現在､ 基地の池の水槽はこの機能を実装していません｡
‫削除したところです｡
‫しかし､ ベースとなる親クラスは -- そのバージョンを呼び出すことになる｡
‫そして､ このように仮想関数をオーバーライドするときは､ 必ずスーパーバージョンを呼び出すことが良いアイデアです｡
‫そのため､ 親バージョンで実装された機能を逃すことはありません｡
‫では､ なぜこのようなことをするのでしょうか｡
‫セットアッププレーヤー入力コンポーネントは何に適していますか？
‫まあ､ アクセスマッピングに関数をバインドするのに向いているのは､ その1つでしょう｡
‫移動関数を前進軸のマッピングにバインドしたいと思います｡
‫そして､ それをここで実現するのです｡
‫そのためには､ この入力パラメータであるプレーヤー入力コンポーネントを使用します｡
‫このオブジェクトは､ そのために設計されています｡
‫プレイヤー入力コンポーネントを取得し､ このポインタに矢印演算子を使ってbind axisという関数にアクセスします｡
‫ここで､ Bind Axisはいくつかの入力パラメータを取ります｡
‫1つ目は文字列リテラルで､ これはテキストマクロを使うことを意味します｡
‫さて､ 引用符の中には何を入れるのでしょうか？
‫軸のマッピングの名前を入れています｡
‫この軸のマッピングをムーブフォワードと呼ぶことをエディターで確認しました｡
‫そこで､ 2番目の入力パラメータにバインドする軸のマッピングを選択します｡
‫これはオブジェクトへのポインタになります｡ この関数をバインドすると､
‫特定のクラスのインスタンスへのポインタになります｡
‫さて､ 3番目のパラメータは､ バインドする関数のアドレスです｡
‫そこで､ 戦車の移動があります｡
‫非常に重要なことで､ 私たちは完全にする必要があります｡
‫関数名をクラス名で修飾する｡
‫そして､ この関数名の前にある､ 演算子のアドレスが必要です｡
‫さて､ このようなことをするのに慣れていなければ､ これは単に関数のアドレスを取っているだけです｡
‫関数も変数と同じようにアドレスを持つことができます｡
‫つまり､ 演算子のアドレスを使うことは､ 関数を他の関数に渡すための方法なのです｡
‫だから､ そのオペレーターのアドレスが必要なんです｡
‫つまり､ アクセスを束縛するための関数呼び出しができたわけです｡
‫ここで､ IntelliSenseのエラー､ incomplete class type you input component is not allowedに気がついたことでしょう｡
‫何が原因なのかがわかった｡
‫ひとつには､ ヘッダーファイルをインクルードする必要があることを意味しているのかもしれない｡
‫もう一つの可能性は､ 誤操作であることです｡
‫コンパイルすれば簡単にわかるので､ コンパイルを試みてみましょう｡
‫コンパイルに成功したことを確認します｡
‫だから､ これは誤ったエラーであることがわかる｡
‫しかし､ もう一度言いますが､ 必要であれば､ それを取り除くためだけにincludeを追加することができます｡
‫だから､ 悩むことはないんです｡
‫これで､ 文句を言っているクラスタイプは入力コンポーネントであることがわかりました｡
‫これがドキュメントにある入力コンポーネントで､ これがインクルードです｡
‫そして､ これをタンクCPファイルの先頭に追加すれば､ あの厄介なfalseエラーを取り除くことができるのです｡
‫また､ pragya wants include ガードがあるため､ 入力コンポーネントが複数回含まれることはありませんし､
‫スクイグルもありません｡
‫これで､ この移動関数が毎フレーム呼び出され､ Wとaskのどちらを押しているかに応じて特定のfloat値を持つことがわかりました｡
‫さて､ ムーブ機能が前進する縛りがあることを知るだけでは､ ちょっと物足りない｡
‫開発者としては､ 物事がうまくいっていることを確認できるのは嬉しいことです｡
‫そこで､ 課題としてやっていただきたいのは､ MOV関数でYUI logを使って､ valueというfloatをmoveに渡している値を表示させることです｡
‫そこで､ uiy logのpercent fを使ってfloatの値を出力ログに記録し､ ゲームをプレイテストしてこれらのキーを押して､
‫ログに何が出力されるかを確認します｡
‫動画を一時停止して､ 今すぐ移動機能に追加してください｡
‫なるほど｡
‫そこで､ mov関数の中で､ uiiログを追加することにします｡
‫そして､ これはログのテンプレ警告になることがあります｡
‫そして､ テキストマクロにも｡
‫単純にバリューパーセントFとバリューをつけるだけなんですけどね｡
‫今は大丈夫です｡
‫もし､ 別の冗長性や警告の種類を使用した場合､ それらの方法を知っていれば｡
‫それは全然構わないんです｡
‫ここでは警告を出すだけで､ パーセントSEなどを使って､ 文字列値でログを整形していますね｡
‫パーセンテージFは､ ご存じない方もいらっしゃると思いますが､ UIログをfloat値でフォーマットする方法です｡
‫では､ これをコンパイルして､ エディタに戻って､ 出力ログを開いて､ 再生ボタンを押して､ 出力ログに無数のメッセージでスパムをかけているところを確認してみましょう｡
‫では､ ビューポートでクリックして､ Wキーを押してみます｡
‫私がリリースする1つの価値観があるんです｡
‫ゼロに戻りました｡
‫キーを押したらマイナス1だ｡
‫そして､ 両方を同時に押すと､ ゼロになるのです｡
‫というわけで､ 予想通りの展開になりました｡
‫完璧です｡
‫わかりました｡
‫このビデオでは､ ユーザー入力を処理するための池を設定しました｡
‫アクセスマッピングについて説明し､ 移動関数を前進アクセスマッピングに結びつけました｡
‫その後､ MOVE関数でYUIログを使ってそのアクセス値を出力しましたが､ 実際には出力ログにいくつかの値を出力するだけでなく､
‫タンクを移動させたいと考えています｡
‫そこで､ これからの講義では､ 実際にタンクを動かし始めることができるようにセットアップしていきます｡
‫また､ お会いしましょう｡