‫こんにちは､ ようこそ｡
‫この講義では､ メンバー変数にベクトルvelocityを使用して移動プラットフォームを設定する方法を紹介します｡
‫そして､ デルタタイムと呼ばれるものを使って､ その動きをフレームレートに依存しないようにする方法を見ていきます｡
‫では､ 潜入してみましょう｡
‫つまり､ ここまでは､ ベクトルの1成分ずつを更新してきただけなのです｡
‫では､ この方法でなくてもいいと言ったらどうでしょう｡
‫ベクトル全体を一度に一定量更新すればいいのでは？
‫さて､ 前節で見たように､ ベクトルは他のベクトルに足すことができます｡
‫そこで､ 移動プラットフォームHに移動して､ 移動プラットフォームの速度ベクトルを作成し､
‫移動したい方向と速度の両方を指示することができます｡
‫この方法は､ 今ではおなじみのUプロパティを作成し､ どこでも編集できるようにしてインスペクタで見えるようにします｡
‫そして､ 前にやったようにタイプFベクトルにします｡
‫Fベクトルのコンストラクタを作成し､ X成分を100､ その他を0､ 0とし､
‫最後にセミコロンで締めくくります｡
‫さらに､ もう1つのトリックをお見せしましょう｡ 編集と同時に､ このUプロパティにカンマ区切りの別の引数を置くことができます｡
‫実は､ 大文字のCでカテゴリーと呼ばれるものを入れて､ 等号を入れることができるんです｡
‫そして､ このイコールサインのカテゴリーイコールの間には､ 通常､ スペースを空けています｡
‫そして､ 表示させたいカテゴリーを指定することができます｡
‫この下に､ トランスフォームレンダリングレプリケーションのカテゴリがあるのがわかります｡
‫このようなカテゴリーを､ 私は「ムービングプラットフォーム」と呼ぶことにして､ これらの変数を入れるムービングプラットフォームのカテゴリーを持つようにしました｡
‫そして､ そのカテゴリーをダブルクォーテーションで囲んでいることに注意してください｡
‫それが正しい構文です｡
‫それらを含める必要があります｡
‫そして､ この新しいメンバ変数をC++で利用することができるのです｡
‫そこで､ 現在地のX成分を設定する代わりに､ その行を完全に削除して､
‫現在地は現在地＋プラットフォーム速度に等しいというように書き換えてみることにする｡
‫行の最後にセミコロンを付けて､ Unrealに移動してコンパイルを実行し､ この結果がどうなるかを見てみましょう｡
‫ということで､ 無事コンパイル完了です｡
‫そして､ この動くプラットフォームのセクションは､ プラットフォーム速度があり､ その x コンポーネントは 100
‫に設定されているのがわかると思います｡
‫行って再生を押すとどうなるのでしょうか？
‫1フレームごとに100個ずつ追加しているので､ プラットフォームは遠くへ向かってどんどん加速していきます｡
‫それは多いですね｡
‫でも､ 秒速100センチメートルくらいの速度で動いてほしい｡
‫それは､ ちょうど1秒間に1メートルの速さです｡
‫あまり速くはないですね｡
‫では､ なぜこんなに速いのでしょうか？
‫まあ､ 私のフレームレートのせいですが｡
‫まあ､ もっと遅いシステムだったら､ 動きも遅いんだろうけど｡
‫もっと速いシステムだったら､ もっと速く動いているはずですしね｡
‫それは意味がないように思います｡
‫そこで､ デルタ時間の使い方についてお話します｡
‫デルタタイムとは？
‫Unreal の Delta time を使用すると､ 各フレームの実行時間がわかります｡
‫デルタタイムはどこだ？
‫さて､ Visual Studioのコードを見てみると､ Delta timeはtickの一番上にあるここに記載されている変数です｡
‫実はこれ､ 入力パラメータなんです｡
‫関数の入力です｡
‫つまり､ ローカル変数と同じように､ tick関数の内部で使用することができます｡
‫つまり､ 1フレームの実行にかかった時間を教えてくれるのです｡
‫しかし､ なぜそれが重要なのでしょうか？
‫なぜなら､ 何かにデルタタイムを掛けると､ 基本的にゲームのフレームレートに依存しなくなるからです｡ つまり､ 速いコンピュータでも遅いコンピュータでもゲームの挙動は同じということです｡
‫では､ 1秒ごとに何かを左に1単位ずつ動かしたい場合を例にとって見てみましょう｡
‫異なるマシンでの表示は以下の通りです｡
‫パソコンが遅いんです｡
‫1秒間に10コマしかできないものと､ 1秒間に100コマできる高速なコンピューター｡
‫今度は､ そのフレームの持続時間が違うのです｡
‫そのため､ 遅いコンピュータでは､ フレームの持続時間は0になります｡ 秒の1｡
‫1秒間に10個しか入らないのに､ 高速なパソコンだと0になってしまう｡ 1秒の01､ より速く物事を実行できるため､
‫とても少なくなっています｡
‫1フレームの計算時間が短くなる
‫だから､ フレームの持続時間に掛けると､ 私の1単位が掛かります｡
‫そうすると､ 1/2で見ることになるんですね｡
‫つまり､ 10フレーム実行されたところに､ 1単位の動きを得ることができるのです｡
‫も同じです｡
‫100フレーム実行しても､ 1単位の動きになるんです｡
‫そこで､ デルタタイムとの掛け算に挑戦してみたいと思います｡
‫そこで､ ベクトルに浮動小数点値を乗じることで､ 大きさをスケーリングできることを思い出しましょう｡
‫そして､ C++でこれを実現する方法は､ star演算子を使うことです｡
‫それが私たちの掛け算のやり方です｡
‫乗算記号演算子がない
‫Xと混同してしまうので､ 掛け算を表す星形演算子を使い､ 結果をまとめて試算してほしい｡
‫だから､ デルタタイムを掛けて､ 速度を掛けて､ どうなるのか､ プラスビデオで､ やってみましょう｡
‫なるほど｡
‫お帰りなさい｡
‫つまり､ ここで掛け合わせたいのは､ プラットフォームの速度です｡
‫さて､ これを別の変数に取り出すこともできますが､ 実際には､ この行の最後､
‫明らかにセミコロンの前､ つまり文の終わりの前に､ デルタ時間を乗じたものを置くだけでよいのです｡
‫ここで興味深いのは､ 演算子の先行性があることです｡ プラットフォーム速度とデルタ時間の掛け算が､
‫現在地への加算の前に行われるのです｡
‫さて､ これは通常の数学のルールに従っているのですが､ そのルールの全リストはこちらです｡
‫その詳細はここでは省きますが､ WikipediaのOrder of Operationのページを見てみてください｡
‫ボディマス､ ビッドマス､ ペッドマス､ ベッドマスなど､ 言語によっていろいろなルールがあるんです｡
‫いろいろな略語がありますね｡
‫だから､ あなたが使ってきたものを､ ぜひ使ってみてください｡
‫私の場合は体質でしたが､ 他のところでは違うようです｡
‫このように書くこともできますが､ それとは異なる順序で何かが起こることを確認したい場合は､ 括弧を使ってそれを示すことができるということに注意しましょう｡
‫そこで､ 物事を明確にするために､ この掛け算を括弧で囲んで､ こういうことが起こるということを示すことにします｡
‫まず掛け算､ 次に現在地への足し算｡
‫では､ Unrealに移動して､ これをテストしてみましょう｡
‫これから､ コンパイルを実行し､ 完了したら､ 再生を実行しましょう｡
‫そして今､ プラットフォームがもっと普通のスピードで動いているのがわかります｡ 実際には秒速1メートルで動いているので､
‫動いているプラットフォームとしては問題ありません｡
‫これで､ 速度を下げるだけでなく､ フレームレート､ 独立した速度になったことがおわかりいただけると思います｡
‫もし私のコンピュータが､ バックグラウンドで何か他のことが起こっていて､ カクカクしていたとしても､
‫これはゲーム内で同じように見え､ 同じようにプレイできるはずです｡
‫素晴らしい内容です｡
‫それでは､ 次回の講義でお会いしましょう｡