はじめに
猫でも分かるシリーズは次の回を待つとしてオンラインラーニングをやっていきます。
今回は前回に引き続きこちら
実践3. アクターの正確な配置を容易にする
- レベル作成時に多くの時間を節約する方法を学ぶ
- ここでは柔軟性のためにコンストラクションスクリプトが使用できます
- レベル内でのアクターのロケーションの保存と取得を知る必要があります。上軸も決定する必要があります
- Line Trace を使用して一定の距離を上向きに測れるようになると便利です
- 一定の距離内にあるメッシュにのみスナップするようにすることができます。
- 最後に、アクターをライントレースのヒットポイントに移動させることも重要な要素となります。
- ブループリントはビジュアライゼーションレベル自体の構築にも使える
アクタのロケーションを設定する
- コンテンツブラウザでCeiling_Lightフォルダに移動する
- Ceiling_Lightをダブルクリックしてコンストラクションスクリプトを開く
- Scene Rootをグラフにドラッグしてリファレンスを作成
- トランスフォーム情報はRootに格納されている
- ビューポートを確認すると天井に配置するもののため (0, 0, 0)のいちよりも下にメッシュが配置されていることがわかる
- シーンのルートは常にライトオブジェクトの上にあるようにする
- トランスフォーム情報はRootに格納されている
- SceneRootにGetWorldLocationを接続する
- 空いているスペースに Get Actor Up Vector を追加
- ライントレースを向ける方向が必要であり、今回のケースだと上方向にライントレースを向ける為このノードが必要
- Vector * Float ノードを追加し Get Actor Up Vector と接続
- スナップする範囲を定めるためのノード。 100をかけるようにする。
- この100という数値をより大きくすれば上方向へのスナップする距離も大きくなる
- 例えば地面あたりにあっても数値が大きければ天井にスナップする
- この範囲を可視化できる方法はあるのだろうか??
- 最終的なスナップの最大位置を求めるために vector + vector ノードを配置し接続する
- ライントレースは開始点と終了点の入力が必要なため、このような計算が必要となる
- ブランチノードを配置し接続しておけばいつ呼ばれたかが把握しやすくなる
- False は何にもヒットしていないことを示す
- つまり start から end の範囲内にはスナップできそうなものがないことを示す
- False は何にもヒットしていないことを示す
- ライントレースが何にヒットしたかは Result Value に格納されているため、ブランチに接続する
- こうしておけば、ライントレースがヒットを返した時にBranchのテストに渡される
- 何にもヒットしなかった場合に誤ってBPが実行される事を防げる
コンストラクション スクリプトの基盤を作成する
- LineTraceByChannelを追加する
- 接続する
コンストラクション スクリプトをファイナライズする
- ライントレースの生成は完了
- これがどのように3Dワールドでの位置を上書きするか?
- またその上部にあるシーリングメッシュにどのようにスナップするかを確認する
- Break Hit Result を配置し接続する
- Set world location(Default Scene Root)を配置し接続
- 接続する
- ブランチは単純になにかにヒットしていることを返す
- ヒットしている場合 Break Hit Result には何にヒットしているかの情報が格納されておりどこにヒットしているかの情報は Locationにある
- Default Scene Rootの新しい位置を上記の Location に設定することでスナップが実現する
- Default Scene Rootは自動的に配置されているものであり、このグラフの先頭にも同じノードが配置されている。きれいに保つために自動で配置されたものは削除。先頭に配置されているものを接続
コンストラクション ブループリントをテストする
- 設定が終わったためちゃんと動作するかテストします
- コンテンツブラウザに移動
- Ceiling_Lightをコンテンツブラウザからレベルに配置
- 地面付近で移動させても何も起こらないが天井付近だとスナップ(吸い付く)
- しかし一旦スナップしたものは XYはずらせるもののZはずらせなくなる
- ギズモではなく詳細パネルのTransformをいじればZも変えられる模様
実践4. オブジェクトのマテリアルの変更をユーザーから行えるようにする
- チャレンジ1では事前に定義したリストに基づいてエンドユーザーがマテリアルを入れ替えられるようにすることです
- トグルを利用することで単純にしています
- トグルの利用できる範囲を制限する必要があります
- 2つの異なるシステムを制御するために Line Traceを設定します。これは我々が克服する必要のあるものです
- 最後に接近したらわかるような視覚的な手掛かりが必要です。これによってユーザーにマテリアルが変更可能であることを知らせます
アクタのインタラクティブ動作を作成する
- ここではプレイヤーが近くにいるかどうかを判定する仕組みを実装
- SM_MatChange_Static_Meshアクタをダブルクリックして開く
- ActorBeginOverlap, ActorEndOverlapノードをイベントグラフに配置、
- 変数を追加名前は CanUse 型は Boolean にする
- CanUseをSetで2つ配置して接続する
- 椅子に近づいたらテキストが表示されるようにする
- すでにテキストは追加してある模様
- 椅子に近づいたらテキストが表示されるようにする
- interact , Set visibility x 2 を配置しそれぞれ接続
- これで近づくと表示され遠くなると消えるテキストが出来上がり。
マテリアルと通信する
- BPでマテリアルの切り替えを行う
- Custom Event を配置し ChangeMat という名前にする
- ブランチノードを追加
- FlipFlopノードを配置接続
- SM_Chair_LP のリファレンスを配置
- Set Material x 2を配置し接続。
- マテリアルは上を Fabric_White、下を Fabriic_Greenとする
これで椅子のBPは完了
- FirstPerson BPを開く
- Sequenceノードを配置し接続
- これによって Then0 が終わったら Then1 を続けて実行できるようになる
- Cast To SM_MatChangeを配置し、ChangeMatを配置し接続
ブループリントをテストする
- マテリアルの変更ができていること、連打して変わるかなどをテストする
最後に
まだ使ったことないコンストラクションスクリプトが登場しました。コンポーネントの使い方が繰り返しているうちにかなり理解できるようになってきました。
自分用メモ
実践2のまとめで使ったシーケンス図のメモ。
でたらめなシーケンス図なのでいつかちゃんと勉強しなければ
@startuml User -> FirstPersonCharacter : マウスを押す FirstPersonCharacter -> BP_Light_Switch : ライトスイッチイベント BP_Light_Switch -> BP_Wall_Light : スイッチド @enduml
メモ
- AECとはArchitecture, Engineering , Constructionの頭文字らしい。建築、エンジニアリング、建設
- Get Up Vector のドキュメント
- カスタムイベントは他のBPから呼び出し可能で汎用的な用途が多い便利機能
- コンパートメント化(小さく区切る?)は自身とプロジェクト両方にとって利益をもたらす
トレースについて
- 関連ドキュメント
- トレースの概要
- LineTraceByChannelのドキュメント
- Break Hit Result のドキュメント
これはなにか?
- トレースはレベル上でラインセグメントに沿って何が存在するかのフィードバックを集める。
- ラインセグメントにヒットしたアクタがあればレポートする
- トレースは基本的に他のソフトウェアパッケージの例キャストやレイトレースと同様
- トレースでは物理システムを使用する
- トレースは信頼性が高く、演算処理的に負荷が低い
- カスタムイベントを呼び出す場合、カスタムイベントノードに必要な情報は呼び出し対象のリファレンス
使い方
ラインセグメントを定義するため2つのエンドポイント(始点終点)を指定して使用する。
戻り値
- シングルまたはマルチヒットを返す
- Hit Result 何がヒットしたかが格納されている
実践1のまとめ 自動ドア
実践2のまとめ ONOFF可能な壁ライト
- 出てくるBPは3つ
- FirstPersonCharacter (キャラクター)
- ライントレースを行いライトにヒットしていたら Light_Switchイベントを呼び出す
- ライントレースでヒット検知後のCastの意味がわからなかった(ライトスイッチ以外の場合もあるけど大丈夫?と思ってた)がテストしてみると、ライトスイッチ以外をCastしようとすると Cast Filed となる様子。なるほどすっきり。
- BP_Light_Switch (スイッチ)
- どのライトに対してスイッチを作用させるかを選定
- どのライトをスイッチから作用させるか決めるためパブリックでライト配列を持っている
- ライト配列はレベル上で手動で事前定義している
- 選定したライトに対し Switched イベントを送出
- どのライトに対してスイッチを作用させるかを選定
- BP_Wall_Light (壁ライト)
- Switchされたライトに対して強さを設定
- FirstPersonCharacter (キャラクター)
実践 3のまとめ レベル編集時に機能するスナップを実装
- コンストラクションスクリプト(のみ。BPなし)
- レベル編集時に作用するBP。
- 天井付近に天井ライトを配置しようとしたときに付近に天井があったらスナップする
- 実現方法
- Default Scene Root ( アクタが持つトランスフォーム情報) + 上方向に 100 の距離のライントレースを作成
- なにかにヒットしたらヒットした対象のロケーションを取得
- 取得したロケーションをDefault Scene Root のロケーションに設定する
実践 4のまとめ マテリアルの変更をエンドユーザーから行うことを可能とした
– SM_MatChange
– 上段: BOXコリジョンに近づいたら表示・離れたら非表示になるテキスト
– 下段: カスタムイベントが実行されるたびにマテリアルを切り替える
- FirstPersonCharacter
- Sequenceを追加し2つのタスクを順番に実行する用に設定
- Cast To SM_MatChangeからはChangeMatカスタムイベントを呼び出す