もんしょの巣穴blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[UE4] マテリアルのTimeノード

今回は個人的に気になったのでマテリアルのTimeノードについて調べてみました。
Timeノードはマテリアルで経過時間を取得する命令ですが、そもそもこの時間とはいつからの時間なのか?単位は何なのかわかりません。
UE4のドキュメントにも、時間の推移をマテリアルに渡す、としか書いてありません。
というわけで調べてみました。

調べる方法はソースコードを読むより試したほうが早いだろうってことでマテリアルを作って試しました。
まず、以下のマテリアルを作成し、このマテリアルを貼ったオブジェクトをレベルに配置しました。

ue230.jpg 

Timeを1/10して、1.0になったらエミッシブが赤くなります。
UE4ではたいていの時間の単位が秒ですので、Timeノードも同様であれば10秒で赤くなります。
また、予想としてはアプリ開始時からの時間と思われるので、実行して10秒後に赤くなればこの予想も的中です。

で、試した結果はビンゴ。
Timeノードは単位が秒で、アプリ開始時からの時間を計測していると考えられます。

しかし他にも可能性はあります。
1つはマテリアルを使ったオブジェクトの生成時から時間という可能性です。
オブジェクトはレベルに配置されていたため、この時間はアプリの開始時間とほぼ同じです。
というわけで、今度は以下のようにレベルBPを作成し、アプリ開始から5秒後に配置しているオブジェクトとは別のオブジェクトを生成してみました。
生成したオブジェクトも前述のマテリアルを適用済みです。

ue231.jpg

結果は同時に赤くなりました。
オブジェクトの生成時間はTimeノードに影響を与えません。

しかし、同じマテリアルアセットだったから同じTimeノードの結果になったのでは?
というわけで今度は別のマテリアルアセット、加えてDynamic Material Instanceも試してみました。

結果は前回のものと変わらず。
マテリアルアセットの違いやInstanceの違いもTimeノードには影響を与えません。

最後はレベルです。
アプリの開始=レベルの開始ですので、今の状態ではTimeノードがアプリ開始からの時間かレベル開始からの時間かわかりません。
そこで、OpenLevelを使って別のレベルに移動、そこのレベルにも前述のオブジェクトを配置してみました。

結果はビンゴ!
レベルが移動するとTimeノードの結果はリセットされ、0から再カウントされました。
StreamLevelではどうかと試してみましたが、こちらはカウントがリセットされませんでした。

結論!
マテリアルのTimeノードはPersistentレベルの開始時からカウントされ、単位は秒!

さて、これだとちょっと困ることもあります。
UVスクロールやエミッシブの明滅などをTimeノードで実装した場合、同一レベルに配置された複数のインスタンスにおいて同じタイミングでスクロールや明滅が発生することになります。
例えば炎の明滅がすべて同じタイミングで発生していたりすると、はっきり言って違和感が出てきてしまいます。

これを解決する方法はいくつかありますが、一番簡単な方法を続きからで紹介しています。
ついでに、おまけのマテリアルも。

[[UE4] マテリアルのTimeノード]の続きを読む
スポンサーサイト
  1. 2014/11/16(日) 17:06:43|
  2. UE4
  3. | トラックバック:1
  4. | コメント:0

[UE4] キャラクターを泳がせる

CharacterアクターにはSwim能力、つまり泳ぐ能力が存在しています。
Characterアクターの記事でSwimについても書こうと思っていたのですが、いろいろと準備が必要だったりするので別枠で記事にすることにしました。

CharacterアクターをSwim状態にするにはFly状態と同様にMovementModeを直接変更する方法があります。
しかしこの方法ではほぼ意味がありません。
泳ぐには場所が必要で、地面の上は当然泳ぐ場所ではありません。
重要なのは泳ぐ場所を作成し、そこに入ったら泳ぐ状態にすることです。

そこでまずはプールを作りましょう。
FirstPersonテンプレートから新しいレベルを作成し、プールを作成してみました。

ue216.jpg

ただの四角いプールと真ん中に床を置いています。これらはコリジョンが存在しています。
水を表現するためのモデルは薄めの板で、これはコリジョンを設定していません。
また、この板は影を落とさないようにする必要があります。そうしないと水中が真っ暗になってしまいます。

プールは作りましたが、これはあくまでも見た目だけの話。
水の板なんかはほんとにただの板ですので、これだけではCharacterは泳いでくれません。
Characterを泳がせるにはPhysics Volumeを用います。

ue217.jpg 

これをレベルに配置し、以下のようにプールと水面に合わせて大きさを調整します。

ue218.jpg

ある程度ののりしろはつけておきましょう。

Physics VolumeはCharacterMovementに対して影響を与えるVolumeです。
Detailsパネルの以下の2つがSwimに関するパラメータとなります。

ue219.jpg 

Water VolumeをONにするとこのVolumeに入った段階でCharacterはSwim状態に遷移します。
Volumeから脱出するとSwim状態から別の状態に遷移しますが、以下の場合にはSwim状態から強制的に遷移します。

・Jump命令でジャンプを行うとFalling状態へ遷移します
 地面に着地するとWater Volume内であればSwim状態へ遷移します

・Fly状態に強制的に遷移するとSwim状態からFly状態へ遷移します
 再びWater Volume内に入るとSwim状態へ遷移します

Fluid Frictionは水の抵抗です。
大きな値であればその分水の抵抗が増して移動が遅くなったり慣性が効きにくくなります。
ただ、デフォルトではSwim状態での慣性が強く効きすぎるのである程度大きくしておいた方がいいかもしれません。

さて、実はこれだけでSwim状態は実現できます。
しかし、これだけではあまり泳いでいるように見えません。
本来であればモーションも加えたいところなのですが、今回は残念ながらそうもいかないので最低限操作とポストプロセス程度は泳いでいるっぽくしようかと思います。


[[UE4] キャラクターを泳がせる]の続きを読む
  1. 2014/11/01(土) 12:05:38|
  2. UE4
  3. | トラックバック:1
  4. | コメント:0

プロフィール

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。