‫こんにちは､ お帰りなさい｡
‫このビデオでは､ 戦車を高速化する方法について説明します｡
‫戦車の移動速度を正確にコントロールしたい｡
‫そして今は､ このデルタ位置のベクトルをローカルオフセットとしてadd actに渡しているだけで､
‫タンクの移動速度を制御することはできません｡
‫実はかなりゆっくり動いているんです｡
‫そこで､ その速度を制御するための速度変数を作ることにします｡
‫また､ 私たちのゲームはフレームごとにフレームレートが変化するため､ ゲームのフレームレートも考慮します｡
‫実は､ 安定した動きが得られていないのです｡
‫そこで､ そのフレームレートを考慮するために､ デルタタイムと呼ばれるものをお話します｡
‫エディターで再生して､ 戦車を動かしても､ それが目に見えるわけではありません｡
‫しかし､ 私たちの戦車はフレームからフレームへ一貫した速度で動いているわけではありません｡
‫その理由は､ フレームレートが変化するためで､ ビューポートの左上には小さなドロップダウンがあります｡
‫それをクリックすると､ show DPS PESの横にチェックボックスがあるのですが､ これはframes per secondの意味です｡
‫これをチェックすると､ 右上にフレーム/秒が表示されます｡
‫そして､ そのすぐ下には､ 最後のフレームから何ミリ秒経過しているか？
‫そして､ これらの値はフレームごとに変化します｡
‫再生ボタンを押してしまうと見逃してしまうかもしれませんが､ フレームレートが下がって､ また上がってくるのは､
‫その序盤の段階で､ いろいろなことが起きていたからです｡
‫役者全員がビギンプレイ機能を連呼していたし､ 世界観の裏設定もある｡
‫今､ ゲームを始めると､ その120のアプリが120付近で推移しているにもかかわらず､ フレームごとに変化しているのです｡
‫このため､ 動きが安定しないのは､ フレームレートが下がるにつれて､ これらのティックアップデートが呼び出される頻度が少なくなるからです｡
‫そして､ この戦車を毎フレーム同じ量だけ動かすとしたら､ その一貫した動きを得るためには､
‫フレームレートを一定に保つことが必要なのです｡
‫さらにゲームが複雑になると､ フレームレートの変動がどんどんひどくなっていくんです｡
‫そこで､ デルタタイムというものを使って､ しっかりと調整する必要があるのです｡
‫では､ この謎のデルタタイムは何なのか？
‫さて､ このタイムラインは､ 0秒から始まり､ 時間が経つにつれて増えていくとします｡
‫さて､ 時間が進むとカチカチと音がしていましたが､ これはtick関数が呼び出されていることを意味します｡
‫しかし､ ティック機能はあまり一貫性がないことに注意してください｡
‫非常に急激に呼ばれることもあれば､ あまり呼ばれないこともあります｡
‫これは､ コンピューターがフレームごとに計算を行う必要があり､ その計算がコンピューターのリソースを多く消費し､
‫フレームレートが遅くなることがあるためです｡
‫さて､ tick関数にあるこのデルタタイム変数は､ 最後のフレームから経過した時間の量です｡
‫だからここでは0かもしれない｡ 1秒
‫CPUの使用率やその変動に本当に左右されます｡
‫つまり､ CPUの使用率が変われば､ デルタタイムも変わるということです｡
‫そしてこれは､ 1秒あたりのフレーム数が増えると､ 関数呼び出しの回数が増えるということです｡
‫アクターローカルオフセットの追加を頻繁に呼び出すと､ 池の動きが速くなり､
‫移動速度が一定になりません｡
‫そこで､ 解決策として､ デルタ時間で動きをスケーリングすることにしました｡
‫つまり､ デルタタイムを0とすると 1で､ 池を例えば1秒間に10cm動かしたい場合､
‫その動きを0倍してスケーリングします｡ 1秒は､ フレーム更新時間0に必要な正確な移動量になります｡
‫1秒
‫ここで､ この部分のデルタタイムは小さく､ TICがより頻繁に呼び出されることを意味します｡
‫ここでのデルタタイムを0とする｡ 0 1秒
‫だから､ TICはこっちの10倍は呼ばれているんですよ｡
‫まあ､ 単純に動きを0倍にすればいいんですけどね｡ このフレームを01とすると､ 池を1秒間に10センチ動かすと､
‫0. 0 1秒
‫そのため､ TICが頻繁に呼ばれるようになったので､ 池をほんの少し動かしているのです｡
‫こうすることで､ フレームレートの変化とは無関係に､ 池の動きが一定になるのです｡
‫そこで､ VSEのコードに戻り､ この問題をどのように処理するかを考えてみましょう｡
‫デルタ位置のベクトルがあり､ そのxはvalueに等しく設定されていますが､ valueをデルタ時間でスケーリングしたいことは分かっています｡
‫そこで､ ここに少しコメントを入れて､ Xは値の倍､ デルタタイムに等しいとします｡ つまり､ 値をデルタタイムでスケーリングしたいのです｡
‫フレームレートが非常に高い場合は特に､ デルタ時間自体が非常に小さな値であるため､ 一度これを行うと､
‫値を非常に小さくすることになります｡
‫だから､ これを何かでスケーリングする必要も出てくる｡
‫Elseは一種の速度変数で､ この値を決めることで戦車の速度を制御することができるのです｡
‫このように､ ちょっとした擬似コードを使って､ Speedの値を作成し､ デルタタイムの値を取得する方法を見つけることで､
‫これを実装することができるのです｡
‫そこで､ 移動関数からデルタ時間にアクセスする方法について説明します｡
‫さて､ Unreal Engine には､ Delta 時間を取得するための方法が複数用意されています｡
‫実際､ base upon Deltaにあるtick関数を見てみると､ timeはfloatの入力パラメータになっています｡
‫つまり､ tick関数で作業している場合は､ すでにDelta時間にアクセスできますが､ tank DHCPでは､
‫移動関数にその入力パラメータはありませんが､ 非現実的なエンジンにはその方法があるのです｡
‫1つの方法は､ U gameplay staticsというクラスに存在するget world delta secondsという関数にアクセスすることです｡
‫ゲームプレイスタティクスは､ その名の通り､ ゲームプレイのプログラミングを支援する静的な関数をたくさん持っています｡
‫Get World Delta seconds はデルタタイムを返します｡
‫今度は入力パラメータを持つようになりました｡
‫ここでは､ ワールドコンテキストオブジェクトを受け取ります｡
‫Unreal Engineではよく見かけますね｡
‫多くの静的関数は､ ワールドコンテキストオブジェクトを必要とします｡
‫ワールドは､ you worldという型のオブジェクトです｡
‫それは､ 私たちのゲームの最上位オブジェクトです｡
‫マップを表し､ ゲーム内のすべての関連オブジェクトが含まれています｡
‫ワールドデルタ秒を取得するような静的な関数では､ どのワールドにいるのかがわからない｡
‫この関数にどの世界にいるのかを教え､ その世界にアクセスしてデルタ時間値を取得できるようにする必要があります｡
‫さて､ どの世界にいるのかを伝えるには､ その世界に存在するオブジェクトへのポインタを渡せばいい｡
‫タンククラスで作業している間に､ キーワードであるthisを渡せばいい｡
‫これは､ C++のどのクラスの内部でも使えるキーワードです｡
‫このキーワードは､ 作業中の特定のオブジェクトのインスタンスへのポインタである｡
‫つまり､ タンククラスで作業している場合､ これは今いるタンクへのポインタです｡
‫そのため､ ワールドコンテキストオブジェクトを必要とする関数は､ 入力パラメータとしてこれを受け取ることができる場合が多い｡
‫そのため､ ワールドデルタ秒を取得すると､ それがどのワールドにあるかがわかり､ 適切なデルタを取得することができるのです｡
‫その世界の時間｡
‫つまり､ get world delta seconds を -- クラスの中で呼び出す場合､ これを world context
‫オブジェクトとして渡すことになる｡
‫これで､ 戦車のスピードをコントロールするためのツールはすべて揃いましたね｡
‫つまり､ 速度変数を作って､ これをfloatにして､ タンククラスのprivateセクションに置くということです｡
‫開発中に調整できるように､ これをブループリントに公開します｡ つまり､ これにyouプロパティを与え､
‫希望する公開レベルに対応する適切なyouプロパティ指定子を使用することになります｡
‫さて､ MOV関数では､ コメントとして配置した疑似コードのビットがあります｡
‫だから､ それを目安にしてください｡
‫デルタ位置､ Fベクトル､ スケールを取ることになります｡
‫デルタタイムでXなんです｡
‫Uゲームプレイスタティクスを使用してデルタタイムにアクセスする方法を見たばかりです｡
‫そして､ Xを速度変数でスケーリングすることにもなります｡
‫さて､ 今回はgameplay staticsの関数を使うので､ gameplay statics用のヘッダーファイルをインクルードする必要があります｡
‫さて､ アンリアルエンジンのドキュメントを使って､ 特定のクラスのインクルードを見つける方法を何度も紹介しました｡
‫そこで､ Unreal Engineのドキュメントでゲームプレイのスタティックを検索して､ そのヘッダーファイルを見つけてみることに挑戦してみます｡
‫そして､ もしそれが見つからない場合は､ このビデオのリソースにあるリンクを見つけるだけで､ ゲームプレイのスタティックのドキュメントが得られますが､
‫自分自身でそれを見つけるようにしてください｡
‫まず映像を一時停止して､ 今すぐ戦車のスピードをコントロールしてください｡
‫なるほど｡
‫そこで､ 私の疑似コードで､ デルタタイムと速度で値をスケーリングする必要があります｡
‫そこでまず､ speed変数を作成します｡
‫今､ hタンクに戻りました｡
‫ここで､ スピードの変数を配置することができる｡
‫しかし､ 以前の講義の練習問題で､ Base PondクラスにSpeedというfloatを追加したことを思い出してください｡
‫今､ 私はこのベースポンドでスピードの変数を必要としません｡
‫これはあくまで練習なので､ ここでは必要ないんですけどね｡
‫実は､ 私が作ったこの他の30個のツは､ ユープロパティースペシファイアを実証するために必要ないのです｡
‫そこで､ これらをすべてハイライトして､ ベースとなる池沼クラスから削除してしまいます｡
‫もういらないんです｡
‫だから､ もうないんです｡
‫さて､ 池の水槽の設計図で､ この速度変数を参照したことも覚えておられるかもしれません｡
‫そこで､ BP池の水槽を開放してみる｡
‫そして､ このイベントグラフの中に､ 私が参照した速度変数があります｡
‫もうこれは必要ないので､ これらのノードを削除して､ BP池水槽をコンパイルして保存してきます｡
‫なるほど｡
‫一通り片付けたら､ タンクに戻って速度変数を追加します｡
‫そして､ ここはプライベートコーナーになります｡
‫move関数のすぐ上に追加して､ speedというfloatにします｡
‫では､ ここで初期値を与えてみます｡
‫200Fで試して見ようかな｡
‫しかし､ 開発中にエディタで編集できるようにしたいので､ 新しいプロパティ・マクロを取得し､
‫インスタンスとデフォルトでこれを編集できるようにしたいと思います｡
‫だから､ どこでも編集できるようにするんです｡
‫さて､ こんなことしなくてもいいのにと思いつつ､ カテゴリーをあげてみました｡
‫ムーブメントという新しいカテゴリーを作ってみます｡
‫これでイベントグラフへの公開は任意となった｡
‫イベントグラフでアクセスする必要はないと思うので､ 保留にします｡
‫必要ならね｡
‫将来的には､ ブループリント､ リード､ ライト､ ブループリントのリードオンリーで公開し､ そのメタでプライベートアクセスを指定することができます｡
‫でも､ 今のところその気はない｡
‫そこで､ 速度変数を持っていて､ ここ戦車DHCPでは､ 値を取って速度でスケーリングすることにしています｡
‫最後に､ デルタタイムで値をスケーリングするのですが､ これにはゲームプレイのスタティックが必要です｡
‫そこで､ Unreal Engineのドキュメントを紹介します｡
‫私は先に行き､ あなたのゲームプレイの統計情報を検索し､ それはここにあるあなたのゲームのゲームプレイの統計情報です｡
‫だから､ includeの行までスクロールして､ これをコピーして､ タンクCPに戻せばいいんです｡
‫貼り付けることができます｡
‫新しいゲームプレイスタティックにアクセスできるようになったので､ デルタタイムを取得できるようになったので､ あなたに掛けることにします｡
‫ゲームプレイのスタティックはワールドデルタ秒を取得します｡ 先ほど見たように､ これにはワールドコンテキストオブジェクトが必要です｡
‫ポップアップでワールドコンテキストオブジェクトを要求しているのもわかります｡
‫だから､ 私はこれで合格です｡
‫では､ Delta locations Xを値times, speed, times, delta timeに設定したので､ これをコンパイルしてみます｡
‫というわけで､ コンパイルに成功しました｡
‫エディターでBP Pond Tankに戻ると､ そこに私のスピードが表示されています｡
‫そして､ ワールドで戦車のインスタンスを選択すると､ 詳細パネルで動きを検索すると速度があり､
‫好きな値に設定することができるんです｡
‫これを回して再生すると､ かなり動きが速くなるんです｡
‫これが､ 変数をブループリントに公開するメリットなんですね｡
‫試行錯誤して､ 自分に合ったスピードを見つけることができる｡
‫よし､ それならいい感じだ｡
‫もうFPSOを映すのはやめよう｡
‫そして､ スピードの変数ができたので､ それを変更することができます｡
‫そしてその変化は､ 私のポーンの動きに反映されます｡
‫そこで､ タンクの移動速度を制御することにしました｡ ブループリントに公開する素晴らしい速度変数があり､
‫その値を実験開発中に設定することができます｡
‫また､ デルタ時間について学び､ なぜデルタ時間で動きをスケーリングすることが重要なのかについても学びました｡
‫フレームレートが変わっても､ 戦車の動きはスムーズで一貫しているので､ フレームレートに依存しないのです｡
‫さて､ セクションプランを振り返ってみると､ 最初の箇条書きはほぼ終わっています｡
‫戦車を作ったので､ 世界中を移動することができます｡
‫2つ目のポイントは､ WASDキーボード操作による入力と､ マウス入力にも対応することです｡
‫WとSWの部分は押さえましたが､ AキーとDキーを使えるようにする必要があるので､ それらでタンクを回転させます｡
‫だから､ これからの動画は順調に進んでいます｡
‫タンクを動かす能力を仕上げることに取り組む｡
‫また､ お会いしましょう｡