みつまめ杏仁

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

3DメッシュでつくるUI ー カーブ利用編2

ちょっと間が空いてしまいましたが、前に書いた記事では、ウィンドウ下敷きのような、そこそこ面積のあるものを描画する場合、テクスチャを節約する目的のメッシュをカーブから作る流れを紹介しました。

カーブを作ってから、いったんメッシュにしてFace(面)張ってから縁取りをするという手法です。

f:id:hiyokosabrey:20211128131230p:plain

 

 

今回はカーブを使って作るメッシュでUVスクロールを楽しもうという内容で書こうと思います。

引き続きBlenderを使います。

f:id:hiyokosabrey:20211016010033p:plain

使用しているのは Ver 2.93.5

 

まずはカーブを用意します。

f:id:hiyokosabrey:20211201225135p:plain

よく見るアレを参考にしました。

 

カーブを追加した際のビューポートのプレーン(面)はで XY です。

テンキーの[7]を押した状態でカーブを作りました。

このカーブをリボン状にするのですが、調整の具合を確認しやすくするために、カメラを斜めから見下ろすアングルにします。

f:id:hiyokosabrey:20211201225611p:plain

ObjectModeで選択しておいて、カーブの設定を変更します。

 

Shape > Resolution Preview U が セグメント間の分割数

Geometry > Extrude がリボンの幅になります。

 

f:id:hiyokosabrey:20211201231029p:plain

Extrude を 0 以上の値にするときしめん状になります。

f:id:hiyokosabrey:20211201232101p:plain

f:id:hiyokosabrey:20211204111127g:plain

値の入ったフォームの上で、マウスの左ボタンドラッグ(左右)すると感覚的に変化を確認できて便利です。

 

メッシュにするまではいつでも幅を変えられます。

メッシュにしても、カーブを残す設定にしておけば、いろんな幅のメッシュを作ることができます。

 

適当な幅に落ち着いたら、この タリアテッレをペタっと寝かすことにします。

 

Edit Mode にしてセグメントをすべて選択します。

f:id:hiyokosabrey:20211201234008p:plain

Item > Transform > Mean Tilt90 にします。

f:id:hiyokosabrey:20211201234314p:plain

f:id:hiyokosabrey:20211201234551p:plain

Tilt はセグメントの傾き(ねじれ具合)を調整します。

ちなみに セグメントを複数選択すると、Mean(平均)Tilt になって、単体だと Tilt です。

フォームの上をマウスで左ボタンドラッグ(左右)すると下図のように動くので、ひねる方向を確認しやすいです。

f:id:hiyokosabrey:20211201235015g:plain

Z軸方向に Extrude(押し出し)されているので、90度傾けると カメラのある側(+Z)がオモテ(表)面 になります。マイナス90度に傾けると ウラ(裏)面になります。

 

ポリゴンには オモテ面 と ウラ面 があるのです。

ゲーム画面では BackfaceCulling(バックフェイス・カリング)といってウラ面を描画しないのがデフォルトになっているのが割とフツーです。このウラ面を描かない設定のことを忘れていて、エンジン等にインポートした際に姿形が見えないと、エクスポート&インポート操作をミスったかと慌てることになります。

UIの場合、ライティングしないことがほとんどだと思うので、インポート後にアサインするマテリアルや描画設定などで、Two Side(両面)描画を有効(もしくはバックフェイス・カリングを無効)にできるので、エクスポート&インポートをやり直さなくても解決できます。

将来的に UIでもライティングするようになると、オモテとウラで色に違いがでるので、面の向きに注意するよう心掛けておくのは良いことです。

f:id:hiyokosabrey:20211204114014p:plain

面の向きを確認する方法はいくつか用意されています。

一番確実なのが  法線 で確認する方法です。法線は "Normal" と英字表記されます。

 

ビュー設定から

f:id:hiyokosabrey:20211204120626p:plain

法線表示と面の向きを色分けを同時に設定することもできます。

f:id:hiyokosabrey:20211204120546p:plain

 

表示してから「あ、逆だった」という場合は法線の向きを逆にするだけで解決できます。

ペラポリゴンを扱う場合にウラオモテ問題はしばしば遭遇すると思われるので、記事にしておこうと思った次第。

 

さてさて

Tilt で 平打ち麺 を寝かせることができました。

ちょっと太すぎたので、Extrude を調整します。

f:id:hiyokosabrey:20211204135519p:plain

よく見るとカーブの曲がり具合が急なところは尖ってるうえに重なりが生じています。

f:id:hiyokosabrey:20211204135720p:plain

設定の、 Resolution Preview U(分割数) と Extrude(幅) の値を調整してみます。

f:id:hiyokosabrey:20211204140848p:plain

分割数を増やしたのでカーブの尖りは丸くなりました。

分割数は、セグメント間を距離に関係なく一律に割るので、密なところとスカスカのところが出てきます。

f:id:hiyokosabrey:20211204141731p:plain

分割数は64が最大なので、分割数を増やすより、セグメントをいい感じに増やしたほうがよさそうです。

 

セグメントを増やすのは、増やしたい区間のセグメントを2つ以上選んで、Subdivide

f:id:hiyokosabrey:20211204220059p:plain

f:id:hiyokosabrey:20211204220632g:plain

 

増えすぎたセグメントは、選択して [Del]キーを押して Dissolve Vertics(頂点を溶解)を選択。

f:id:hiyokosabrey:20211204220954p:plain

f:id:hiyokosabrey:20211204221128p:plain

 

f:id:hiyokosabrey:20211204221823p:plain

いい感じになりました。

直線に見える部分は、メッシュにコンバートしてから削ることにします。

あえて分割数を少なめにして、セグメントを増やすのも有効ではあるのですが、カーブの調整がやりにくくなるのでほどほどでメッシュ化します。

 

Object Mode > Object > Convert > Mesh

f:id:hiyokosabrey:20211204222518p:plain

実行した直後に、画面隅に小さなポップアップが出ています。

f:id:hiyokosabrey:20211204222829p:plain

そこで Keep Original(オリジナルを保持)にチェックをつけると、カーブが残って、新しくメッシュが生成されます。

 

f:id:hiyokosabrey:20211204223357p:plain

名前が同じで、ピリオドの後のナンバーが違うだけのものが新しく増えます。

 

できたメッシュの頂点を整理します。

Edit Mode にして、 選択モードを Edge(辺)にします。

f:id:hiyokosabrey:20211204223753p:plain

ショートカットキーでの切り替えが便利です。

[1] バーテックス(頂点)

[2] エッジ(辺)

[3] フェイス(面)

 

無くしたいエッジを選んで[Del]キー

f:id:hiyokosabrey:20211204224024p:plain

Dissolve Edges(辺を溶解) を選ぶと消えます。

f:id:hiyokosabrey:20211204224402p:plain

ポップアップの上にある、Edges(辺) を選ぶと、見た目にエッジは無くなりますが、頂点は残され、ファイス(面)も消失するので注意。

f:id:hiyokosabrey:20211204224924p:plain

f:id:hiyokosabrey:20211204224915p:plain

ひたすら無駄そうに見えるエッジを消していきます。

 

この作業をするうえで、表示設定の Statistics(統計) を有効すると、モチベーションを高めてくれるのでおすすめです。

f:id:hiyokosabrey:20211204232559p:plain

チェックをつけて有効にするとビューポートの左上に、選択中のアクティブなオブジェクトについての情報が表示されます。

f:id:hiyokosabrey:20211204233113p:plain

自分の頑張りが見える化されているので、この数値がどれだけ減ったかを見て悦に入ることができます。

最近のスペックだと、数十頂点減った程度じゃ焼け石に水で、体感できるほどの効果がでなくなってきました。いいことなんですけど、開発途中の処理上げで、UIを非表示にして、描画あり、なしの差分から UIの描画処理がこんなに!とか言ってドヤ顔してくる輩がいると結構面倒くさかったりします。

 

ぼくは、やらないよりはやったほうがマシ程度のチリツモ教信者なので、劣化がバレないラインを探りながら節制するのをモットーとしております。

 

さてさて

曲線の流れを崩さないように気を付けながら多すぎるエッジを削ってみました。

f:id:hiyokosabrey:20211205151042p:plain

もっと大胆にいけそうな気もしますが、画面に表示される大きさなどと相談しながら判断します。

 

つぎにUV展開していきます。

Edit Mode で頂点かエッジか面をすべてを選択した状態で、

UV > Cube Projection(キューブ投影) を選択。

f:id:hiyokosabrey:20211205155853p:plain

 

ビューポートタイプ を UV Editor に切り替えてUV展開の状況を確認します。

f:id:hiyokosabrey:20211205160327p:plain

 

f:id:hiyokosabrey:20211205161218p:plain

このぐにゃぐにゃのUVをまっすぐにします。

左端のポリゴンを一つ(頂点4つ分)だけ選択します。

f:id:hiyokosabrey:20211205171326p:plain

ヘッダーメニューから

UV > Unwrap > Follow Active Quads(アクティブ四角形面に追従) を選択。

f:id:hiyokosabrey:20211205171919p:plain

確認のポップアップがでるので OKボタンをクリック。

f:id:hiyokosabrey:20211205172818p:plain

Edge Length Mode(辺の長さモード) はデフォルトでOK。大事なのは、四角形ポリゴンのサイズ比率が維持されることです。

f:id:hiyokosabrey:20211205173703p:plain

しゃきーん!

 

このへんでテクスチャを読み込んで、UVのサイズを調整します。

テクスチャはゲームエンジンで組み合わせるので、まずはテクスチャ内の使用範囲を分かりやすくしたアタリだけで十分。

f:id:hiyokosabrey:20211205170948p:plain

512x64 で用意してみました。上部に 512x16 の範囲に青色の四角があるだけです。

縦16px は 4の倍数だったら圧縮耐性が高くなるので、 12 でも 8 でもOK。

 

このテクスチャを読み込みます。

f:id:hiyokosabrey:20211205174253p:plain

Open(開く)ボタンを押してダイアログからテクスチャファイルを選択。

 

テクスチャが読み込まれたら、サイズと位置を調整していきます。

ここで大事な確認が2点。

 

1点目

ヘッダーメニューから

UV > Constrain to Image Bounds(画面の範囲に拘束)のチェックが外れていることを確認して、ついていたら外します。

f:id:hiyokosabrey:20211205161644p:plain

これは、テクスチャの外にまでUVがはみ出さないようにする設定で、とても重宝するのですが、すでにはみ出ている場合は、操作に制限が付きます。なので、テクスチャの中に収まるまではチェックを外しておいて、収まったらチェックを入れるといいです。

 

もう1点は、UVのピクセルにスナップする設定。

こちらもヘッダーメニューから

UV > Snap to Pixelsピクセルにスナップ)

f:id:hiyokosabrey:20211205181919p:plain

これも大変重宝するので、普段から有難く使わせてもらってる設定なのですが、今回のようなUVのサイズ比率が重要で、UVの各頂点の距離が繊細な場合は、ピクセルにスナップされると、繊細さが消えてしまうので、UVが確定するまではDisabled(無効)にしておきます。

 

 

UVの頂点をすべて選択した状態で、[S]キーを押してスケールモードしたら、マウスでスケールを調整します。

f:id:hiyokosabrey:20211205180206p:plain

[S]キーでサイズ、[G]キーで移動 を駆使してなんとかぴったりさせます。

f:id:hiyokosabrey:20211205180629p:plain

上の Constrain to Image Bounds(画面の範囲に拘束)を有効にすると、移動させるときに、雑にマウスを動かしてもテクスチャの端でぴたっと止まるので安心です。

 

これでメッシュは完成です。

StaticMesh(スタティックメッシュ)として、FBX形式とかで書き出してゲームエンジンに持っていくことができます。

 

テクスチャも描いて持っていきます。

f:id:hiyokosabrey:20211205203803p:plain

 

UE4に持っていって、マテリアルでアニメーションさせてみました。

f:id:hiyokosabrey:20211205205942g:plain

f:id:hiyokosabrey:20211205210146p:plainライティングは無し(Unlit)で、加算半透明(Additive)です。

f:id:hiyokosabrey:20211205210425p:plain

 

動画はツイッターに貼りました。

 

今回、テクスチャのタイリング設定を Clamp(クランプ)にして制作しています。

f:id:hiyokosabrey:20211205220858g:plain

 

諸事情で、Clamp設定が使えない場合は、テクスチャに余白を作ることで解決できます。

メッシュのUVをあらかじめスタート位置にセットしておきます。

f:id:hiyokosabrey:20211205230256p:plain

テクスチャの幅が 512px なので、キリの良い ところで3等分して 170px。余りが 2px 出るけどやむなし。

マテリアルで、 170x2 = 340px マイナス方向に移動したらスタート位置に戻すことでクランプ設定のつくりと同じ見た目になります。

f:id:hiyokosabrey:20211205231608p:plain

違いは、テクスチャの作りやすさと、グラデーションの長さによる滑らかさです。

 

ちなみに余白なしでラップ設定にすると、

f:id:hiyokosabrey:20211205233114p:plain

f:id:hiyokosabrey:20211205232838g:plain

余韻がなくせわしない感じになります。

ホントの心拍って結構速いのでこのくらいのほうがリアルかもしれません。

 

テクスチャの内容とUVのあて方次第で、いろんな見せ方ができます。

今回は ソナー風の古典的な表現を目指してみました。

次回はこのメッシュとUVスクロールを使ったネタをもう少し紹介してみようと思います。

シェーダー寄りの内容になりそうな予感。

 

今回はこの辺で。

 

ではでは

ステキな 3DUI ライフを!

 

 

 

 

 

 

3DメッシュでつくるUI ー テクスチャを斬る

前回は、ダイアログウィンドウみたいな大きい絵を作るのに、メッシュを使うとテクスチャ用のメモリを効率よく使えるよ。という内容で書きました。

今回は矩形(四角)で描画すると透明部分の描画処理がもったいないから、メッシュでいらない部分をカットする方法について書こうと思います。

使ったことはないのですが Anima2D 面白そうですよね。SpriteMeshEditor使えばオートでメッシュ化してくれるし。今回の記事で取り上げる操作も、いずれ自動化のアドオンやプラグインが出てきそうです。

 

さてさて

引き続き Blender を使います。

f:id:hiyokosabrey:20211016010033p:plain

この記事で紹介している操作方法に関しては、なるべくショートカットに頼らない操作で進めています。Blenderにおいてもほぼインストール直後に近い状態ですので、不慣れな方でも特に迷わずに試していただけるかと思います。

 

まずはこんな絵を用意しました。

f:id:hiyokosabrey:20211023204018p:plain

白色の部分は基本的に透明になるようにテクスチャを作るのですが、

シンプルに矩形で描くとものすごくもったいない気がしてきます。

f:id:hiyokosabrey:20211023205732p:plain

表示範囲全てが、しっかり計算されるので ■色 のところをうまく削りたいなと。

 

見える見えないは、ピクセルごとのアルファ値で決まるので描こうとするすべてのピクセルでアルファ値の計算が必要です。

 

例えば表示サイズが 1024 x 1024 の場合 1,048,576ピクセル分の処理が行われます。

4Kモニタ解像度だと 8,294,400 のピクセルが存在します。

重ねれば重ねるほど、また解像度が大きければ大きいほど、計算するピクセル量が増えるので描画処理の負荷を見過ごせなくなってゆきます。

 

ポリゴンにテクスチャを貼って描画すると、画面に対してポリゴンのある所しか計算しないので、明らかに透明で不要な部分の計算をカットすることができます。

 

ただ、ピクセルの計算が減ったからといって素直に喜べないというのも事実で、UIでは光源計算など陰影処理とは縁遠いとはいえ、ジオメトリの計算やらバッファへの書き込みやらなんやらで、それなりには計算処理が必要になります。グラフィックチップの性能によるところも大きかったりしますが、精密なキャラクターモデルや、情報量の多いエンバイロメント系モデルをいかに高速に美しく描画するか、またPBRというところに重点を置かれて進化してきているので、UIで扱う頂点数なんて雀の涙にすら足りてないような状態。3DでのUI表現においては心配の種は小さくなっていくと思います。逆に、4Kや8Kとった高解像度方向へ進化が続くと、2Dをメインに扱うUIにとっては、まだまだ気が抜けないのです。

 

前置きが長くなってしまいました

さっそくテクスチャを斬っていきます

Blenderを使います バージョンは 2.93.5

f:id:hiyokosabrey:20211016010033p:plain

 

流れとしては

  1. テクスチャを用意
  2. 四角のメッシュを用意
  3. マテリアルを用意
  4. テクスチャを読み込む
  5. メッシュを分割

となります。

 

起動したら、作業する面に切り替えます。

そこで平面メッシュを追加します。

Object Mode > Add > Mesh > Plane

f:id:hiyokosabrey:20211103142122p:plain

 

XY面で Z軸のプラス方向を向いた状態で生成されます。

 

利用するゲームエンジンや開発環境に合わせて最適な面で作業することになると思いますので、作用しやすいように適宜回転させます。

 

下図は作業面が XZの場合。(テンキーの [ 1 ] )

正面を向かせるために X軸に 90度回転させて適用(Apply)。

f:id:hiyokosabrey:20211103142317p:plain

 

 3Dでのモデルやメッシュといったオブジェクトは、形状を決める頂点の位置情報とは別に、オブジェクトの位置(Location)や回転(Rotation)、拡縮率(Scale)というの情報を持ちます。適用(Apply)するということは、位置や向き、大きさを固定してしまうことです。見た目の状態のままに数値を初期状態にします。

 たとえば上図のように 90度回した状態で適用しないままで扱うと、『常に90度回った』状態なので、0度にすると向きが変わってしまいます。Blender上ではそれほど大きな問題になりませんが、開発環境に持っていった時にいちいち90度回った前提で扱うことになると手間が増えることになるので、この角度でOKとなったら、迷わず適用してしまいましょう。

 適用する前なら、位置や向き、大きさをいくら変えても元の形状は維持されます。

Photoshopでいうところのスマートオブジェクトに少し似ている気がしないでもない。

 

適用(Apply)は、

Object Mode > Object > Apply > Rotation

 

次にサイズを調整します。

画面に表示したい大きさ、もしくはテクスチャサイズ にメッシュを合わせます。

Object Mode でメッシュを選んだ状態で、アイテムパネルを表示します。

[ N ]キーで開閉できます。

f:id:hiyokosabrey:20211103152605p:plain

アイテムパネルを開くと、Transformカテゴリの一番下に、寸法(Dimensions) という項目があります。

m は単位です。初期値ではメートル(Meters) に設定されています。

プレイヤーのすぐ近くに表示される場合は、しっかり合わせる必要が出てきますが、たいていの場合 UI はカメラの距離依存なので、気にしなくても大丈夫です。

ひとまず、m を ピクセルとみなして扱うことにします。

テクスチャが 1024x1024 なので、 1024m と入力します。すべて半角英数です。

1024cm とするとセンチメートルに、 mm とつければミリメートルになります。

f:id:hiyokosabrey:20211103154022p:plain

 作業している面に合わせて入力します。

メートルだと、めちゃくちゃでかくなるので、[ . ] キー(テンキーのピリオド)を押して、ビューポートに収まるようにカメラを引きます。

f:id:hiyokosabrey:20211103155716p:plain

この状態で大きさを適用しておきます。

Object Mode > Object > Apply > Scale

 

前回の記事では UVマッピングしてから、テクスチャを読み込んでましたが、今回は先にマテリアルをアサインすることにします。どちらが先でも問題はありません。

 

+Newボタンの左にある vプルダウンリストを開くと、

デフォルトのマテリアルが用意されているので、それを選択します。

f:id:hiyokosabrey:20211103221641p:plain

 

f:id:hiyokosabrey:20211103222921p:plain

 

 Material をリストから選択すると、パネルが一気に賑やかになります。

上の方にある、Surface のところを変更します。PrincipleBSDF をクリックすると、そのほかのシェーダーを選ぶことができるので、 Emission を選択します。

f:id:hiyokosabrey:20211103224637p:plain

カラーを触れればなんでもOKなんですが、ひとまずテクスチャの色味がしっかりでるのでEmissionにします。

 

Surface を Emission に変えたら、Color のところにある、黄色い小さな●の部分をクリック→⑥

f:id:hiyokosabrey:20211105000957p:plain

 

ポップアップリストから Image Texture を選択します→⑦

f:id:hiyokosabrey:20211105001159p:plain


現れた Open ボタンで テクスチャ用の画像ファイルを読み込みます→⑧

f:id:hiyokosabrey:20211105001447p:plain

 

 

↓今回テクスチャとして保存した画像

f:id:hiyokosabrey:20211103134435p:plain

 

シェーディングタイプを切り替えます。

f:id:hiyokosabrey:20211014003103p:plain

f:id:hiyokosabrey:20211105001719p:plain

この時点でUVも当たっています。便利 Blender

 

テクスチャに他のパーツも一緒に置いている場合は、このタイミングで、UVの範囲を調整しておきます。

f:id:hiyokosabrey:20211106103138p:plain

 

 

さっそくナイフツールで斬ってみましょう。

EditModeに切り替えます。

f:id:hiyokosabrey:20211105002305p:plain

ツールメバーから ナイフツールを探してアクティブにします。

f:id:hiyokosabrey:20211105002728p:plain

クリックして青くしたら、マウスカーソルの形状が変化します。

f:id:hiyokosabrey:20211105003102p:plain

この状態で左クリック(ドラッグではない)すると、そこを始点にしてマウスカーソルの位置までカッティングラインを引くことができます。左クリックするたびに、クリックした位置が次の始点となります。

Photoshop の多角形選択ツールと同じ操作感覚です。

f:id:hiyokosabrey:20211105003825p:plain

 

操作のキャンセルは 右クリック。

確定は [ Enter ] キー

 

 

コツは、メッシュの外から初めて、外で確定させると斬りやすいです。

f:id:hiyokosabrey:20211105004504g:plain

あとで微調整できるので、まずはおおざっぱに斬っていっても大丈夫。

削れてしまっても問題ないです。

 

とりあえずぐるりと斬ってみたところ。

f:id:hiyokosabrey:20211105005846p:plain

 

ナイフモードを終了するには、ツールバーから選択ツールをクリック。

f:id:hiyokosabrey:20211105010142p:plain

 

あー削れちゃったなー

f:id:hiyokosabrey:20211105010916p:plain

というわけで、頂点を動かしてしまいましょう。

 

イメージはこう

f:id:hiyokosabrey:20211105011326p:plain

動かしたい頂点だけを選んで、[ G ] キーを押してマウス移動(ドラッグじゃない)。

f:id:hiyokosabrey:20211105011758g:plain

OMG!!  まさかの斬り直し!?

 

ここで落ち着いて 右クリック で 移動をキャンセルします。

Optionで設定を変更します。

ビューポート右上にある Options をクリックしてトランスフォームのところにある Correct Face Attributes (面の属性を修正)有効にします。

f:id:hiyokosabrey:20211105012435p:plain

このオプションを有効にしてから頂点を動かすと、

f:id:hiyokosabrey:20211105013028g:plain

斬り直さずに済みます。

 

他の頂点も少し整えたら、ここでいったん 4隅の ポリゴン を削ります。

選択モードを Face(面)に変えます。

f:id:hiyokosabrey:20211105010257p:plain

削りたい ポリゴン を選択します。

f:id:hiyokosabrey:20211105013751p:plain

選び終わったら [ Del ]キーを押すと、ポップアップメニューがでるので、 Faces(面) を選択します。

f:id:hiyokosabrey:20211105014651p:plain

この要領でどんどん斬っていきます。

 

エッジの途中を斬ると、当然頂点が増えます。

そこで、すでにある頂点から斬り始めるにはどうするか。

例えば下図のような場合。

f:id:hiyokosabrey:20211106003010p:plain

マウスを動かしているときに、目的の頂点に近づくと、マグネット的に吸い付く瞬間があります。新しく生成される頂点を表す緑の が大きくなってさらに赤いフチドリがつくので、そのタイミングで左クリックすると狙った頂点を経由することができます。

f:id:hiyokosabrey:20211106004021g:plain

 

この調子で続けます。

 

やっぱこの頂点いらんなー

となったら、

f:id:hiyokosabrey:20211106104125p:plain

不要な頂点を選択して、[ Del ]キーを押します。

ポップアップメニューで Dissolve Vertices(頂点を溶解)を選択します。

f:id:hiyokosabrey:20211106104302p:plain

Vertices(頂点) の方を選ぶと、ポリゴンが成立しなくなって Face(面) が消失してしまうので注意。

 

さらにこの調子で続けます。

 

やっぱ ここ頂点いるよなー

となったら、

f:id:hiyokosabrey:20211106105142p:plain

エッジ選択モードに切り替えて、

f:id:hiyokosabrey:20211106105331p:plain

増やしたい区間のエッジを選択します。

f:id:hiyokosabrey:20211106105507p:plain

ヘッダーメニューから Edge> Subdivide

f:id:hiyokosabrey:20211106110926p:plain

 

見た目に変化がないので、頂点選択モードに切り替えてみます。

f:id:hiyokosabrey:20211106111247p:plain

f:id:hiyokosabrey:20211106111123p:plain

 

どんどんこの調子で続けます。

 

いい加減、テクスチャの黒い部分がなー

え?今更?となったら、

テクスチャのPSDに一時的な細工をして更新します。

f:id:hiyokosabrey:20211106114654p:plain

Blenderで再度読み込みなおします。

ちなみにBlenderを再起動しても更新されます。

Blender は一度読み込むとリアルタイムにテクスチャの更新状況を監視しているわけではないのです。

f:id:hiyokosabrey:20211106114624p:plain

黒い点が見やすくなった!

 

できた!

f:id:hiyokosabrey:20211106114949p:plain

あまりぴちぴちにすると、テクスチャの変更調整に耐えられないし、頂点が増えるので、ほどほどのところで止めます。

 

これで完成にしてもいいのですが、メッシュで UI を作る場合に大事なことがあります。

それは、「中心」です。

 

Pivot(ピボット) とも言ったりしますが、そのメッシュの基準点のことです。

画面に表示する際に、頂点ひとつひとつに座表を指定するようなことはしません。メッシュのデータには、中心から頂点がどれだけ離れているか、という情報が格納されています。頂点の位置はあくまでも中心からの相対的な位置なので、中心を移動したり回転しても、形状を保ったまま動かすことができるのです。

表示するだけだったらそれほど問題にはならないんだけど、中心の場所によっては、回転や、拡大縮小したときにおかしな見た目になったり、逆に面白い演出ができたりします。

 

その中心位置の設定方法ですが、Blenderにはいくつも方法があります。

ペラペラメッシュならではの簡単な方法を紹介しようと思います。

まずObjectModeにして、アイテムパネルから今の表示位置を確認します。

f:id:hiyokosabrey:20211106134752p:plain

 

ポジションチェックします。

Location のところに今配置されている座標が表示されます。

f:id:hiyokosabrey:20211106140235p:plain

メッシュをエクスポート(FBX等での書き出し)の直前にここで値の確認をするのは大事です。

おっと、Dimensions(寸法)のところにアヤシイ値が。

XZ面で作業しているので、Y軸方向にブレが出るのはオカシイ。

Edit Mode で作業していると割と起こりうるので、スケールの Y に ゼロを入れて、Object > Apply > Scale することで、キレイな平面になります。

f:id:hiyokosabrey:20211106140925p:plain

 

XYZの各軸線が交差するところが原点です。

f:id:hiyokosabrey:20211106142108p:plain

Object Mode のままで、ここを中心となるように、メッシュを移動させます。

 

オレンジの小さな点が、メッシュの中心です。

f:id:hiyokosabrey:20211106142612p:plain

 

これを Object > Apply > Location すると

f:id:hiyokosabrey:20211106143006p:plain

できあがり!おつかれ!

あとは、エクスポートして、ゲームエンジンや開発環境に持っていって、そこでテクスチャを合わせてあげます。

 

f:id:hiyokosabrey:20211106154634j:plain

 

f:id:hiyokosabrey:20211106154159j:plain

 

これで、テクスチャを自由に切り出して画面作りができます。手数が多いのは、スプライトとは比べものにならないですが、表現の幅が広がる可能性と、パフォーマンスとクオリティの向上に貢献できるので、ぜひ初めてみてはいかがでしょうか。

Blenderのショートカットを覚えると、さらにサクサクと作業できるようになるので、慣れれば手軽さもアップします。

 

今回はこの辺で。

 

 

ではでは

素敵な 3DUI ライフを!

 

3DメッシュでつくるUI ー カーブ利用編

 日が落ちるのが早くなってきましたね。帰宅中に夜道を歩いていると、ふいに稲の枯れた匂いが漂ってきたので、見ると田んぼの稲がすっかり刈られていました。昼間はまだ暑いので意識していなかったんですが、なんだか急に夏の終わりを感じて寂しく思うと同時に、美味しい食べ物がいろいろ出てくる季節なのでワクワクもしています。

 さてさて、この頃はゲームエンジンが身近になって、3Dを利用するためのハードルがものすごく下がった、もはや無いのではないかとさえ思います。2Dアセットを扱うことが圧倒的に多いUIデザイナーとしては、周りのモデラーさんと比べてしまったり、手を付けるとしても今一つ成果物のイメージがUIと結びつきにくいとか、習得するのも時間がかかりそうだとか、サブスクやライセンス料が高いDCCツールだと家でコッソリというのも難しかったり、いろいろと心理的ハードルが高く、キビシさを感じておられる方も多いのではと思います。

 そこでぼくは、あくまでも 2DUI の延長線上で、部分的に3Dに置き換えていくという作り方を提案したいなと思った次第。

 イラレや手書きじゃなくて、リアル質感のあるUIを作りたいから3Dを勉強したい、というのは残念ながらぼくでは力不足なので、技術書か他のサイトをあたってもらうしかないですね。ゲーム画面の中で、リアルタイムレンダリングで、無理なく表現できる少しリッチなUI表現を実装するために というコンセプトで書いていきます。

 

 

今回サンプルとして用意したのはモーダルウィンドウです。

画面に対してかなり大きな面積を占めるうえに、常駐させることが多く、何度も目にするのであまりテクスチャの解像度を低くすることもできないので、メッシュで作るのにちょうどいいからです。

f:id:hiyokosabrey:20211011233210j:plain

 このウィンドウベース(下敷き)を3Dメッシュで作ることで、テクスチャの解像度を稼ぎつつ、効率のよいテクスチャアトラスを作ろうぜ、というのが目的です。
中央の単色ベタの部分を有効利用したいなと。

 

 スプライトやImageで複数のパーツに分割するとテクスチャの容量を節約できるけど、いくつかのパーツに分けてくっつけて表示するというのも、ちょっと組み合わせるのが手間なうえに、圧縮によるピクセルの荒れを回避する必要があったり、アニメーション時に隙間やズレが出たり、フェード時に重なりが見えてしまったり、というのを心配してしまうのだけれど、最近あまりそういった悩みを聞かなくなった。容量の心配しなくていいほど余裕があるのか、9スケールグリッドみたいなデザインを選択して回避しているのかもしれない。

f:id:hiyokosabrey:20211013231519p:plain

 デザインでグリッドに縛られすぎるのも、ゲームの雰囲気によってはお行儀が良すぎて絵的に面白くないし、容量の負担を大きくせずに大胆な形状を採用できるのはメッシュが向いていると思うのです。

 

 スプライト等の2Dでは矩形でしか描画できないのに比べて、ポリゴンのあるとこしか描画しないので、不要なピクセルの半透明ブレンドの計算を減らすことができます。また9スケールグリッドのような部分的にテクスチャを伸ばすことも楽勝なので、柔軟なデザインに対応できます。どんなに複雑な形状でもOneオブジェクトとして扱える。

 テクスチャの容量が節約できると、テクスチャのロード時間が減るし、常駐量が少なくなれば、メモリ管理に余裕ができるし、もっと他にリッチな表現が欲しいときの貯金としてやり繰りできます。

 

 さすがにメリットばかりじゃなくて、レイアウトがカメラ基準だったり、色味の調整に悩んだり、メッシュ内のポリゴン順で悩んだり、扱うツールが増えたりするので「なにがなんでもは3Dメッシュじゃい!」とは言わないですが、3Dメッシュによって表現の幅やできることが広がるのは自信を持って言うことができます。タイトル名は書けないのですが自分のかかわったタイトルでは結構な頻度で3DでUI作ってます。

 3DでUI作ってるというと、ほぼ例外なく立体的な見た目を想像されるのですが、ぼくは テクスチャ容量節約描画負荷削減 のために使うことが多いです。なので、3Dであることを気づかれないのは寂しくもあるけど、ある意味自慢です。最近は頂点アニメーションもやりやすくなったので楽しいですね。そのうちUVアニメーションの楽しさとかも記事にしていきたいと思ってます。

 

 

 というわけで、今回作ったテクスチャはスカスカですが、下図の斜線部分も余すことなく使っていきたいのです。

f:id:hiyokosabrey:20211013234945p:plain

 

 

 

f:id:hiyokosabrey:20211016010033p:plain

メッシュの作成は Blender を使用します。ver 2.92 を使って記事を書いていますが、ver2.93でも問題なく進められます。

今回作るものに必要な操作は書いていますが、インストール方法や基本操作については省かせていただきます。

 

 

まず、カーブを使ってみるところから。

カーブを使わなくても問題ないのですが、いろいろ便利に使える手法なので、記事にしておきます。

 

 

ObjectModeで Add > Curve > お好きなカーブタイプ

f:id:hiyokosabrey:20211007233309p:plain

カーブを選ぶとビューポートにオブジェクトが配置されます。

カーブは、厚みなどのボリュームがないので、作成時のカメラの角度によっては追加されたことが分かりにくいことがあります。
テンキーの [ 1 ]、[ 3 ]、[ 7 ]、を押して探します。

f:id:hiyokosabrey:20211007234654p:plain

f:id:hiyokosabrey:20211007234702p:plain

f:id:hiyokosabrey:20211007234709p:plain

これでも見えない場合はカメラが離れすぎているかもしれないのでピリオド [ . ] キーを押してみると見つかることもあります。サイズが大きくないので、スケールで大きくするのもありです。

 

パースペクティブビュー(奥行きのある視点)で作業すると歪みが出やすいので、

平行投影にします。切り替えは テンキーの [ 5 ]

f:id:hiyokosabrey:20211007235929g:plain

 

向きは後から回せるので、とりあえずXY面で作業していくことにします。

 

[ Tab ]キーを押して、ObjectMode から EditModeに切り替えます。

f:id:hiyokosabrey:20211008002303p:plain

カーブの両端に方向線が出てきます。(ベジェ曲線を選択した場合)

 

 

カーブを伸ばす

カーブを伸ばしたいどちらか一方のアンカーポイントを選んで [ E ] キーを押す。

f:id:hiyokosabrey:20211009091758p:plain

 

そしてすぐにドラッグすると新たなアンカーポイントが増えます。

f:id:hiyokosabrey:20211008002618p:plain

 

カーブを閉じる

閉じるには両端のアンカーポイントを選択して、[ Alt ] キー押しながら [ C ]キー

f:id:hiyokosabrey:20211009004530p:plain

 

無事閉じたら、形を整えていきます。

アンカーポイントと方向線の端の点が選択できるので、[ G ]キーを押していい感じの位置に移動させていきます。

f:id:hiyokosabrey:20211008004341p:plain

アンカーポイントや方向線を選んだ状態で、[ R ]キーを押すと、方向線を回転、[ S ]キーで長さを調整してカーブの流れを整えていきます。

 

マウスで対象を直接ドラッグする方法に慣れてると、結構戸惑うと思います。

Blenderの場合、

  1. 対象を選ぶ
  2. アクション(何をするか)を決める
  3. 操作する(アクションによっては追加で設定や調整までできるものがある)

という3段構えで触ることが多いです。

対象の種類や状態によってできることとできないことの差が大きくて、状況依存としてコンテキストから選ぶほうがユーザーにとっては選びやすかろうという配慮だと思います。

 

 

アンカーポイントの追加

アンカーポイントを後から増やすには、セグメントの分割という操作になります。

2点を選んで

f:id:hiyokosabrey:20211010111611p:plain

ヘッダーメニューから Segments > Subdivide

f:id:hiyokosabrey:20211010111740p:plain

f:id:hiyokosabrey:20211010111906p:plain

 

 

アンカーポイントの削除

削除したいアンカーポイントを選択した状態で

f:id:hiyokosabrey:20211010114454p:plain

 [ X ]キーを押すとポップアップが出ます

f:id:hiyokosabrey:20211010114129p:plain

Vertices を選ぶと消えます。

f:id:hiyokosabrey:20211010114328p:plain

 

アンカーポイントを2点選んでこの操作を行うと、間のセグメントを削除できます。

f:id:hiyokosabrey:20211010115044p:plain

f:id:hiyokosabrey:20211010115053p:plain

ショートカットキーを使いましたが、ヘッダーメニューからも同じ操作が可能です。


 

 

大体カーブの扱い方がわかってきたところで、

画面デザインからテクスチャを作って、Blenderに持ってきます。

 

まずテクスチャはこんな具合に入れました。

f:id:hiyokosabrey:20211011235142p:plain

1920x1080の画面サイズを想定しているので、テクスチャのサイズは 2048x1024 と巨大です。画面デザインからダイレクトに移植しました。

作業しやすいように、背景は真っ黒です。
PSDで書き出したらBlenderのウィンドウに直接ドロップします。

f:id:hiyokosabrey:20211011234456p:plain

f:id:hiyokosabrey:20211012230240p:plain

ObjectModeじゃないとドロップできないので注意

あと、作業するビューにドロップしないと、カメラの向きを変えると回転してしまいます。

f:id:hiyokosabrey:20211011235958p:plain

色が濃すぎるので、半透明にします。

ドロップした画像オブジェクトを選択した状態で設定パネルから調整できます。

f:id:hiyokosabrey:20211011235739p:plain

f:id:hiyokosabrey:20211012000009p:plain

実はこれ、テクスチャではなく、下絵として使います。

 

ここにカーブを追加したら、この絵を下敷きにして形を整えていきます。

f:id:hiyokosabrey:20211012001110p:plain

少し外側を通る感じ。

f:id:hiyokosabrey:20211012001329p:plain



 



 

この「カーブ」は「メッシュ」にしないとゲーム画面で描画できません。

アウトラインフォントがすでに実装できているので、いずれはそのままアセットとしてレンダリングできる時代が来るとは思いますが、いましばらくはメッシュと仲良くするしかないようです。

 

さて、モードを ObjectMode に切り替えます。

f:id:hiyokosabrey:20211012000950p:plain

 

カーブからメッシュに変換する方法は2つ

一つは ヘッダーメニューから Object > Convert to > Mesh

f:id:hiyokosabrey:20211009000703p:plain

 

もう一つは、カーブの上で右クリック > Convert to Mesh

f:id:hiyokosabrey:20211009001326p:plain

 

この操作をした直後に、オプション設定のポップアップが画面左下に出るので、

その中にある Keep Original を有効にすると、カーブをバックアップできます。

f:id:hiyokosabrey:20211009003004p:plain

f:id:hiyokosabrey:20211009003320p:plain

 

コンバートしても見た目に変化しないので、EditModeに切り替えます。

f:id:hiyokosabrey:20211012002447p:plain

 ↓頂点をすべて選んだ状態。

f:id:hiyokosabrey:20211012002302p:plain

頂点の数が結構多い印象だけど、後で減らすのでひとまずこれで進めます。

画像がちょっと分かりにくいので下敷きはいったん非表示で説明していきます。

f:id:hiyokosabrey:20211012010406p:plain

 

まだ、頂点とエッジ(頂点同士を結ぶ線)しかないので、面を張ります。

 

頂点すべてを選択した状態でヘッダーメニュー Face > Fill

f:id:hiyokosabrey:20211009004219p:plain

Fill のショートカットは [ Alt ] + [ F ]

f:id:hiyokosabrey:20211012004831p:plain

たくさんの三角形ポリゴンで面を構成されています。

おそらく計算やデータの順番やらいろいろな処理の効率が最大になるよう考慮して三角形分割されてると思うので、人間が手で分割するよりは無駄がない、はず。

 

ここまでくると頂点を減らすモディファイアが使えるようになります。

f:id:hiyokosabrey:20211009102746p:plain

モディファイアは、例えるならPhotoshopのレイヤー効果みたいな位置付けのものです。元のオブジェクトを非破壊なまま、さまざまな形状、状態に変化させてくれるという大変ありがたい存在。パラメータ調整で最終結果をいつでも確認できるので重宝します。

今回使うモディファイアは、Decimate

f:id:hiyokosabrey:20211009094707p:plain

 

f:id:hiyokosabrey:20211009102219p:plain

ObjectModeで確認しながら減らすことができます。

上図の設定パネルから Ratioを調整します。Ratioのところにある棒グラフの先端付近をマウスで左右にドラッグするとリアルタイムに頂点数が変化します。

f:id:hiyokosabrey:20211012005211p:plain

Convert to Mesh したときの 96頂点 から 34頂点 に減らしてみました。

下絵を表示してみます。

f:id:hiyokosabrey:20211012005331p:plain

大丈夫そうです。ここでハミ出していてもあとから簡単に調整できます。

 

さて、このポリゴンに対して、縁取りをつくります。

次に進む前に、モディファイアを適用する必要があります。

f:id:hiyokosabrey:20211009104231p:plain

これで形状をFIXできます。

 

ちなみに上図の の右にある × ボタンをクリックすると、モディファイアを破棄して、なかったことにできます。「レイヤースタイルの破棄」みたいなものです。

f:id:hiyokosabrey:20211009105116p:plain

これで後戻りはUndoのみ。

 

EditModeで頂点すべてを選択した状態でヘッダーメニュー Face > Inset Faces

f:id:hiyokosabrey:20211009004219p:plain

Inset Faces を選択したら、クリックしないようにマウスを移動(ドラッグしない)させて幅を検討します。

f:id:hiyokosabrey:20211009105748g:plain

このとき、なんだか幅が均等じゃないな思ったら、カーブが歪んでいた可能性があります。

f:id:hiyokosabrey:20211009144156p:plain

真横から見てまっすぐになっていない場合に、縁取りが不均一になります。

ObjectModeで、スケールを 0 (上図の場合青い軸線方向につぶすので Z軸を 0)にしてつぶしてからヘッダーメニュー Object > Apply > Scale

 

これでOK、となったらクリックしてFIX。

適当にクリックしても、直後であれば詳細設定のポップアップが出ているので、そこで微調整できます。

f:id:hiyokosabrey:20211009125738p:plain

Thicknessが縁取りの太さです。フォームの上でマウスでドラッグが便利。

Select Outer にチェックをつけるとハイライトされているポリゴンが反転します。

f:id:hiyokosabrey:20211009130432p:plain

ポップアップ以外をクリックすると完全にFIXします。それまでは自由に調整できます。

f:id:hiyokosabrey:20211012010103p:plain



 

縁取りのポリゴンを選択した状態で『UV展開』します。

こういった 『ぺらい』メッシュだと、UV展開という言葉がしっくりこないのですが、各頂点ごとの、テクスチャUV座標を決める操作のことを指して言う言葉だと、覚えておくといいですよ。

 

トップメニューにある UV Editing ボタンをクリックして、ビューポートのレイアウトをUV編集レイアウトに切り替えます。

f:id:hiyokosabrey:20211009132243p:plain

右側のビューポートが、デフォルトな感じに戻された場合は、テンキー[ 7 ] を押して、[ 5 ]キーで平行投影にしたり、ワイヤーフレーム表示にしたりして、見た目を整えます。

 

ポリゴンの選択が外れてしまったときは、

f:id:hiyokosabrey:20211009134001p:plain

編集対象をポリゴンにして、

f:id:hiyokosabrey:20211009134308p:plain

ひとつだけ選択します

f:id:hiyokosabrey:20211009134350p:plain

ヘッダーメニューの Select > Select All by Trait > Faces by Sides

f:id:hiyokosabrey:20211009142714p:plain

f:id:hiyokosabrey:20211009143153p:plain

全部のポリゴンを選択していても特に問題はないのですが、この操作を覚えておくと後でラクができます。

 

ヘッダーメニューから UV Unwrap

f:id:hiyokosabrey:20211009141644p:plain

UVエディタが下のようになります。

f:id:hiyokosabrey:20211009145629p:plain

まだ、何もテクスチャを読み込んでいないので、デフォルトの正方形のイメージが表示されています。

90度回った状態になるのですが一旦置いておいて、テクスチャを読み込みます。

テクスチャを読み込んでから、Unwrap する方が手間が減っていいのですが、UV座標の特性を説明したくてこのような流れにしています。

 

UVエディターのヘッダーメニューにある +New ボタンの左側にあるプルダウンからテクスチャ画像を選択。下絵としてドロップした画像がリストアップされているはずです。

f:id:hiyokosabrey:20211012232037p:plain

プルダウンリストの中に見つけられなければ、Open ボタンから探して読み込みます。

 

f:id:hiyokosabrey:20211012232608p:plain

アスペクト比が変わったので変形してしまいました。

これがUV座標空間の特徴です。

最初に Unwrap した際に展開したUV座標から何も変わっていないのです。

UV座標は、座標と言いつつもテクスチャの形状に関係なく、端から端までを0~1.0 で扱います。

f:id:hiyokosabrey:20211012234001p:plain

※環境によっては、左下が 0原点で扱われることがあります

 

このため、テクスチャのアスペクト比が変わると、変形してしまうのです。

メッシュの形には影響しませんが、テクスチャ作成がちょっと面倒なことになります。

 

余談ですが

この特性を利用すると、プラットフォーム等による解像度の変更作業がとても簡単になります。

例えば 2Kで作ってきたところで、あとから4K対応することになった場合。

テクスチャの解像度を変えるだけで対応完了です。スプライトのようにピクセル座標で管理していると、大変な手間になります。

※エディタ上ではピクセル座標は整数で扱いつつも、内部のデータではUV座標という開発環境もあると思われるので確認は必須

いくらUV座標が効率的とはいえ、小数を扱うので、苦手な人は辛いかもしれません。

 

 

さて、変形した比率を正常なアスペクト比にします。

UVエディターで作業します。

ここで頂点をすべて選択して [ S ]キーを押すか、

Scaleボタンをクリックするとスケール調整モードになります。

f:id:hiyokosabrey:20211013000913p:plain

[ S ]キーを押した場合はマウスを動かすだけでとサイズが変更できます。操作パネルからスケール調整モードにした場合は、マニュピレーターをドラッグします。

ここはアナログな調整ではなく、数値でサクッとリサイズします。

スケールを少し触ってクリック(マニュピレータの場合はマウスボタンから指を離す)すると、UVエディタのビューポート左下に Resize のポップアップが出るので、そこで数値を入力します。

f:id:hiyokosabrey:20211010000357p:plain

Scale X を 0.5 にして YとZ は 1.0 にします

f:id:hiyokosabrey:20211009234931p:plain

f:id:hiyokosabrey:20211013000607p:plain

 

 

つぎに [ R ] キーを押すか、Rotateボタンを押して回転モードにします。

f:id:hiyokosabrey:20211013001317p:plain

これもスケール同様にして操作すると Rotate のポップアップが出ます。

-90 と入力すると元の向きになります。

f:id:hiyokosabrey:20211010000916p:plain

f:id:hiyokosabrey:20211013001948p:plain

 

あとは、テクスチャのデザインに合うようにサイズと位置を調整します。

[ S ]キーで スケール

[ G ]キーで移動

[ホイール] ズームイン/アウト

[中ボタン]ドラッグでスクロール

  ※Blenderのデフォルト操作設定

 

f:id:hiyokosabrey:20211013003317p:plain

 

完成まであと少し。

 

 

 

 

縁取りを除いた中身をほったらかしにしてるので、残りの頂点をUV展開します。

3Dビューポート側のヘッダーメニューから Select > Invert

f:id:hiyokosabrey:20211009142714p:plain

で選択箇所が反転します。

f:id:hiyokosabrey:20211010003102p:plain

再び  UV > Unwrap

f:id:hiyokosabrey:20211009152925p:plain

f:id:hiyokosabrey:20211014001620p:plain



この頂点をマウスドラッグで矩形選択して、[ S ]キーで適当に小さくします。

f:id:hiyokosabrey:20211014001836p:plain

 

これも Resize のポップアップから、Scale X と Y に数値を入力。

f:id:hiyokosabrey:20211010003737p:plain

スケールを ゼロ にすると 1点に集約されます。

f:id:hiyokosabrey:20211014002123p:plain

これを、邪魔にならない場所に移動します。[ G ]キー

f:id:hiyokosabrey:20211014002135p:plain

メッシュはこれで完成です。

 

FBXとかで書き出してエンジンに持っていくことができます。

 

UVが思った通りにあたっているか、確認しておきます。

まずシェーディングタイプをマテリアルにします。

f:id:hiyokosabrey:20211014003103p:plain

f:id:hiyokosabrey:20211014012602p:plain

マテリアルがアサインされていないので、生ポリゴンの状態です。

 

新しいマテリアルをアサインします。

f:id:hiyokosabrey:20211014012450p:plain

Base Color のところにある 黄色の丸をクリック ③

f:id:hiyokosabrey:20211014013657p:plain

ポップアップウィンドウが出てくるので、Image_Texture を選択 ④

f:id:hiyokosabrey:20211014013946p:plain

表示内容が変化するので、UVエディターのときと同様に、プルダウンからテクスチャ画像を選択します ⑤

f:id:hiyokosabrey:20211014014231p:plain

 

f:id:hiyokosabrey:20211014014657p:plain

デフォルトのマテリアルとシェーダーで描いているので色味がおかしいですが、ここではUVが正しく展開できているかが大事なので、歪みが出たりしていなければOK。

 

メッシュはこれで問題なくエクスポート(書き出し)できます。

エクスポート方法については、開発環境に依存するので、今回説明は省かせていただきます。

 UE4とUnityは、FBXをサポートしているので、ぼくはFBX形式で書き出します。

 

残るはテクスチャ。

テクスチャに、メッシュで使用するUVの範囲をわかるようにしておくと、ギリギリまでスペースを使うことができます。

うっかりUV展開している範囲に他の余計なピクセルが侵入しないようにしたいので、UVレイアウトを画像で書き出す機能を利用します。

 

UVエディタ上で、UVの頂点を選択した状態で、

f:id:hiyokosabrey:20211015001333p:plain

UVエディタのヘッダーメニューから UV > Export UV Layout

f:id:hiyokosabrey:20211009153038p:plain

ファイル書き出しのダイアログが出るので、指定した場所にそのままPNGフォーマットで書き出します。

f:id:hiyokosabrey:20211009154612p:plain

 


この書き出した画像をPhotoshopで開きます。

f:id:hiyokosabrey:20211015001802p:plain

半透明なのと黒色で分かりにくいですが、このレイヤーをテクスチャ用のドキュメントに移植します。

Photoshopでドキュメント間でレイヤーを移すとき、

[ Ctrl ]+[ Alt ]+[ Shift ]を押しながらドロップすると、まったく同じ位置に配置できます。

f:id:hiyokosabrey:20211015003158p:plain

           ※UVレイアウトの画像が見えにくいのでカラーを反転しています

 

f:id:hiyokosabrey:20211015004752p:plain

ぴったり。同じサイズのドキュメント間で有効な隠し技です。

 

このUVレイアウトを避けてさえいればぎりぎりまで使えます。

書き出す際は、レイヤーを非表示にします。

 

仕上げに圧縮対策をします。

アルファチャンネルで透明になるピクセル付近のカラーを広げて塗りつぶしておく感じで。

↓今はまだ周りに何もないので手を抜いて矩形で塗ってる状態。

f:id:hiyokosabrey:20211015005438p:plain

RGBチャンネルは ↑

アルファチャンネルは ↓

f:id:hiyokosabrey:20211015005807p:plain

これでテクスチャも用意できました。

 

 あとは、エンジンでマテリアルとかシェーダーを用意してくっつければ画面に表示できると思います。

 

f:id:hiyokosabrey:20211015021950j:plain

f:id:hiyokosabrey:20211015231904j:plain

 

 エンジンの環境によっては、描画のタイミングや思ったような色にするのに設定が必要な場合もありますが、結構手軽に表示させることができます。慣れてくると5分もかからないです。マテリアルやシェーダーについては、一度汎用的なのを用意すれば、特殊なことをしない限り使いまわせます。

 インポートやエクスポートの方法については、エンジンや開発環境に依るところが大きいので書くのをやめました。DCCツールに書き出すためにスクリプトを用意する開発現場もあるかと思います。余計なデータをくっつけて書き出さない、余計なデータを取り込まない、というのに気を付けて、パラメータやスイッチ等のパラメータを試行しながら最適な手順を見つけることになると思いますが、UIの場合アニメーション関連(スケルトンとかボーンとか)は不要でいいと思う。マテリアル関連も、エンジンで組むのでそれほど必要になったことはないかな。

 

 ちょっとしたUIパーツを、わざわざ3Dメッシュで作るのは、手間が増えるだけなので、オススメはしませんが、見た目に驚きを与えたり、データ効率が良くなるのであれば、技術習得も兼ねて積極的に使っていきたいですね。

 

今回は以上になります。

次回は、カーブを使わずに四角形を分割しながら作る方法か、カーブで作ったゲージのどちらかを書いてみようかと考えています。

 

ではでは

素敵なメッシュUIライフを!

HPゲージをいろいろいじってみよう ー もっと動きをつける

前回の記事でいろいろ見た目をアップさせる小技を紹介しましたが、今回はいろいろ動きのあるものを入れたものを紹介していきます。

あくまでも一例にしかならないのですが、いくらかヒントになれば幸いです。

 

先の記事からの続きとなっていて、値を変える関数や表示のテストについては解説は省いていますので、いきなりこの記事からだとわかりにくい箇所があると思いますので、過去記事のリンクを貼っておきます。

limesode.hatenablog.com 

HPゲージをいろいろいじってみよう ー 成長するゲージ - みつまめ杏仁

HPゲージをいろいろいじってみよう ー 見た目を工夫する - みつまめ杏仁

 

 

INDEX

 

 

ダメージを受けると揺れるやつ

f:id:hiyokosabrey:20210828121816g:plain

揺らすためのカスタムイベントを用意します。

UMGのタイムラインでアニメーションを作成した場合、以下ようになります。

f:id:hiyokosabrey:20210828114934p:plain

他のアニメーションと被る場面があると、気軽にタイムラインアニメーションを使えないということもあるかもしれません。ということでノードでランダムな動きを作ってみます。

 

ひとくちにランダムな揺れというと、ランダム揺らし警察に職質されそうなのでビビリながら書くのですが、実際いろんなアルゴリズムや手法があって、結局のところこだわりポイントの差がすべてのような気はしています。

ということで今回は円を使ったランダム座標です。

矩形の範囲内の座標をランダムにチョイスする方法だと、シンプルですが、原点からあまり動かない可能性があります。ある程度原点から離れた位置にぶっ飛んでほしいという気持ちがあったので強制的に中心から離そうと考えて円の動きに決めました。f:id:hiyokosabrey:20210828114021p:plain

サインとコサインに渡しているのは ラジアンです。ラジアンは円1周で 2π なので -3.14~3.14 でランダム値をゲットしています。0~6.28 とかでも同じになります。

角度(Degree)に変えることもできます。

サイン、コサインノードに掛け算しているのは半径に相当します。サイン、コサインは基本的に -1 ~ 1 の値を返すので、そのままだと小さすぎるのを大きくして使っています。ここを加減することで、揺れ幅が調整できます。

 

UMGで位置を変えるのは2種類の方法があります、元の位置に戻すことを想定すると Canvas Slot の Position を変えるのではなく、 Render Transform の Translation を使うのがベスト。

これについては画像付きで解説している過去記事を貼っておきます limesode.hatenablog.com

 上に伸びてる赤いラインは、いつものアイツ、 Set Timer by Eventノードです。

f:id:hiyokosabrey:20210828124110p:plain
一定回数揺らすと終了するようにしたいので、回数をカウントする Int型の変数を用意して利用します。

 

 

このカスタムイベントをゲージの長さを変更する際に呼び出される関数に追加します。

f:id:hiyokosabrey:20210828124520p:plain

減らすときだけ揺らしたいので、このイベント呼ぶ側にその選択をさせるため、カスタムイベントにBoolean(ブーリアン型)のピンを追加。

 

テストの際にレベルBPからこのイベントを呼び出しているので、カーソルキーの左を押したときだけ True にします。

f:id:hiyokosabrey:20210828125017p:plain

 

揺れるゲージは以上です

こんな揺れで満足できないという方はぜひいろんな手法を試す冒険に出かけてみてください。

一応オマケとして、配列を使った揺れの一例を紹介します。

XY座標の2軸を扱うので、Vector2D型の変数を配列で用意します。

f:id:hiyokosabrey:20210828130210p:plain

この配列から順次取り出してやります。

f:id:hiyokosabrey:20210828130410p:plain

配列の数と、カウント数の判定に注意。

これでランダムならではの不安定さはなくしつつタイムラインを使わなくてもいい感じにできます。

 

この配列に、若干のランダム値を加えると連続した際にワンパターン感が減らせます。

f:id:hiyokosabrey:20210828131146p:plain

配列から取り出した値に -3.0 ~ +3.0 の揺らぎを与えるカタチになります。

 

f:id:hiyokosabrey:20210828121816g:plain

 

 

 

バフ・デバフ等でエフェクトが乗るやつ

f:id:hiyokosabrey:20210828131625g:plain

ゲージに影響がある ステータス異常であることをプレイヤーにわかりやすく伝えるための表現として古くから親しまれているやつです。

その昔、シェーダーがまだ使えなかったころは、数種類のパーツを適宜差し替えたりしていました。

ナウい今はモダンに1パーツでやってみます。

今回作った状態変化対応は 毒状態と自動回復の2種。

 

色だけだと伝わりにくいので、テクスチャを用意しました。

f:id:hiyokosabrey:20210828151431p:plain

サイズはちょっと小さめに 64x64px  シームレスになっています。

Photoshopだとパターンプレビュー機能を使うと作りやすくなります。

エンジンにインポートして GrayScale として扱います。

 

ゲージのカラーについては、前回の記事でも紹介したカーブアトラスを使ってゲージのカラーを3本用意して使っています。

 f:id:hiyokosabrey:20210828151935p:plain

 

キモになるのはマテリアル。

f:id:hiyokosabrey:20210828150019p:plain

(※ゲージのMAX値が伸びない想定です)

Panner ノード使って常時スクロールアニメーションをさせています。

f:id:hiyokosabrey:20210828152846g:plain

Multiplyノード は ピクセルの値を 掛け算します。白=1.0 黒=0.0

白は変化しません。

 

f:id:hiyokosabrey:20210828152901g:plain

Add ノードはピクセルの値を加算します。黒は変化しません。

この 2つのカラーを振り合分けているのが Lerp (Linear Interpolate)ノード。

f:id:hiyokosabrey:20210828153625p:plain

ScalarParameterノードをつないで、 0 か 1 を受け取るようにします。
f:id:hiyokosabrey:20210828153930p:plain

 

通常時のカラーとの切り替え。

これも Lerp ノードのお世話になってます。

f:id:hiyokosabrey:20210828161801p:plain

ScalarParameterで 0~1.0 で切り替えます。

 

ゲージの長さは、Step ノードを利用して可変できるようにします。

f:id:hiyokosabrey:20210828154658p:plain

このパターンはマテリアルを使うゲージの場合よくお世話になってます。

3つのパラメータ(ScalarParameterノード)を仕込みました。

 

TypeSwitch ・・・ 0=デバフ / 1=バフ

Fade ・・・ 通常ゲージとのフェード

Value ・・・ ゲージの長さ

 

フェードアニメーションを用意します

UMGのタイムラインからマテリアルのアクセスはちょっと分かりにくい操作になります。

f:id:hiyokosabrey:20210828164555p:plain
アニメーションを追加→① して適当にリネーム →②

ゲージ本体の Image をヒエラルキーから選んだ状態で +Track ボタンを押す →③

選んだゲージ本体の Image の名前が出てくるので選択 →④

 

選ばずに +Track ボタンを押すとこうなります。

f:id:hiyokosabrey:20210828163908p:plain

All Named Widget にマウスオーバーすると一覧が出るので、そこから選択してもOK。

 

選んだ Image が追加されるので、右にある+Trackボタンをクリック →⑤

Materialsの Beush.Brush Material を選択 →⑥

f:id:hiyokosabrey:20210828164617p:plain

トラックが追加されるので同様に右にある +Parameterボタンをクリック→⑦

マテリアルのパラメータ一覧が出てくるので、Fade を選択 →⑧

f:id:hiyokosabrey:20210828165242p:plain

これでようやくタイムラインにキーが打てるようになりました。

f:id:hiyokosabrey:20210828170804p:plain

Details(詳細)タブから数値を触れないので、このタイムラインエディタからキーを編集します。

 

キャンバスの編集はここまでになります。

 

さっそくWidgetブループリントに組み込んでいきます。

マテリアルをゲージ本体の Image にセットしたら、ブループリントからマテリアルにアクセスするために、ダイナミックマテリアルインスタンスを作るようにノードをつなぎます。

f:id:hiyokosabrey:20210828162216p:plain

Return Value ピンから変数に昇格(Promote to Variable)しておきます。

 

バフ・デバフがかかった際に呼び出されるカスタムイベントを用意します。

f:id:hiyokosabrey:20210828212040p:plain

マテリアルのパラメータをセットするだけのイベントです。継続する系の演出については、発動時のタイムラグは不要なので即時見た目をチェンジします。派手にアピールする場合は、トッピング的に煙やスパークなどのエフェクトを乗せるといい感じになります。

2種類しかないので、ひとまずブーリアン型の入力を受け取るようにしています。

Select Floatノードで、True なら 1.0、 False なら 0.0 になるようにしています。

 

あとは バフ・デバフが解除された際のフェードアニメーションを再生するカスタムイベントを用意したら編集完了です。

f:id:hiyokosabrey:20210828212917p:plain

ゲージWidgetができたので、テストしてみます。

 

 

レベルブループリントでキー入力をトリガーにします。

バフ・デバフを切り替えるためのイベントを2つ用意するのが面倒だったので、ブーリアン型の変数を一つ追加して、フラグとして利用することにします。

Xキーを押すたびに、バフとデバフが切り替わります。

Zキーを押すとデフォルトの見た目に戻ります。

f:id:hiyokosabrey:20210828213331p:plain

f:id:hiyokosabrey:20210828131625g:plain

表現したい種類が増えるとそれなりに対応が変わりますが、マテリアルを改造してパラメータを増やすと、より汎用的に扱えるようになって拡張性がアップできます。少々作りがややこしくなるので今回はここまでにします。

 

 

変わり種ゲージ

f:id:hiyokosabrey:20210828214516g:plain

レベルメーターぽいやつ

動きは特にないのですが、ゲージの方向が縦になったのと、段階的に変化するのが特徴のゲージです。横のものが縦になったという劇的な概念的変化をもって動きをつけたというか、まぁ平たく言えばついでです。ちなみに漢字を使うと 「序で」と書きます。

 

さてさて

これもマテリアルで作りますが、まずはテクスチャ。

64x256px のテクスチャに、パスでラインを置いていきます。

f:id:hiyokosabrey:20210828220541p:plain

10px間隔で全部で 25Lines

ゲージ本体用と少し大きくした下敷き用の2枚用意しました。

f:id:hiyokosabrey:20210828215908p:plain

エンジンにインポートして GrayScale として扱います。

 

次にグラデーション。

カラーはカーブアトラスを利用します。

f:id:hiyokosabrey:20210828222544p:plain



マテリアルを用意します。

レベル 0~25 までのFloat値を受け取る仕様。

f:id:hiyokosabrey:20210828222822p:plain

1レベル分の高さが10ピクセルで、テクスチャの縦方向の解像度256ピクセル

10/256 を 受け取った値に対して掛けることで、ゲージの閾値が決まります。

このゲージは下から上に向かって伸びるゲージなので、1-x (OneMinus)ノードを使っています。

 

 背景の作り方によりますが、このゲージは色を変えることで増減の変化を見せるようにしています。アルファ値はテクスチャを使用しています。

このテクスチャアルファにStepノードの値を乗算するようにすると、色を変えずにOpacityで削れます。

 

キャンバスに下敷きのテクスチャと、マテリアルを配置します。

f:id:hiyokosabrey:20210828231320p:plain

下敷きテクスチャは、カラーを暗くして、本体のマテリアルの下に敷します。

 

Widgetブループリントでは ↓このように 0~1で管理している値を x25 してマテリアルに渡しています。

f:id:hiyokosabrey:20210828230711p:plain

この辺はゲームの設計に合わせて構成を変えることになると思います。

 

これで完成です。

上限が増えない想定ですが、ゲームシステム上の最大値分をテクスチャで用意しておき、表示する際にレベルの未達部分をマスクするように作るとゲージの成長が表現できます。

 

 

最後に

今回は以上の3本です。いかがでしたでしょうか。

まだまだいろんなタイプというか仕様のゲージがあると思いますが、もとは UE4イベント ぷちコン 制作への応援として書こうという動機だったので、あまりニッチなゲージを作ってもややこしくなりそうだし、そもそも読む気も失せるだろうということで、HPゲージを作ろうシリーズはここまでにしておきます。

今まで作ってきたゲージの長さを全て足すと月まで行けるんじゃないかと思ってみたりもしていますが、そもそも実寸がないので計測不能でした。ゲームともに進化するゲージ。人類が海の底で暮らすようになり視力を失わない限り恐らく永遠にゲージは無くならないだろうと思います。なんか無理やり壮大な話に持っていこうとしていますが、しんどくなってきたので、少しでもゲージづくりの魅力を感じてもらえれば幸いと願いながら筆をおくことにします。

 

 

ではでは

すてきなゲージライフを!

 

 

HPゲージをいろいろいじってみよう ー 見た目を工夫する

 ゲージのデザインは、ゲーム進行においてとても重要な役割なのに、UIの主役には絶対なれないし、主張するとウザがられ、空気読めよ邪魔だよとか言われて面積を大きくとれなかったり、え?いつの間に体力ゼロ?なんで?今の攻撃結構減ったな、ヤバい!回復しないと!などなど、細い見た目でもそれなりに情報量を込めないといけなかったりと、とても悩みどころが多いです。

そのくせ、 ただの棒じゃん、そんなの秒でつくれるんじゃね?とかもっとカッコよくして、安っぽくならないようにして、とか気軽にコメントされると切なくなります。

 

 この安っぽくならないように というのが結構重要で、ゲージに手を加えてないゲーム画面はどうしても「仮感」(システム上必要になったのでとりあえず置いてみたけどまだゲーム画面に馴染めてなくて仮っぽく見える感覚)が漂ってしまいます。見た目に情報強度はめちゃくちゃ強いのですが、立ち位置がそこじゃない感(メタ視点から見て)が滲んできて開発途中な印象を与えかねないので、開発終盤ではそれなりに手を入れられるとクオリティアップにつながります。

 

 最近は、ゲームグラフィックの描画スペックが上がって、画面情報量も格段に増えているので、そこに埋もれないようなUIを考えると、フラットデザインは結構フィットしている印象です。逆にUIに色を使わずシンプルにシルエットと位置、動きで勝負するので、デザインも実装もなかなかの難易度になってると思います。

 

 とはいえ、ゲームの世界観にふさわしいUIデザインというのがゴールなので、トレンドも意識し通つつ、『色・カタチ・動き』に意味を与えながら試行していくしかないですけどね。

 

 前置きが長くなってしまいましたが、一応続きの記事になります。

limesode.hatenablog.com

limesode.hatenablog.com

 

 UE4でゲージを作る記事は探すとそれなりに出てくる今日この頃。いまさら感が否めないのを気にしつつ、今回はちょっと切り口をかえて書いてみようと思います。

 

 ゲージは実にいろんな作り方があって、どの方法が正解とかないのですが、あるとしたら処理負荷の少ないエコなつくりで見た目がいい感じ、あたりでしょうか。

フワッとした言い方しかできないので、提案になってしまいますが、ざっと眺めてもらって試してみたいのが見つかればいいな。

 

INDEX

 

 

テクスチャ作るのめんどい

そろそろ仮UIを脱したい。でも今はまだデザインに時間を割きたくない。ちゃちゃっとエンジンコンテンツだけでどうにか。デザイナーに依頼かける前に検証。というような状況を想定。

 

カーブアトラスでちょっとリッチに見えるグラデーションゲージ

カーブアトラスと書きましたが、実際はカーブをカラーとして格納したテクスチャということになります。グラデーションは別途カーブアセットを使って作ります。

コンテンツブラウザで右クリックして Miscellaneous > Curve を選択。

f:id:hiyokosabrey:20210823223631p:plain

Curve を選択すると、ポップアップが出るので、CurveLinearColor を選択。

f:id:hiyokosabrey:20210823224213p:plain

カーブエディタが開くので、RGB各チャンネルにカーブをつけていい感じのグラデーションを作ります。

f:id:hiyokosabrey:20210823230648p:plain

 

保存したら、次にカーブアトラスを作って編集します。

f:id:hiyokosabrey:20210823230913p:plain

テクスチャサイズはデフォルトで 256 になっています。ちょっと贅沢なのでメモリ節約のため小さくします。べき乗サイズがオススメなので、 32、64、128 あたりで。

すぐ下、Gradient Curves のところに + ボタンがあるので、ここに作ったグラデーションカーブをセットします。

f:id:hiyokosabrey:20210823231408p:plain

これを保存して準備完了。

 

続いてマテリアルを用意します。

コンテンツブラウザで右クリック > Material

エディタを開いたら、さっそくカーブアトラスを扱うノードを取り出します。

f:id:hiyokosabrey:20210823231659p:plain

CurveAtlasRowParameter ノードです。

f:id:hiyokosabrey:20210823231909p:plain

ノードを選択して、Detailsタブで、カーブとカーブアトラスをセットします。

f:id:hiyokosabrey:20210823232112p:plain

セット完了したら、その他必要なノードを以下のようにつなぎます。

f:id:hiyokosabrey:20210823232248p:plain

Mask(R) は  Component Mask ノードの Rチャンネルのみ有効にした状態。

 

あとはこのマテリアルを保存して、UMGのHPゲージにセットするだけ。

テクスチャをセットする場所に、マテリアルがセットできます。

f:id:hiyokosabrey:20210823232742p:plain

カラーはまっ白にしておかないと、乗算されてカラーが思った通りに出ないので注意。

f:id:hiyokosabrey:20210823233151g:plain

ここから少し改造

グラデーションの向きを縦にしてみます。ComponentMaskを R → G に変えるだけ。

f:id:hiyokosabrey:20210823233355p:plain

 

f:id:hiyokosabrey:20210823233559g:plain

 

手っ取り早く上下反対にしたい場合は OneMinus ノード

f:id:hiyokosabrey:20210823233755p:plain

Mask(R) に使うと 左右反転します。

計算が増えるので、最終的にカーブエディットで解決するのをおススメします。

 

ここで、もうひとネタ

 

カーブを追加します。

f:id:hiyokosabrey:20210823234519p:plain

両端がグレーで真ん中が真っ黒です。

 

カーブアトラスに追加登録します。

f:id:hiyokosabrey:20210823234716p:plain

 

これをマテリアルで合成します。

f:id:hiyokosabrey:20210823234938p:plain

こんな感じになります

f:id:hiyokosabrey:20210823235206p:plain


さらに おまけでこんなカーブ

f:id:hiyokosabrey:20210824000410p:plain

これ色として使ってなくて・・・

f:id:hiyokosabrey:20210824000549p:plain

こうなります

f:id:hiyokosabrey:20210824000732p:plain

赤をハイライト、緑をシャドウとして合成しています。

 

テクスチャを使わなくてもリッチな見た目をつくることができます。



 

 

グラデーションゲージを活かしたピンチな点滅

カーブアトラスでもうひとネタ絞り出しました。

以下のようなグラデーションを用意します。

f:id:hiyokosabrey:20210824003531p:plain

 

ゲージ本体のマテリアルを複製して下敷き用のマテリアルを用意します。

タイマーとサインカーブで点滅させています。

f:id:hiyokosabrey:20210824003634p:plain

点滅のための単色グレー(図の一番上にあるノード)は、グラデーションのグレー部分と同じ明るさです。

f:id:hiyokosabrey:20210824004030g:plain

常に点滅はしているのですが、ある程度減らないと見えてこない仕様です。
特に残り体力の判定等はしていないので、どの辺でヤバみを主張するかは、カーブで調整できます。

 

 

  

テクスチャ用意できた

ただの棒はイヤだ!なんとかしてテクスチャを用意するぜぇ!せっかくテクスチャが用意できたんでなんかこういい感じの・・・、という状況を想定。

 

定番のフレームを載せるやつ

f:id:hiyokosabrey:20210824133929p:plain

説明用にちょっと贅沢な作りですが、フレーム(上)とゲージ本体(下)の2枚。

重ねやすさを優先して余白が多めです。

 

これをインポートして、ゲージ本体用のみマテリアルに持っていきます。

コンテンツブラウザでインポートしたテクスチャアセットアイコンの上で右クリックするとラクに取り込めます。

f:id:hiyokosabrey:20210824135104p:plain

f:id:hiyokosabrey:20210824141813p:plain

stepノードを使って、ゲージの長さを塗り分けています。

こういったテクスチャを使った自由な形状のゲージは、余白があるため、テクスチャの端から端までを使ってデザインされていないことがほとんど。

そこで大事な部分。

f:id:hiyokosabrey:20210824142115p:plain

ゲージとして扱うときに 0で空っぽ、1.0で満タン というのがよくあるケース。というかグラフィックで表現するときに効率的な扱い方。

同じように扱おうとすると、ゼロになってないのに、ゲージの見た目は空っぽ。満タンじゃないのにゲージの見た目は満タンということが起こります。

f:id:hiyokosabrey:20210824155401p:plain

そこで、Lerp(Linear Interpolate)ノードを使って 0 ~ 1 に補正します。

 

例えばテクスチャの幅が 512px で左端から 8ピクセル余白があったとします。

すると、 8 ÷ 512 = 0.015625 付近の数値が Lerpノードの A になります。

同様に右から 12ピクセル余白があったとしたら、

(512-12) ÷ 512 = 0.9765625 付近の数値がLerpノードの B になります。

 

電卓で計算してもよいですが、UE4は直接計算式を入力できるので便利。

f:id:hiyokosabrey:20210824160818p:plain

入力してEnterキー押したら、どこか別の場所をクリックすると計算結果に変わります。

f:id:hiyokosabrey:20210824160827p:plain

テクスチャの解像度と余白の取り方によって数値が違ってくるので、実際の表示を確認しながら微調整します。

スカラーパラメーターノード Value の値に 0 と 1 を入れて加減します。

 

ゲージの増減をマテリアルで行うので、ブループリントからマテリアルにパラメータを渡すための準備が必要です。

 

f:id:hiyokosabrey:20210824161632p:plain

Dynamic Material Instance を作成して変数に昇格(Promote to Variable)

これに対してSet Scalar Parameter Value ノードを使って数値を渡します。

f:id:hiyokosabrey:20210824162111p:plain

この関数は、前の記事で作ったものの使いまわしです。

 

f:id:hiyokosabrey:20210824162651g:plain

 

デザイン性が高くオリジナリティが出しやすいのですが、ちょっとだけ扱いが面倒になるのが難点。

 

 

 

キャラ絵を使ったゲージ 

f:id:hiyokosabrey:20210824170051p:plain

頑張って描きました。これをマテリアルでゲージにします。

f:id:hiyokosabrey:20210824170821p:plain

四隅がもったいない作りですが、実装スピードを重視してます。描画負荷がキビシイ場合は45度回転しておくという手がありますが、ピクセルが若干荒れるので解像度と相談になります。

 

 これもゲージの増減をマテリアルで行うので、ブループリントからマテリアルにパラメータを渡すための準備が必要です。

f:id:hiyokosabrey:20210824161632p:plain

Dynamic Material Instance を作成して変数に昇格(Promote to Variable)

これに対してSet Scalar Parameter Value ノードを使って数値を渡します。

f:id:hiyokosabrey:20210824162111p:plain

この関数は、前の記事で作ったものの使いまわしです。

 

できたのはこれ

f:id:hiyokosabrey:20210824172255g:plain

 

 満タン ←→ 空っぽ の変化の向きは、UとVの計算をちょっといじってやると変えられます。画像を回転する場合は効果ないですが、画面内の位置が決まってから、絵の感じ、視線の流れを見て選択するといいと思います。

OneMinusノードの使い方がポイント

f:id:hiyokosabrey:20210824174843p:plain

f:id:hiyokosabrey:20210824174857p:plain

f:id:hiyokosabrey:20210824174906p:plain

f:id:hiyokosabrey:20210824174915p:plain




 

 

 

キャラ絵の一部を切り出して使う

どこか別の場所でアイコンなどで使っているテクスチャを流用します。

これは直接ゲージにするのではなく、ゲージに重ねて使います。

 f:id:hiyokosabrey:20210824173536p:plain

この彩色されたテクスチャを加工します。

f:id:hiyokosabrey:20210824182610p:plain

 複数キャラの切り替えを想定していて、切り取る位置だけを変えられるようにスカラーパラメータにしてあります。

このマテリアルをマスターにして、あとはキャラごとのマテリアルインスタンスを量産すると、絵に合わせた素材が簡単に用意できます。

 ネガポジ反転したみたいになっていますが、これに着色してゲージに後乗せするといい感じになります。

f:id:hiyokosabrey:20210824183148p:plain

 

 

f:id:hiyokosabrey:20210824183437g:plain

 

 

 

 

 

 ひとまずこの辺にまでにしておきます。テクスチャ作成とマテリアル作成については、作る人のスキルに依るところが大きいのと、テクスチャ制作はエンジン以外のエディタ環境が必要だったりで、説明が難しいのがもどかしいですね。うまくフィットするのがあればぜひ試してみたりアレンジしてください。同じような表現でも違うアプローチで作ることができたりするので、ゲージ作りは奥が深いです。

 UMGを使わないという選択肢もあります。ただ、これは見た目のコントロール難度が格段に上がるので、3D描画の仕様にある程度慣れてないと調整に大変時間がかかります。

 逆にUMGのほうが慣れるの大変そうという方は、テキスト表現だけをUMGにして、あとはMeshで、というのも可能です。アンリアルエンジンでは使う人次第で、いろいろな作り方ができるのも魅力のひとつです。

 

 操作についてはかなり端折っているので、わからない点やツッコミ等々あればTwitterかブログコメントでお気軽にお尋ねください。レスポンスは速いとはいえないですが対応します。

 

次回はちょっと特殊な演出で遊んでみようと思います。

ではでは

すてきなゲージライフを!

 

 

 

HPゲージをいろいろいじってみよう ー 成長するゲージ

 先日公開した動くHPゲージをもっと触っていこうという内容です。

 

limesode.hatenablog.com

この記事で作ったゲージを元にいろんなアレンジや機能を試していきます。

 

UE4の最新バージョン 4.27 がリリースされましたが、この記事シリーズが終わるまでは 4.26 で進めます。

 

 

ゲージ全体の長さを変更できるようにする

キャラのLVアップや、アイテムゲットなどでゲージの上限が増えるとプレイに対しての報酬になりモチベーションのアップにつながります。

まず準備として、キャンバスに配置したゲージの長さを変数に入れて基本の長さとします。

キャンバスに配置した状態を取得してそのまま変数に保存します。

f:id:hiyokosabrey:20210820233859p:plain

サイズを入れておく変数は、Get Size ノードにある Return Value ピンから 右クリックして作るとラクです。型は Vector2D になります。

この仕組みのおかげで、キャンバスに置いたゲージの形はいつでも自由に感覚的にいじっても大丈夫になります。画面デザインの調整のたびにブループリントを調整する必要はありません。

 

Slot as Canvas Slot ノードは Image が持ついくつかのパラメータの中でも Canvas Slot というカテゴリにアクセスするときに使うキャスト系(型変換)ノードです。

 

Scale で長さを変更するというのは、画面に描画する際に掛け算してから描くということになります。その掛け算の元のサイズが、 Canvas Slot のSize になるのです。

f:id:hiyokosabrey:20210821102851p:plain



ということで、サイズを変更するためのカスタムイベントを用意します。

growGaugeと命名

f:id:hiyokosabrey:20210821011813p:plain
引数として、最新のHPと、最新の増分を受け取るようにしています。

増分、増えた分は、パーセント(%)で管理する想定。

 

ゲージは Image を2枚重ねているので、それぞれを処理しますが、Set Sizeノードには同時にいくつもつなぐことができます。。

 

真ん中左付近の見慣れないノードは ↓ こうやって作ります。

f:id:hiyokosabrey:20210821004126p:plain

いろいろ計算して、最後にゲージの長さをセットする関数をつないでいます。ゲージの上限が増えるだけなので、ゲージの長さが変化しない想定です。

f:id:hiyokosabrey:20210821004943g:plain

Sizeを変更すると、ゲージの基本の長さを伸ばすことになるので、Scaleで縮めているだけのゲージは一緒に伸びてしまいます。そこで下敷きのみが変化しているように見せています。

例えば ゲージが60%の状態で、長さが 20%増えた場合。

f:id:hiyokosabrey:20210821010602p:plain

 

この補正処理はあくまでも表示バグ対策です。

ゲームの仕様次第で変わってきますが、ゲージ全体の長さが変わったとき、その時点でのHPの量が変わらないのであれば、見た目に長さが変わるのはおかしいという理屈です。

 

ということで、テスト用のレベルブループリントも、もう少しちゃんとしようと思います。

前回の記事で MyHP という名前の Float型の変数で、ゲージの長さを比率で管理していましたが、ゲーム的に扱いにくいので、Integer型の変数を使った管理方法に変更します。

最大値も必要なので、2つの変数を用意します。HP と MaxHP と命名

f:id:hiyokosabrey:20210821130802p:plain

右下の方にあるGet Gauge HP ノードは関数です。

内容は ↓ このようになってます。この後 数か所で利用するので関数化しました。

f:id:hiyokosabrey:20210821131021p:plain

引数を受け取らず、計算結果を返すだけの内容なので、ピュア型というカタチにしています。

f:id:hiyokosabrey:20210821131302p:plain

f:id:hiyokosabrey:20210821131504p:plain

ピュア型にすると、ちょっとだけノードの流れ(白いライン)が短くできます。

 

カーソルキーの増減処理のところも変更します。

f:id:hiyokosabrey:20210821132108p:plain

ここまで改造で、前回の動作はキープできました。

 

次にようやく今回のネタの部分、ゲージの長さを変えるためのトリガーになる処理。

f:id:hiyokosabrey:20210821132819p:plain

キーボードの Bキーを押すと 50ずつHPが増えていき、その都度ゲージWidgetに補正後の割合と、ゲージの増分を割合にして渡しています。

f:id:hiyokosabrey:20210821133609g:plain

 

このゲージの上限が増える表現については、ゲームの仕様によってさまざまなスタイルがあります。

いつどのタイミングで増えたことを見せるか、というのが設計のときに大事になります。

ちなみに ゲージの最大値が増えると、安心感が増える一方で難易度が下がったり、緊張感が減ったりするので、用法容量にはご注意ください。

 

 

 今回はここまで

次回は見た目を工夫してみようと思います

 ゲームの数だけゲージデザインがあるので助けになるかわかりませんが、ヒントになれれば幸いです。

 

ではでは

すてきなゲージライフを!

 

  

 

 

 

 

おまけ

UMGのチュートリアルでゲージといえば、プログレスバーを使ったゲージが紹介されていることが多いかと思います。

f:id:hiyokosabrey:20210821092126p:plain

f:id:hiyokosabrey:20210820224840p:plain

すでにこのProgressBarコンポーネントでUIを作られている場合でも、前回の記事を利用できます。

前回の記事ではImage のスケーリングで長さを変更していました。

その際の関数内の編集のみでサクッとプログレスバーに差し替えることができます。

 

f:id:hiyokosabrey:20210820225422p:plain

↑これを
↓こうします

f:id:hiyokosabrey:20210820225246p:plain

編集完了。

 

f:id:hiyokosabrey:20210820230005g:plain

 

動くHPゲージを作ってみませんか

季節は残暑。まだまだ真夏のはずですが、ここ最近の空模様のせいかセミの声も遠く感じる今日この頃いかがお過ごしでしょうか。先日のクイズゲームの記事でちょっとばかり燃え尽きてたりして間が空いてしまっていました。参加しそびれたのですが、ぷちコンのエンドレスランを作るイベントを見て、何か自分もぷちコン制作のお役に立てるものがないかと考えた結果、ゲージについて書くことにしました。

今までも度々ゲージに触れてきましたが、エンジンもずいぶんアップデートされてますし、復習もかねて記事にしてみようと思います。

 

UE4の基本的な操作方法については、「まぁまぁできるよ」という方を想定していますが、わからない操作等あれば、みつまめ杏仁 (@MMAn_nin) | Twitter かブログコメントにて問い合わせいただければ対応します。

 

 

  

 

シンプルなゲージとはいえ

ゲージが減った時に パッ、パッ、と途中段階のアニメーション無しに変化するタイプ。作るのは比較的易しいですが、常にゲージを見つめながらプレイは無理です。どれだけ減ったのか、いつ減ったのか、変化に気づきにくいので動きをつけるとグッと見た目がアップします。

f:id:hiyokosabrey:20210817001105g:plain

 

f:id:hiyokosabrey:20210817002313g:plain

 

 

今回はテクスチャを使わずシンプルなパーツで作っていきますが、増減する処理のところは、汎用的な仕組みなのでいろんなスタイルのゲージにも使えると思います。

 

 

作ってみよう

まずはWidgetのキャンバスにゲージの見た目として、Image を2つ重ねます。

f:id:hiyokosabrey:20210818012524p:plain

同じサイズで同じ位置に重ねると1枚に見せることができますが、いろいろアレンジできます。上図のように(下敷きの色が見にくいですが)ドロップシャドウぽく見せたり、下敷きを大きくしてみたり。

f:id:hiyokosabrey:20210818233049p:plain

大事なのは、後ろの背景に紛れてしまわないようにすることです。

そのためには手段を選ばないのがゲージを存在させるために必要な心意気です。

 

下敷きは、ゲージが減った状態でも、満タンからどれだけ減ったかがわかるので、とても重要な存在です。

 

上に置いたゲージを本体とします。

 

UMGで重ねた時の順番をコントロールする方法は2つあります。

ひとつはヒエラルキーでの位置

f:id:hiyokosabrey:20210819223224p:plain

もちろん後から描くほうが手前です

もう一つは ZOrder の値の大きさ

f:id:hiyokosabrey:20210819223400p:plain

数字の大きい方が手前になります。

ヒエラルキーで同階層、ZOrderの数字が同じ場合は、ヒエラルキーの順番で描かれます。またヒエラルキーで親子階層になっている場合は親同士が比較対象で、子供たちは親に依存します。

 

ゲージの長さは横方向のスケールを変えることで可変させるので、Pivot 位置を変更する必要があります。

f:id:hiyokosabrey:20210819000203p:plain

Render Transform にある Pivot X をゼロにすると、左端がスケールの基準点になります。デフォルトは (0.5, 0.5) なので、ど真ん中が設定されています。
Photoshopの変形時に表示されるバウンディングBOXをイメージするといいかも。

f:id:hiyokosabrey:20210819000720p:plain

 

Pivot X を 1.0 にすると、 右に減っていくゲージが作れます。

 

 

必要なパーツが配置できたので、ブループリントを編集します。

編集モードを Designer から Graph に切り替えます。

 

 

まず変数を2つ用意します。VariableType は Float型

f:id:hiyokosabrey:20210818234100p:plain

f:id:hiyokosabrey:20210819001546p:plain

CurrentValue と NewValue という名前にしました。

 

 

 

次にゲージの長さを変更するための関数を一つ作ります。

変数同様に、My Blueprintタブの Functions の右にある + ボタンをクリックすると新しく追加できます。

名前を changeGauge と命名して編集開始。

f:id:hiyokosabrey:20210819001726p:plain

① My Blueprintタブの Variables からゲージ本体の Image(キャンバスにレイアウトしたやつ)を取り出します。

 

② そこから Set Render Scale ノードを取り出してつなぐ

 

ここで、Scale の X だけを引数として受け取りたいので、ひと手間かけます。

f:id:hiyokosabrey:20210819002417p:plain

③ Set Render Scale の Scale ピンのところで右クリック

④ リストから Split Struct Pin を選択

 

こうなります。

f:id:hiyokosabrey:20210819002603p:plain

あとは、 Scale X のピンをドラッグ ⑤ して、 関数のノードにドロップ ⑥。

 f:id:hiyokosabrey:20210819002804p:plain

 

仕上げに 引数の名前と、Scale Y の値を変更。

f:id:hiyokosabrey:20210819003051p:plain

関数はこれで完成。

 

ちなみにピンの分解をせずに Make系のノードを使っても同じ結果になります。

f:id:hiyokosabrey:20210819224525p:plain

濃い青色のピンからドラッグして、make で検索すると取り出せます。この色のピンは特定の型を示すものではないので、慣れてないと不気味な感じですが、こうやってドラッグしてMakeノードを取り出したり、先の右クリックしてSplit(分割)する方法を使うと、中身がわかるようになってます。基本的に色の違うピン同士はつながらないのですが、これらの方法でどうにかなったりするので、馴染みのないピンが現れたらぜひ試してみてください。

 

 

つぎに EventGraphに戻って、カスタムイベントを一つ追加。

用意しておいた Float型の変数を使って計算と判定を行います。

f:id:hiyokosabrey:20210820003912p:plain

NewValue には 新しいゲージの値が入る想定。最新の結果が外から送られてきます。

CurrentValue は現在のゲージの値。

CurrentValue と NewValue に差分が発生するとアニメーションさせます。

差がなくなるとアニメーションは終了です。

アニメーションは簡単な減速処理です。イーズアウト的な動きになります。

左の方にある 0.25 という値を小さくするとゆっくり、大きくすると素早く動くようになります。

 

詳しくは過去記事で解説しているのでそれを貼っておきます。

Widgetで追跡するカーソル - みつまめ杏仁 (hatenablog.com)

 

続きの部分

f:id:hiyokosabrey:20210819013030p:plain

ここで、作っておいた関数を呼び出して、変化した変数を見た目に反映しています。

 

この計算式では、Current~とNew~が限りなくゼロに近づくだけでゼロにはなりません。

0.00000000001.....  みたいな感じで桁が増えていくばかり・・・

NewValue と CurrentValue の差がゼロになったら、 つまり 同じなら、というのを厳密にやると、一向に終わらないということになります。

そこで

Nearly Equal(Float) ニアリーイコールノードを使って、もういいだろうという範囲まで来たら、ゼロとみなすという判定を行っています。

 

Set Timer by Event ノードは、 指定した時間が経過したらイベントを呼び出してくれるノードです。

前のカスタムノードにつないでいるので、NewValue と CurrentValue の差が埋まらない限りは、何度でもカスタムイベントを呼び続けます。

 

これでエンジン的な処理が完成しました。

 

仕上げに、このイベントを始動するカスタムイベントと、ゲージを初期化するイベントを作ります。

 

新しくカスタムイベントを用意します。

f:id:hiyokosabrey:20210820004044p:plain
右端のノードは先に作った増減アニメーションのカスタムイベントを呼び出すときのノード。

 CurrentValue はこのWidget内だけのもので、外からNewValueに対して値を更新してもらうのが今回の仕様です。

 

ほぼほぼ完成ですが、ゲームをやり直したりする場合にゲージをリセットする必要があります。またコンティニューでその場復活HPちょっとだけ回復とか、あったりするので、アニメーション無しに一瞬でゲージの長さをセットしてしまう処理を用意しておくとゲーム的に何かと都合がよかったりして便利です。

そこでこのカスタムイベント。

f:id:hiyokosabrey:20210819231629p:plain

 

これでゲージのWidgetは完成です。

 

ぼくの場合Widgetの表示は、HUDクラスに担当してもらうのですが、手っ取り早くテストするために、レベルブループリントで試します。

 

テストする

ゲージ用の変数を一つ追加します。とりあえず MyHP と命名

ゲームにおけるHP管理用に相当します。

 

Create Widget ノードを取り出して、作ったゲージ用Widgetをセット。

f:id:hiyokosabrey:20210819232415p:plain

Return Value のピンから 変数に昇格(Promote to Variable)させて UserWidget型の変数を作ってつなぎます。

あとは、Add to Viewport ノードで画面に描画、HPの初期値をセットして、ゲージWidgetの カスタムイベントを呼び出します。

 

この状態で、任意の長さのゲージが表示できます。

 

次にキー操作で増減させます。

input ノードを使います。

Left と Right は それぞれカーソルキーの左右です Left[←] Right[→]

f:id:hiyokosabrey:20210820002116p:plain

二つとも内容はほぼ同じなので、片方を作って複製するとラクができます。

違うのはここ↓(緑の部分は上と同じ)

f:id:hiyokosabrey:20210820002618p:plain

これで再生してみると、カーソルの左右キーを押すたびに、ぎゅんぎゅん動くはずです。

f:id:hiyokosabrey:20210820003251g:plain

減るだけじゃなく増えるのも問題なしです。

満タンと空っぽのチェックをきちんとやれば、Widgetの カスタムノード UpdateGauge を呼び出して HPの値を渡してやるだけで勝手にアニメーションします。

 

ちなみに、スペースキーでリセットする場合はこんな感じにつなぐだけです。

f:id:hiyokosabrey:20210820011347p:plain

いつでも満タンにできます。

 

ひとまず想定していた仕組みが完成したので今回はここまでにします。

次回はこのゲージを使ってアレンジを楽しんでみようと思います。

ゲームの数だけ、仕様の数だけ、ゲージがあるので、作り方や実装方法も実に様々です。

こんなゲージ作ってみたいけど作り方がわからないとか、ちょっと無茶ぶりしてやろうとかあれば、チャレンジして作ってみようと思いますので、お気軽にメッセージ等々でネタ提供をお待ちしております。

 

ではでは

素敵なHPゲージライフを!