‫こんにちは､ ようこそ｡
‫この講義では､ チェックボックスにチェックを入れることで､ ムーバーに動きを持たせてみます｡
‫一定の速度で移動し､ 動くことを可能にします｡
‫そして､ 今回は内部からいくつかのライブラリ関数を使ってこれを行うことにします｡
‫アンリアル
‫そのため､ ヘッダーファイルやインクルードに関するすべての知識が試されることになります｡
‫さっそく潜入してみましょう｡
‫そこで､ このムーバーを動かす方法として､ ある秒数でスタート地点から目標のオフセットまでスムーズに移動させたいと考えています｡
‫そこで､ ヘッダーファイルに新しいプロパティを追加することで､ これを設定する必要があります｡
‫まず､ ファイルの先頭にプライベートセクションを追加し､
‫どこでも編集可能な新しいプロパティを追加して､ オフセット（移動オフセット）を定義します｡
‫では､ このムーバーは起動時にどこまで動くべきなのか｡
‫そこで､ Fベクトルを使って､ 移動オフセットと呼び､ デフォルト値を与えないようにします｡
‫エディターでやるんです｡
‫次に､ もう一つ新しいプロパティを作成します｡ これも「どこでも編集」とし､
‫ターゲットに移動するのにかかる時間を設定します｡
‫そこで､ 移動時間であるfloatをデフォルトの値､ 例えば4秒に設定することにします｡
‫これはブール値で､ このブール値を有効にするとムーバーが下に移動するようになります｡
‫そこで､ また別のUプロパティを作ってみましょう｡
‫Edit anywhereは再生中でも編集できるようにするためで､ should moveというブール値になり､
‫デフォルトではfalseに設定されています｡
‫エディターでこれをチェックすると､ 再生時に､ 目標の移動オフセットに移動するようになるわけです｡
‫以前は､ 動く部品がある場合､ すべてのステップを手動で行っていました｡
‫しかし､ 実際には必要な計算をするための機能が組み込まれていることをお見せしたいと思います｡
‫アンリアルにそのまま組み込まれていて､ V interpret constantという関数もあるんですよ｡
‫で､ 何が面白いかというと､ その発言を見てみよう｡
‫そこで､ 現在のベクトルから目標のベクトルまで､ 一定のステップを使用してベクトルを補間する｡
‫つまり､ ある一定の速度で現在から目標まで移動し､ それを常に繰り返すということです｡
‫現在地からオフセットした目標地点まで､ 一定の速度で移動したい｡
‫さて､ この関数の構文を見てもらうとわかりますが､ 戻り値の型がFベクトルであることがわかります｡
‫つまり､ それが補間された新しい位置というわけだ｡
‫そして､ 2つの入力を持つ｡
‫現在のFベクトルと､ 最終的に到達させたい目標値というのが重要なのですが､
‫この効果の周りの他のシンボルは気にしないでください｡
‫そして､ デルタタイムを持つ｡
‫そこで､ これを利用して､ 動きのフレームレートを独立させ､ 補間速度に利用しているのです｡
‫では､ 現在地からターゲットまで､ どれくらいのスピードで移動すればいいのでしょうか？
‫この関数を使用するためにC++ファイルに必要なインクルード行が書かれています｡
‫そして､ 前のビデオで見たように､ include行によって､ この特定のファイルから定義をコピーすることができるのです｡
‫そして､ そのひとつがこの機能に対する定義です｡
‫つまり､ この関数の前にあるVは､ 基本的にベクトルの補間を行うことを意味し､ このV解釈定数を使用することができます｡
‫そのため､ このライブラリファイルにも用意されている他の補間関数とは異なり､ V解釈と呼ばれています｡
‫では､ どのような使い方をするのかを見てみましょう｡
‫まず最初に､ ドキュメントからinclude行をコピーし､ CPの移動に移動して､
‫tickコンポーネントの本体にこれを実装したいと思います｡
‫しかし､ 彼らは､ 我々はティックコンポーネントの本体内に含まれていないを含む｡
‫インクルードを全てファイルの先頭で行う必要があります｡
‫そこで私のは､ ムーバHのincludeの後に入れることにしています｡
‫そこで､ 数学､ フォワードスラッシュ､ 非現実的な数学ユーティリティのために入れて含めることにしています｡
‫H 次に､ この関数をティックコンポーネントの中で実際に使ってみましょう｡
‫すでに入れたコードを消してしまいましょう｡
‫計算する｡
‫なぜなら､ 他のアクターに対する関数の呼び出し方を理解するために､ それを使っていたからです｡
‫スクロールアップすると､ F Mass Colon, Colon V Intercept, constant two
‫と表示されています｡
‫そこで､ このコロン演算子でF mathクラスの内部を調べ､ すべてのmathユーティリティを一緒に整理しています｡
‫そこで､ F算をすることになる｡
‫コロン
‫そして､ 先ほどこのファイルに含めたヘッダーファイルに含まれる､ さまざまな数学関数に対するオートコンプリートが表示されているのがわかります｡
‫ですから､ この中にある面白いものを見てみてください｡
‫補間や円弧補間など､ いろいろなものが見られます｡ しかし､ Vの解釈定数が欲しいので､ Tabキーを押してそれを完了し､
‫いくつかの括弧を開くと､ 電流､ 目標デルタ時間､ インターセプト速度で渡す必要がある引数を見ることができます｡
‫では､ これらを保持するための変数をいくつか作ってみましょう｡
‫まず最初に､ 現在地を表すFベクトルが必要ですが､ これはまだ設定するつもりはありません｡
‫そして､ 目標位置のFベクトル､ そして速度のfloatを取得することになります｡
‫そして､ このムーブメントをどう実現するかは､ 一つひとつ計算していくしかないでしょう｡
‫だから､ 現在の場所は比較的わかりやすい場所になりそうです｡
‫所有するアクターの現在位置を取得する必要があります｡
‫では､ どうすればいいのか｡
‫このセミコロンを等号に置き換えてみましょう｡
‫次に､ get owner pair of parenthesesを行います｡
‫次に､ 矢印をします｡
‫つまり､ 所有するアクターの関数を呼び出して､ アクターの位置を取得し､ 括弧とセミコロンを使って終了させるのです｡
‫これで､ 所有するアクターの現在位置がわかるわけです｡
‫さて､ ターゲットとなる場所はどうでしょうか｡
‫さて､ 私たちはムーブオフセットというプロパティを持っていることを知っているので､ それがここで関係してくることになります｡
‫しかし､ この移動オフセットに元の場所を追加する必要があるのです｡
‫そのためには､ ビギンプレイのオリジナルロケーションを攻略する必要があるわけです｡
‫だから､ それを格納するための変数が必要なのです｡
‫では､ ムーバーHに移動してみましょう｡ どこにも編集はありません｡
‫一度､ うちのUの下に敷いてみることにします｡
‫プロパティは､ Original LocationというFベクトルになりますね｡
‫ここでは何も設定しない｡
‫そして､ ムーバーCPのbegin playに移動して､
‫このコメント行を削除し､ 独自のコードを入れます｡ これは､ 元の位置がget owner括弧矢印get actor位置と同じになるようにします｡
‫さて､ 元の場所をキャプチャーしてプレイを開始したところで､ TTICで使ってみましょう｡
‫そこで､ Tickに移動して､ 目標位置を元の位置と移動オフセットに等しく設定します｡
‫それが目標地点であり､ 最終的には速度になるわけです｡
‫つまり､ 移動距離を移動時間で割ったものです｡
‫ターゲットの位置と元の位置がある場合､ この2つの間の距離を求める必要がありますが､
‫これはFベクトル､ コロン､ コロン距離で行えます｡
‫そして､ 括弧の中に､ 元の場所と目的の場所を渡す｡
‫つまり､ この2つのベクトル間の距離を求めることができる｡
‫そして､ それをムーブタイムと呼ばれる何度も何度もあったもので割っていくのです｡
‫それで､ 移動すべき速度がわかるのです｡
‫そして､ これらを引数として､ Vインターセプトも一定にすることができるようになりました｡
‫まず､ 現在地と目標地点を指定する必要があるわけです｡
‫次に､ tickコンポーネントのパラメータであるDelta timeを指定します｡
‫だから､ それを通すだけでインターセプトのスピードが出るんです｡
‫この行の最後にセミコロンを付けると､ これが実質的に新しい場所となります｡
‫そこで､ このクールに等しいnew locationという新しい変数Fベクトルに格納することにしましょう｡
‫計算しただけでは意味がないので､ 実際にアクターを新しい場所に移動させる必要があります｡
‫というわけで､ そういうことになります｡
‫ゲットオーナーでコールすることになりました｡
‫だから､ ゲタを履かせるんです｡
‫括弧の矢印｡
‫そして､ アクターの位置を設定し､ 新しい位置をこのように渡して､ 行の最後にセミコロンを付けます｡
‫では､ 早速これをコンパイルして､ 動作確認をしてみましょう｡
‫ダンジョンに移動して､ 移動したい壁を選択すると､
‫ムーバーコンポーネントに移動オフセットがあることがわかります｡
‫それから移動時間ですが､ 4秒くらいがちょうどいいと思います｡
‫では､ それを保存して､ 再生ボタンを押して動くかどうか見てみましょう､ だから動かないんです｡
‫そして､ 出力ログに「アクターのモビリティが静止に設定されているため､ 移動できない」というエラーがあります｡
‫そこで､ もう一度アクタを選択して､ そのモビリティ設定を見ると､ 実際には静的メッシュコンポーネントのモビリティ設定が表示されています｡
‫そこで､ スタティックメッシュコンポーネントを選択し､ モビリティを見ます｡
‫静止画に設定されているのがわかりますが､ これは基本的に動くことを許さないという意味です｡
‫移動させたいので､ これをmovableに切り替えてから､ 再生ボタンを押してみましょう｡
‫これで､ 壁が下がっていたのが暗闇の中でもわかるようになり､ 完璧です｡
‫この柱の上にも､ 動かそうとしているものがあると思うんです｡
‫だから､ それはやめましょう｡
‫テストのために追加したムーバーコンポーネントを削除してみましょう｡
‫今､ 再生ボタンを押すと､ 壁が目的の場所に降りてくるはずです｡
‫では､ 私たちが作ったブーリアンを使って､ あなたの財産を動かすことに挑戦してみましょう｡
‫そこで､ 適切なif文と適切なコードで包んで､ そのブール値が真のときだけプラットフォームを動かすようにするのです｡
‫そして､ コードを再コンパイルして､ F8を使って再生とイジェクトを行い､ ブール値を変更して､
‫そのブール値をチェックしたときに動くかどうかを観察するのです｡
‫それでは､ ビデオを一時停止してご覧ください｡
‫なるほど｡
‫お帰りなさい｡
‫では､ このティックコンポーネントに関するものを､ スーパーではなく､ これからやることすべてをif文で包んで行きましょう｡
‫括弧の中に入っているので､ このコードがif文の中だけで実行されることを示すために､
‫一段インデントすることを忘れないようにします｡
‫コントロール・オールF11を読み込んでコンパイルし､ 再生ボタンを押して､ マウスをキャプチャしていればF8を押してイジェクトできるようにするのです｡
‫それから､ 異常値を見てみましょう｡ 壁を見つけるか､ シーン内をクリックして､
‫コンポーネントを移動するを選択して､ 移動するをチェックすると､
‫壁が移動しはじめます｡
‫素晴らしい内容です｡
‫それでは､ 次回の講義でお会いしましょう｡