もんしょの巣穴blog

スポンサーサイト

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

[UE4] Blueprint Interfaceを使って依存度を下げる

 今回はBlueprint Interfaceを紹介して、その重要性を非プログラマにもできるだけわかりやすいように解説したいと思います。
プログラマであれば重要性を理解しやすいと思うのですが、プログラムはとんとわからないという人には説明しづらい部分でもあります。
ただ、ある程度の規模の開発を行っていく上では知っていると知らないとではかなり開発効率に差が出てくると思います。
なので、是非使っていきましょう。

ではまず、Blueprint Interfaceを使用しない場合にどのような問題が発生するかを実際のプロジェクトで見てみましょう。
Blankプロジェクトを作成したら新規のBlueprintを2つ作成してください。
"BP_A"、"BP_B"という名前を付けて両方とも編集画面を開いてください。
次にそれぞれのBlueprintに関数を作成します。
BP_AにはActorを引数とする関数"Test"を作成し、BP_BにはActorを引数とする関数"Test"と引数も何もない"Test2"を作成します。
ここまで来たら一旦両方ともコンパイルしましょう。

次に関数の内容を作成していきますが、内容は、BP_BのTest関数からBP_AのTest関数を呼び出し、BP_AのTest関数からBP_BのTest2関数を呼び出すという、行ってこいの関数呼び出しを行います。
各Test関数の引数は対になるBPが入ってきているものと仮定するのでキャストを行って成功したら呼び出す、という形をとります。
簡単ではありますが、一応関数の実装を張り付けておきます。

ue080.jpg
(BP_B.Test)

ue081.jpg
(BP_A.Test)

ue082.jpg 
(BP_B.Test2)

呼び出す順番に並べてあります。

さて、ここまでできたら両方ともコンパイルしましょう。
BP_Aをコンパイルし、BP_Bをコンパイル。
BP_Bをコンパイルしたらもう一度BP_Aのウィンドウを見てください。
コンパイルボタンがチェック状態ではなく編集後の状態になっていることがわかるはずです。
コンパイルし忘れたかな?と思ってもう一度BP_Aをコンパイルし、BP_Bのウィンドウを見るとこっちもチェックが外れています。
わかりやすいのはこの状態で両方とも保存し、BP_BをコンパイルすればBP_Aに米印がついて編集された扱いになるでしょう。

なぜこのようなことが起こるのか?
それは、それぞれのBlueprintが相手をキャストして直接使用しているからです。
BP_Bがコンパイルされ変更されたとするなら、それを直接参照しているBP_Aも変更された可能性がある、と考えられてしまうわけです。
このような状態を『依存が強い』などと呼び、オブジェクト指向プログラミングにおいては出来るだけ避けないといけないものになるのです。

UE4ではこの状態でPlayボタンを押すと実行するまでのラグが普通より長くなります。
すべて保存している状態で実行するとわかるのですが、依存の強いものに編集後を示す米印が付きます。
UE4は実行時にある程度コンパイル的なことをしているのか、別のBlueprintに依存しているBlueprintが編集された扱いになってしまうようです。
これが実行に時間がかかる要因で、複雑に依存しまくってると結構実行までに時間がかかるようになります。
…経験者は語る。

と、ここまでが今回の話の前座。
BP間のやり取りは完全になくすことはできません。やはり、何らかのやり取りは行わなければなりません。
C++で実装されているものは固定的なものなので、問題がなければC++に移すのも1つの手です。
しかしそういうわけにはいかない場合に使えるのが、今回紹介するBlueprint Interfaceです。

[[UE4] Blueprint Interfaceを使って依存度を下げる]の続きを読む
スポンサーサイト
  1. 2014/05/28(水) 22:59:01|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] Dynamic Material Instanceを使う

前回、UE4のマテリアルの解説とマテリアルインスタンスを使用したパラメータの固定をやってみました。
今回はここからもう少し話を先に進めてDynamic Material Instance (動的マテリアルインスタンス) をやってみようと思います。

UE4においてマテリアルはマテリアルのロジックを記述するための代物といえます。
この数値とこの数値をどう計算するか、とか、どの結果をどこに入力するか、といった部分をマテリアルで記述します。
マテリアルの変更はシェーダのコンパイルが走るため、決して軽くはありません。

そこでマテリアルインスタンスが登場しました。
マテリアルのロジックではなく、数値や色、テクスチャといったパラメータをマテリアル側で変更可能な状態とし、そのパラメータだけを変更して固定するのがマテリアルインスタンスでした。
ロジックは同じだけどテクスチャだけが違う2つのメッシュが存在する場合、テクスチャだけが変更されているマテリアルインスタンスを2つ作ってそれぞれのメッシュに設定してやるのが基本です。

しかし、これだけでは対応できない場面というものも存在します。
例えば、こんな場面を想像してください。
3Dモデルのクリボーが2体存在します。どちらも同じマテリアル、同じメッシュが使われている全く同じものですが、Actorのインスタンスは別に2つ存在しています。
このクリボーはファイヤーボール1発では倒せず、何発か撃ち込んで倒すことができます。
ファイヤーボールが当たるとクリボーは白く点滅します。ヒットフラッシュとかダメージフラッシュとか呼ばれる手法ですね。
もちろん2体のクリボーは別々のActorなのでダメージ処理も別々です。片方がダメージを受けてももう片方はダメージを受けていなかったりします。

これをマテリアルインスタンスで対応しようとすると非常に面倒なことになります。
マテリアルインスタンスはアセットに1つだけ存在するものなので、これを変更してしまうとすべてのクリボーがフラッシュしてしまいます。
対応するためにはマテリアルインスタンスをActorの数だけ作るという方法もあります。
しかし、Actorの数があらかじめ決まっているのならともかく、そうでない場合は数えきれないくらいのマテリアルインスタンスを作ることになってしまいます。

そこで登場するのが今回の動的マテリアルインスタンスです。
動的マテリアルインスタンスはメッシュアセットに設定するものではなく、ActorのコンストラクションスクリプトなどBPかC++で設定します。
特にコンストラクションスクリプトで生成できるようであれば話は簡単ですが、今回はLevelBPのBeginPlayイベントで特定Actorのみ生成という形をとりました。
本来はこのような使い方はしないと思います。

では、実装方法を見ていきましょう。

[[UE4] Dynamic Material Instanceを使う]の続きを読む
  1. 2014/05/14(水) 00:51:45|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] マテリアルを作成してみる

今回はオブジェクトサーフェイスを彩るマテリアルを作成してみたいと思います。
ついでに、簡単ではありますがUE4のマテリアルの基礎についても説明しようと思います。

ただ、英語が読めるようでしたらこちらのドキュメントを参照していただく方がよいかと思います。

https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/index.html

また、より詳しい情報としてはこちらのブログが参考になるのではないかと思います。

http://d.hatena.ne.jp/hanecci/20130727

ただしこちらはシェーディングにある程度詳しくないとちんぷんかんぷんな内容かもしれません。
とは言え、わからないなりに頑張ってみたいという方は一度読んでみるとよいでしょう。

さて、今回作成するマテリアルはたぶん日本人なら誰でも最初に作ってみようと思うであろうToon Shaderです。
ライティング結果を2値化することでカートゥーンっぽいシェーディングを行うあれです。
まあ、今回のものは見栄えを良くするための工夫とかは行っていませんし、いろいろ制約も多い方法です。
もっと良い方法があるのかもしれませんが、ソースコードを書き替えずに対応する方法がこれしか思いつかなかったので仕方ない。

では、まずはいつも通りにBlankプロジェクトを作成しましょう。
名前は何でも構いません。


[[UE4] マテリアルを作成してみる]の続きを読む
  1. 2014/05/06(火) 15:21:41|
  2. UE4
  3. | トラックバック:0
  4. | コメント:1

プロフィール

monsho

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

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

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

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