記事一覧

2015年12月11日金曜日

【Unreal Engine】デカールを使用して血しぶきを作成する

今回はデカールを使用して血しぶきを表現してみたいと思います。

デカールとは簡単に説明するとテクスチャやマテリアルを使用たシール的なものです。
そのシールを使って自分の作成したメッシュモデルにサビとか汚れを表現することも可能なのでUV展開してテクスチャを割り当てたんだけど、汚れや傷が欲しかったなぁとういう場合にも活用出来ます。

さて、今回は血しぶきという事で絵の具をこぼしてしまった時のような白黒のテクスチャを用意しました。

まず作成方法はベースカラーマップ、マスクマップ、ノーマルマップを用意します。

血の色合いがよくわからないのでRの値を取り敢えず1に設定しておき、用意したベースカラーマップをOnMinusで反転させてオパシティにつなぎます。
こうすることにより、白くなっているしぶきのアルファ抜きが可能になるので、血の透明度を表現できます。ちなみに1の時が不透明で、0の時が透明になります。

続いてマスクマップのRピンをラフネスにつなぎます。 今回のマスクマップではRピンにはラフネスマップ、Gピンにハイトマップの情報が埋こまれています。

ちなみにマスクマップに含まれるR情報が少ないですが、このぐらい散らばっていたほうが血の反射の均等性が無くなるので良いと思いました。

最後にノーマルマップで血の凹凸を擬似的に表現します。
ここらへんもパラメーター等で改良していくのもありです。



取り敢えずラフネス値だけをパラメーター化して血の粗さや反射具合をレベルで確認しながら調節していきます。
ちなみにマテリアルインスタンスはコンパイルの必要がないのでリアルタイムで表現が可能です。



実際に自分の作成したメッシュに貼り付けてみました。
スカイライトありだと血の色合いが薄まってしまい中々リアルに見えないですね・・・
それどころかノーマルマップでの凹凸とラフネスマップによる反射の効果も全然見られなく、ただ単にベースカラーマップを貼り付けただけの質感って感じになります。



こちらがスカイライトを排除し、ディレクションライトのみでライティングを行った結果。
擬似的な凹凸と、ラフネスによる表面の粗さはスカイライトの方よりかは表現できていると思います。
やはり、リアルな血しぶきに見せるためには色合いを補正したり、テクスチャが伸びきっているようにも見えるのでディティールマッピングを行う必要性が出てきますね。

2015年12月5日土曜日

【Unreal Engine】レベル内に配置してある梯子を登れるようにする処理

レベル内に配置してある梯子を対象のプレイヤーに登らせる処理をご紹介します。



①最初に、Maya等で作成した梯子のモデルを用意してレベル内に配置します。



②梯子アクタを選択してOnComponentBeginOverlapを用意し、対象のプレイヤーが梯子のCollistionに触れたら、Booloean型のIsMoveに値をセットします。

③Uキーを押したら、IsMoveがセットされている事を確認し、もしセットされていれば真の方にパルスを流します。

④GetPlayerpawnでプレイヤーの情報を取得し、更にGetActorLocationでアクタの位置情報を取得します。

⑤ ③で行った処理でパルスが流れてその先のノードがSetActorLocationなので位置情報を代入するので、ここではZ値の100がセットされます。

⑥更に梯子に登っている際はその位置を固定したいのでGravityScaleで無重力状態にするので0にします。

⑦最後にOnComponentEndOverlapで梯子Collistionからプレイヤーが離れたらisMoveの値が解除され、重力も1にしてデフォルトに戻るようにしました。




アニメーションがあるとよりリアルな動きを再現できますが、今回は無しで・・・
それと、今回はレベルブループリントで実装しましたが、本来であればクラスブループリントでやりたかったのですが、キー操作が反応しなかったためできませんでした。

解決法をご存知の方がいれば教えていただきたいです。

2015年12月4日金曜日

【Unreal Engine】Trigger内にプレイヤーが触れて かつ Eボタンを押すとMessageが表示される機能 

こんにちは、Unreal Xiです。

今回は、Trigger内にプレイヤーが触れて かつ Eボタンを押すとMessageがスクリーン上に表示される機能をご紹介いたします。

先に断っておきますが、クラスブループリントでこの処理がなぜかできなかったのでレベルブループリントで作成しました。
原因が分かり次第次第報告させていただきます。



早速プログラムを組みます。

まず初めに、Actor型のクラスブループリントを作成し、BoxTriggerを用意します。

次にビューポートにそのクラスブループリントを任意の場所に配置し、そのアクタを右クリックしてOnActorBeginOverlapとOnActorEndOverlapを用意してください。

恐らく選択と同時にレベルブループリントが用意されます。


OnActorBeginOverlapの処理を最初に行います。
今回はMP5_BP(プレイヤー)のキャストノードとButtonCollisionTriggerを繋げ、チェックを入れます。
こうすることにより、OnActorBeginOverlapにプレイヤーが触れた時にButtonCollisionTriggerに代入されます。

そして、その状態でEキーを押せばブランチでButtonCollisionTriggerが取得されてるかどうかを判断し、されていれば押されましたと表示されます。

最後にOnActorEndOverlapでCollistionからプレイヤーが出たら、ButtonCollisionTriggerが代入されなくなるようになります。




説明が下手ですみませんが、以上で終わりになります。
分からない点があれば、コメントにて教えてもらえると幸いです。