みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

ちょっと変わった形のゲージをメッシュで作る《おまけ編》

やっぱり下敷きとか枠が無いと完成した感じがしないので作ってみます。

 とその前に、前回の記事で満タンを 1.0 に、空っぽを 0.0 という仕様にしていたので、見た目にゲージが見えないのに、まだ「ある」状態が起こる仕様になっていました。いわゆる「表示バグ」というやつで、プログラマにとって迷惑極まりないやつです。

 修正方法は以下。

f:id:hiyokosabrey:20180610165946p:plain

 テクスチャの端から端までスクロールさせない場合はLerpノードが便利。

f:id:hiyokosabrey:20180610195911p:plain

Lerpノードを使うと受け取る値の範囲は0~1で変わらないので、プログラマに気づかれる前に直せればセーフ!プログラムの修正は不要!

 

Lerpノードの Bのピンにつながっているのは、0.99609375 という値です。(丸められてすべての桁が表示されていません)どこから来た数字かといえば、テクスチャの中のゲージ自身の長さが 510px で、移動量も510px動くと見えなくなるからで、

f:id:hiyokosabrey:20180610194904p:plain

(ちょっと見にくいですが上図の赤い枠がUV頂点の範囲です。)

510をテクスチャのサイズで割るので、 510 ÷ 512 = 0.99609375 というわけです。

なぜ 510 かは、前々回の記事にて書いています。

 

ちなみに、ゲージの長さが 510pxでテクスチャサイズが 1024pxだったりすると、

512 ÷ 1024 になるので、 スクロール範囲は 0.0 ~ 0.498046875 になります。

 

0.0 で満タン、 0.99609375 で消える

これを Lerpノードにセットして、Alapha ピンに入ってくる 0.0 ~ 1.0 によって線形補間の結果が出てくるという訳です。

 

 

 表示バグも直ったので、

まずは簡単な下敷きとして、テクスチャを2枚使う方法を紹介しておきます。

こちらの方が解像度に対してエッジのアルファを調整しやすいのとゲージが無い部分も表示されるのでオススメなんですが、下敷きと合わせたり別のゲージを重ねるのは難しくなります。 

f:id:hiyokosabrey:20180610162441p:plain  ← 8x32pxのグレースケールテクスチャを用意。

Tiling Method は Wrap です。

 

マテリアルの Opacity ピンにつなぐだけです。

f:id:hiyokosabrey:20180610163618p:plain

このようになります。

f:id:hiyokosabrey:20180610163753j:plain

 

背景に来る色によっては見えにくくなるので、やっぱり枠はあった方がいいよねってことで、 ゲージの下敷きと兼用で外側に枠をつけます。 

今回は ゲージのメッシュからフチドリを生成します。

ではさっそく Blender  ゴー!

 

まずゲージのメッシュを複製します。

そして ぐるっと辺を選択したら、

f:id:hiyokosabrey:20180610224012p:plain

選択 > 辺ループ を使うと楽です。あとはShiftキーを押しながら右クリックで追加選択できます。

1周選択できたら「個々で押し出し」します。

f:id:hiyokosabrey:20180610223319p:plain

カメラを斜めから見下ろす感じにしてから、実行すると押し出す方向がよく見えます。押し出し中(指を離すまでの間)に Ctrl キーを押すと押し出す方向をある程度拘束できるのでまっすぐ下に伸ばしやすくなるのですが、見る角度によっては斜めになってたりします。

そこでおすすめの方法がこれ。

押し出し実行直後、勝手にマウスドラッグに追随するので、いったん右クリックで切り離します(移動が無かったことになるだけ)、そのままビューの中の青矢印(Z軸)をドラッグするとまっすぐ移動ができます。

(この辺の不思議オペレーションがBlenderから人を遠ざけている気がする・・・)

 

いくらか押し出したら、エッジの選択は解除しないままで、ビューを戻します。 テンキーの[7]と[5]で「トップ・平行投影」にします。

そして、トランスフォームの中にある、収縮/膨張を実行します。

f:id:hiyokosabrey:20180610210626p:plain

f:id:hiyokosabrey:20180610223529p:plain

最初は少し歪んでいるので、ツールのオプション設定にある均一オフセットのチェックを付けて有効にすると上図のようになります。

f:id:hiyokosabrey:20180610211157p:plain

この操作は平面ポリゴンの外側にベベルを付けたいときに使えます。

オフセットの値をフチドリの幅に合うように調整します。

 

オブジェクトモードに切り替えて、

f:id:hiyokosabrey:20180610211844p:plain

Z軸スケールを0にしてつぶします。

f:id:hiyokosabrey:20180610211951p:plain

ぺちゃんこですが法線を維持しているので不思議な見た目です。

オブジェクト > 適用 > 拡大縮小

で形状はそのままに スケールを 1.0に戻します。

f:id:hiyokosabrey:20180610212141p:plain

 

 メッシュの状態はこのようなってます。

f:id:hiyokosabrey:20180610224206p:plain

 これに貼るテクスチャを用意します。

f:id:hiyokosabrey:20180610230620p:plain ← 32x32px

これをBlenderに持って行っていきます。

新しくマテリアルとテクスチャを作ってセットしたらUV編集するのですが、フチドリの部分のUV頂点が重なっているので、まずこれをほぐします。

 

レイアウトをUVEditingに切り替えたら、

右側のビューで、Ctrlキー押しながら左ドラッグで頂点をいくつかまとめて選択しつつ、左側のビューで[W]キーを押して 「溶接」 を選択します。

f:id:hiyokosabrey:20180610231844j:plain

f:id:hiyokosabrey:20180610232001p:plain

すると UVの頂点が1か所に束ねられるので、今度は[G]キーを押して移動させます。ちなみに選択解除は[A]キーでできます。

これを繰り返してざっくりとまとめます。

f:id:hiyokosabrey:20180610233043j:plain

 ゲージの端を整えるために辺を増やします。

「ナイフ」ツールを使います。

f:id:hiyokosabrey:20180610234347g:plain

一つ目は既存の頂点をクリックして、あとは適当にメッシュの外でクリックしたら、[Enter]キーで確定。

まっすぐにしたいので、最初に選んだ頂点とX軸の値をコピペで合わせます。

f:id:hiyokosabrey:20180610234937p:plain

ちょっと面倒だけど、テクスチャのサイスがとても小さく済むので頑張ります。

f:id:hiyokosabrey:20180610234828p:plain

切ると言っても、頂点と辺を増やしているだけです。

f:id:hiyokosabrey:20180610235358p:plain

もう一方の端も同様に処理したいのですが、辺が斜めなので、コピペが使えません。

ナイフツールで2か所目のクリックでなるべく水平になるようにします。

f:id:hiyokosabrey:20180610235643p:plain

たまたま、X軸のラインがあるので分かりやすいです。

 

再びUV編集です。

頂点が増えているので、また束ねます。

f:id:hiyokosabrey:20180611000022p:plain

最終的にこうします。

f:id:hiyokosabrey:20180616114318p:plain

さらに反対側の端のUVも

f:id:hiyokosabrey:20180616114400p:plain

重ねて

f:id:hiyokosabrey:20180616114258p:plain

出来上がり。

 

さっそくUE4に持っていきます。

テクスチャもインポートして、マテリアルを作ったらメッシュにセットします。

f:id:hiyokosabrey:20180611002149j:plain

問題なさそうなので、前回のブループリントに追加します。

f:id:hiyokosabrey:20180611003358p:plain

同じようにスタティックメッシュコンポーネントを追加して、Detailsタブから用意したメッシュをセットします。

f:id:hiyokosabrey:20180611003701j:plain

おっと、表示順がおかしいので、設定を変更します。

半透明のオブジェクトは専用の優先順位で管理します。

Detailsタブから sort で検索します。

f:id:hiyokosabrey:20180611004006p:plain

Translucency Sort Priority は数値の大きい方が後に描かれます。また体力のような常に手前に描かれるものは、エフェクトなどの半透明に負けないように大きな値を入れます。シーン内で干渉し合わないように注意が必要です。

f:id:hiyokosabrey:20180611004430j:plain

いい感じになりました。

 

一応完成ですがせっかくなんで、もう少し遊んでみます。

 

テクスチャを改造します。

f:id:hiyokosabrey:20180608214046p:plain

これをグレースケールにしてサイズもタテ方向だけ小さくします。

f:id:hiyokosabrey:20180611234609p:plain

512x8 です。(↑白い部分がこのページの背景に溶けるので枠線を付けてます)

右端はそのまま 2px の黒い部分があります。アルファチャンネルは無しのグレイスケールです。

 

これとカラーのテクスチャ。

f:id:hiyokosabrey:20180611234900p:plain ← 16x32 (実寸)

これもアルファチャンネルは無しです。

あとは、先の説明で使ったアルファ用のテクスチャ。

f:id:hiyokosabrey:20180611235226p:plain  ← 8x32 (実寸)

(↑白い部分がこのページの背景に溶けるので枠線を付けてます)

テクスチャは以上。

これをインポートしてマテリアルに持っていきます。

 

f:id:hiyokosabrey:20180612000320p:plain

TexCoordinate ノードが2つありますが、上の方は設定値を変更しています。

f:id:hiyokosabrey:20180612000541p:plain

左上の Static Switch Parameter ノードはこのままだと固定された状態(初期値一択)ですが、マテリアルインスタンスにすると、値を変更することができます。

f:id:hiyokosabrey:20180612001141p:plain

名前に Static が付いている通り、動的に変化させることはできません。

このマテリアルの初期状態は緑色になるように値をつないでおきます。

マテリアルができたのでマテリアルインスタンスを作ります。

コンテンツブラウザからこのマテリアルのアイコンで右クリックすると一番上にある Create Material Instance を選択。

f:id:hiyokosabrey:20180612002250p:plain

ダブルクリックすると、パラメータが触れるようになってます。

f:id:hiyokosabrey:20180612002429p:plain

 

マテリアルは一式揃ったので、ゲージのブループリントにゲージのスタティックメッシュコンポーネントをもう一個追加します。

f:id:hiyokosabrey:20180612002754p:plain

ゲージのメッシュと、できたばかりのマテリアルインスタンスをセットします。

全部同じ位置で重なってるので、Translucency Sort Priority で表示優先を調整します。

↓重なり順のイメージ。

f:id:hiyokosabrey:20180612003150p:plain

メッシュがセットできたら、

Construction Script で、赤いゲージ用の ダイナミックマテリアルインスタンス MID_Damage を準備しておきます。

f:id:hiyokosabrey:20180612003653p:plain

 

新しくゲージを初期化する関数を用意します。

f:id:hiyokosabrey:20180612003856p:plain

この関数を、Event Begin Play につなぎます。

f:id:hiyokosabrey:20180612004044p:plain

満タンでスタートしたいので 1.0 を引数として与えています。

 

Event Tick につないでいた部分を改造します。

f:id:hiyokosabrey:20180612004632p:plain

ScalarParameterValueノードにつないでいた MID_Vital は MID_Damageに入れ替えています。

 

値を受け取っていたイベントも改造します。

f:id:hiyokosabrey:20180612005035p:plain

ゲージのブループリントはこれで完成です。

 

レベルブループリントも改造します。

f:id:hiyokosabrey:20180612005304p:plain

スペースキーを押すたびに、0.01~0.1 の範囲のランダムな値でゲージを減らしていくようにしました。

 

では再生してみます。

f:id:hiyokosabrey:20180612010026g:plain

よしよし。

メッシュの頂点数は結構使ってるので、テクスチャはものすごく節約しました。

 

一応 Inverse Lerpノードを説明しておきます。

f:id:hiyokosabrey:20180612010926p:plain

 これは Lerp とは逆に作用するノードで、「今どのへん?」というのを割合で返してくれます。

上の場合0~2500 の中で、 2200はどの辺に位置しているのか、が分かります。

 

上限や下限が変動するような場合などに特に効果を発揮します。

 

オマケなのになかなかのボリュームになってしまいましたけど、いかがだったでしょうか?

テクスチャの節約ができるので、テクスチャ容量が厳しいときは、メッシュで作れるといいのですが、UMGのようにポストプロセスから切り離した描画が難しいので、カラーの調整が悩ましいところです。

 

今回はこの辺で

ではでは

ステキなゲージライフを!