‫こんにちは､ お帰りなさい｡
‫さて､ このビデオでは､ タンクをどのように動かすかについて話を始めます｡
‫だから､ タンクを動かすには､ 何らかのオフセットとアンリアルエンジンを追加する必要があるんだ｡
‫オフセットを追加する場合､ ローカル空間とワールド空間のどちらでオフセットを行うか決定する必要があります｡
‫そこで､ この2つの違いについて説明します｡
‫さて､ エディターでは...タンクを選択していますが､ これを選択するとすぐに､ ギズモがあることに気づかれることでしょう｡
‫これがギズモというものです｡
‫3本の矢があり､ それぞれ違う色をしています｡
‫さて､ お気づきでない方もいらっしゃるかもしれませんが､ 画面左下には､ もうひとつ小さなギズモがあります｡
‫これは､ 選択中の俳優のギズモと同じようなものです｡
‫だから､ 何かアクターを選ぶと､ 必ずこのギズモが出てくるんです｡
‫もちろん､ 並進→回転→拡大縮小の各モードになると､ ギズモが変化します｡
‫ビューポートの右上にある左端のアイコン､ またはWキーでアクセスできるトランスレート中にある限り､
‫ギズモ上の矢印をドラッグして､ 物を動かしたり平行移動させたりすることができます｡
‫そして､ 色は赤がX軸､ 緑がY軸､ 青がZ軸に対応しています｡
‫ここで､ 視点を回転させて別の方向を見ると､ そのギズモはまだ元の方向を向いていることがわかります｡
‫そして､ 回転していても､ ワールドの方向が変わらないので､ ビューポートの左下のギズモが回転しています｡
‫ここまではいいんです｡
‫今見ているのは世界空間の方向ですが､ 世界の各アクターにはローカルな方向が存在します｡
‫そして､ この世界のようなアイコンをクリックすると､ ポップアップにサイクルと表示されます｡ トランスフォームギズモは､
‫世界とローカルな空間の間でシステムを調整します｡
‫ここで世界が表示されているときは､ 世界の空間を見ていることを意味します｡ しかし､
‫それをクリックすると､ 今度は立方体に変わり､ 選択したアクタのローカルな空間を見ていることになるのです｡
‫ビューポートの左下にあるギズモは､ まだワールド空間を表示しています｡
‫しかし､ このアクターを回転モードに切り替えて回転させ､ 並進モードに戻ると､
‫ギズモが違う方向を向いているのがわかると思います｡
‫アクター自身はローカルなX軸を持っています｡
‫アクターのX軸は､ その前方ベクトルと考えることができます｡
‫画面左下のギズモは､ まだ同じ方向を向いていることに注目してください｡
‫しかし､ このアクター､ ポーンタンクは独自のローカルX方向を持っていて､ 違う方向に向いています｡
‫ここでキューブをクリックしてワールドに戻すと､ 戦車のギズモがワールドの軸方向と一致し､
‫整列します｡ このため､ 任意のアクタのワールドとローカル空間を切り替えて､ そのローカル方向とワールド方向を確認できます｡
‫つまり､ 私たちの世界で選択したアクターには､ そのアクター独自のローカルな方向性があることがわかったのです｡
‫そしてこれは､ こちらの画像に示されるような世界の方向性とは異なるかもしれませんし､ そうでないかもしれません｡
‫そのため､ Unreal Engine でオブジェクトを移動させる場合､ これは非常に重要なことです｡
‫オブジェクトを移動させるための関数があり､ ワールド空間とローカル空間では移動のための関数が異なる｡
‫例えば､ 水槽がこちら側を向いていて､ 水槽に描いた矢印のようにX軸が少し左を向いているとします｡
‫さて､ この左下のギズモから､ 世界のX軸方向が右を向いていることがわかります｡
‫だから､ 戦車は世界空間の方向と一致していない｡
‫さて､ この水槽をワールド空間で正のX方向に移動させるとします｡
‫そうすると､ 戦車が左を向いていても､ そのワールドX方向に動いてしまうので､ 後ろ向きに動いているように見えてしまうんです｡
‫だから､ それは私たちの望むところではありません｡
‫さて､ 一方､ タンクを自分の局所空間で動かすような機能を使うとします｡
‫つまり､ タンクを自分のローカルX方向に動かせば､ 期待通りの方向に前進することになる｡
‫そして､ それが私たちの求める行動なのです｡
‫アンリアル・エンジンで登場｡
‫これを実現するのが､ Add Actor Local Offsetという関数です｡
‫この関数は､ アクターをローカル方向に移動させます｡
‫今度はオフセットを適用し､ 1回の動作とする｡
‫つまり､ 戦車を移動させたいフレームごとにこの関数を呼び出すことになります｡
‫そこで､ 1フレームごとに関数を呼び出しているので､ 小刻みに動かしていくことになります｡
‫つまり､ 戦車の場合､ X軸は前進方向ということになります｡
‫つまり､ これはローカルオフセットを追加するときに使用する軸なのです｡
‫ここで､ アンリアルエンジンのドキュメントで､ ADDアクターのローカルオフセットについて説明します｡
‫アクタークラスに属する関数であることがわかりますね｡
‫そのため､ アクタークラスに存在するため､ 現在はアクターローカルオフセットの追加と呼ばれています｡
‫Pawnsはこの機能を継承しているので､ それを利用することができます｡
‫さて､ ここからが構文です｡
‫4つの入力パラメータを持つ｡
‫1つ目は､ デルタロケーションと呼ばれるFベクトルである｡
‫そこで､ このアクターローカルオフセット追加関数に渡すことができるFベクトルを作成する必要があります｡
‫そこで､ このアドアクター・ローカル・オフセットについて知っています｡
‫そして､ これをtick関数で行えるようにするために､ どのように動作するかを実験してみたいと思います｡
‫ここでは､ tick関数をtankクラスで上書きしていませんが､ pongクラスのベースにはtic関数があります｡
‫ベースポンドCPに行くと､ ここにはチック機能があり､ ここでは何もしていないので､
‫実験をするには最適です｡
‫これから行うのは､ タイプ､ 追加､ アクター､ ローカルオフセット､ このような感じです｡
‫そして､ 右クリックして､ go to definitionを選択します｡
‫さて､ アクター CP ファイルでは､ ADD Actor Local Offset の定義があります｡
‫さて､ 面白いことに気がつきました｡
‫ルートコンポーネントがNULLでないかどうかをチェックし､ NULLでない場合は､ この関数add local offsetを呼び出します｡
‫つまり､ ルートコンポーネントにオフセットを追加しているのです｡
‫そして､ 他のすべてのコンポーネントは､ ルートコンポーネントに取り付けられているので､ 一緒に移動します｡
‫つまり､ ローカルオフセットを追加するときは､ ルートコンポーネントを移動させ､ それ以外のものはそれに伴って移動させるということが重要なのです｡
‫ここで､ ローカルオフセットの追加にカーソルを合わせると､ 4つの入力パラメータがすべて表示されることがわかります｡
‫そして､ 最初のFベクトル以外は､ デフォルト値が設定されています｡
‫bool B sweepに注目すると､ イコールfalseと書いてあります｡
‫3つ目と4つ目の入力パラメータもこのデフォルト値になっています｡
‫つまり､ この関数を呼び出したときに､ 最後の3つの入力パラメータに入力を渡さなかった場合､ デフォルトでこれらの値が設定されることになります｡
‫さて､ アクターCPをクローズして､ ここ基本池のティック関数でアクターローカルオフセットの追加を各フレームで呼び出して､
‫その動作を見たいと思います｡
‫さて､ 最初の入力パラメータはFベクトルであることがわかった｡
‫デルタロケーションと呼ばれるものです｡
‫これは､ この関数を呼び出すたびに追加したい移動量です｡
‫そこで､ delta locationというFベクトルを作ってみます｡
‫だからFベクトルデルタの位置｡
‫では､ このベクトルをゼロにしたいと思います｡
‫つまり､ すべてゼロで初期化されていることを確認するのです｡
‫ゼロベクトルが欲しいので､ ゼロfを渡すと､ x､ y､ zはすべてゼロfになります｡
‫だから､ これは私の目的にぴったりなのです｡
‫では､ デルタロケーションXを､ 2点Fに変えてみます｡
‫そうすると､ YとZが0､ xが2に設定されたベクトルになります｡
‫そこで､ 一種の実験として､ デルタの位置をアクターローカルオフセットの追加に渡してみることにします｡
‫これで､ add actor local offsetを呼び出して､ 最初の入力パラメータを渡すだけで､ 他の3つはオプションになるので､
‫何とかなります｡
‫だから､ これをコンパイルしてどうなるかを見てみる｡
‫さて､ 再生ボタンを押してみると､ いくつかのことに気がつきます｡
‫まず､ 見てください､ タワーも動いていますよ｡
‫これは､ ベースポーンのtick関数にこれを入れ､ これらのボンドは両方ともベースポーンを継承しているからです｡
‫だから実は､ これらの池はすべて動いていたのです｡
‫そして､ 面白いのは､ それらがそれぞれX軸方向に動いていることです｡
‫この視点からは､ すべてが一度に動くのが見えるのです｡
‫プレイの横のドロップダウンをクリックしてシミュレートを選択すると､ 池を所持していない状態でゲームをプレイすることができます｡
‫そこで､ 「Simulate」をクリックすると､ こんなことが確認できます｡
‫すべての池は､ それぞれのX軸方向に動いています｡
‫それは実際､ かなり奇妙で､ かなりクールです｡
‫つまり､ 広告主のローカルオフセットがどのように機能するかを示しているのです｡
‫物事をローカルな方向に動かす｡
‫これで､ ドロップダウンをクリックして選択したビューポートを選択することで､ シミュレートモードから抜け出し､
‫通常のプレイモードでプレイすることができるようになります｡
‫では､ この作業を中断して､ baseに戻り､ この実験的なコードを削除します｡
‫アクターローカルオフセットの追加方法がわかったので､ このままティック機能から削除してしまいましょう｡
‫では､ タンクCPに戻り､ ここではMOVE機能を紹介します｡
‫この関数は1フレームごとに呼び出され､ その値は1に等しいことが分かっています｡
‫Wキーを押してマイナス1なら､ キーを押してゼロなら､ 両方またはどちらも押していない場合です｡
‫そこで､ アクターのローカルオフセットを追加してタンクを移動させることに挑戦します｡
‫つまり､ MOV関数では､ デルタロケーションというFベクトルを作ることになるわけです｡
‫ここで､ X､ Y､ zをゼロにすることを確認します｡
‫これは､ 様々なfベクトルコンストラクタを使用するなど､ 様々な方法で行うことができます｡
‫さて､ すべてのコンポーネントをゼロにしたら､ 次にその x を MOV 関数の float 入力パラメータの値に設定します｡
‫これができたら､ 先に進んで､ デルタロケーションを渡して､ アクターローカルオフセットを追加を呼び出します｡
‫ビデオを一時停止して､ 今すぐ実行します｡
‫なるほど｡
‫というわけで､ ここでも戦車CPのファイルに戻りました｡
‫さて､ このEWIログはもう必要ないので､ これを取り除いて､ Delta locationというFベクトルを作ります｡
‫これで､ Fベクトルコンストラクタの1つを使うことができますね｡
‫すべてゼロで新しいベクトルを作る方法はすでに紹介しました｡
‫もう一つの方法として､ fベクトル､ ゼロベクトルでこれを初期化する方法を紹介します｡
‫そして､ これはまさに､ 各成分がゼロのベクトルである｡
‫これはあくまで別の方法を紹介するものです｡
‫つまり､ ゼロのベクトルを持つことになる｡
‫ここで､ デルタロケーションXを取り､ それを値と等しくすることにします｡
‫そして最後に､ デルタロケーションを渡して､ アクターローカルオフセットを追加することができます｡
‫では､ これをコンパイルして､ エディタに戻って､ 戦車の向きをワールドX方向に向けて､
‫再生ボタンを押すと､ ビューポートでクリックできるようになります｡
‫Wキーを押せば前進し､ キーを押せば後退する｡
‫両方押すと打ち消しあって､ 全然動かないんです｡
‫もちろん､ 何も押さなければ､ 私も動きません｡
‫これで戦車も動くようになりましたが､ ちょっと遅いので､ これから調整することになります｡
‫そして､ この動きのメカニズムを戦車で微調整する話もします｡
‫というわけで､ まとめとして､ ADDアクター､ ローカルオフセット､ ワールドスペースとローカルスペースの違いについて学びました｡
‫次回のビデオでは､ この動きのメカニズムを戦車で完成させることにします｡
‫また､ お会いしましょう｡