【Unreal Engine5】初めてのゲーム開発 <第3回>GeometryScriptを使った造形

今回はGeometryScriptによる造形に関して学んでいきたいと思います。

GeometryScriptによってアクタ同士の足し算・引き算で多彩な造形を行うことが出来ます。
また、階段の段数などをビューポート画面から動的に操作できるようになります。
テストする際は動的に階段の段数とか変更できると便利ですよね。

目次

Geometry Script(プラグイン)の導入

編集 > プラグイン
からプラグインのページへ。

プラグインはUE5に最初からインストールされていますが、有効化されていません。
Geometryの分類から探すか、検索窓で「Geometry Script」で検索をかけると出てきます。

左にチェックマークを入れ、プロジェクトを再起動して有効化します。

(BP)DynamicMeshActorを作成

適当な作業フォルダにブループリントクラスを作成
※作成してるフォルダなどは自分が分かればOK

作成するクラスは
DynamicMeshActor
GeneratedDynamicMeshActor
←今回はこちら
どちらかを選択。

後者はエディターモードでしか使えないらしいので、本来は前者の方がよかったようです。

スタンドアローンの2種はNG。
ただし、後でStatic Mesh化する方法もあるので絶対NGというわけではない。

GeneratedDynamicMeshActor に関する注意点

記事を作った後に知りました。
GeneratedDynamicMeshActorで作成したアクタはスタンドアローンゲームのモードでは存在できないようです。
つまり、実際のゲームとして使うには適していないとのこと。

作成したアクタをStatic Mesh化する方法もあるようですが、チュートリアルとしてはDynamicMeshActorの方を使うべきだったかもしれません。



作成したらとりあえずレベル上に配置してみます。

名前はGMS_testとしました。

作成したGeneratedDynamicMeshActorで階段を作る

色々作れるのですが、使用例として用途が多い階段を作ってみます。
階段はテスト実行の際にプレイヤーを別の高さに移動させるのに非常に便利なので、最初に作ってみるのをオススメします。

GMS_testのBPをダブルクリックして中身を見ていきます。
今までは、コンポーネントの追加からキューブ型や球などを選択してきましたが今回はイベントグラフで行います
イベントグラフを開き、最初からある3種(EventBeginPlay/EbentActorBeginPlay/EventTick)は邪魔なので消去(使用予定であればそのまま残す)。

左側のマイブループリントにある「関数」にマウスを持って行くと「オーバーライド」というプルダウンメニューガ表示されるのでクリック。

On Rebuild Generated Meshを選択

見つけづらい場合はキーボードでそのままOn+半角スペースと打ち込むと出てくるはず。

これでイベントが生成されます。

作成したOn Rebuild Generated MeshのTarget Meshピンから実行ワイヤーを伸ばすと動作の選択画面に

GeometryScript > プリミティブ 以下にAppend XXXという形で、アクタの形を設定できます。

GeometryScript > プリミティブのAppend 一覧

項目に関してはGeometry Script リファレンスより抜粋

Append Box指定したダイナミック メッシュに 3D ボックスを追加します。
Append Sphere Lat Long緯度/経度トポロジを使用して三角形分割された 3D 球体をダイナミック メッシュに追加します。
Append Sphere Boxボックス トポロジを使用して三角形分割された 3D 球体をダイナミック メッシュに追加します。
Append Capsuleダイナミック メッシュに 3D カプセルを追加します。
Append Cylinderダイナミック メッシュに (オプションのエンド キャップを含む) 3D シリンダーを追加します。
Append Coneダイナミック メッシュに 3D コーンを追加します。
Append Torus3D トーラス (環状体) または部分トーラスをダイナミック メッシュに追加します。
Append Rectangleダイナミック メッシュに平面矩形を追加します。
Append Round Rectangle角が丸い平面矩形 (RoundRect) をダイナミック メッシュに追加します。
Append Discダイナミック メッシュに平面ディスクを追加します。
Append Triangulated Polygon平面 2D ポリゴンの ドロネー三角形分割 をダイナミック メッシュに追加します。
Append Revolve Polygon2D ポリゴンの回転サーフェス (全回転または必要に応じて制限された部分回転) をダイナミック メッシュに追加します。
Append Spiral Revolve Polygon垂直方向のらせんを作成するために使用するような、らせん状のパスで 2D ポリゴンを回転させます。
Append Revolve Pathオプションの上下のエンド キャップがあるオープン 2D パスを回転させます。
Append Simple Extrude Polygon選択されたダイナミック メッシュを使用して、2D ポリゴンを垂直パスに沿って押し出します。
Append Simple Swept Polygon選択されたダイナミック メッシュを使用して、任意の 3D パスに沿って 2D ポリゴンをスイープします。
Append Linear Stairs選択されたダイナミック メッシュを使用して、直線階段を追加します。
Append Curved Stairs選択されたダイナミック メッシュを使用して、上りのらせん階段を追加します。

※画像はデフォルト値のもので、パラメータを変更することで変形可能
※画像がないものはデフォルトで指定しただけだとエラー

今回はAppend Linear Stairsで直線状の階段を作っていきます。

①デフォルト値で設置

ビューポート画面に詳細パネルが表示されていない場合、(上部)ウィンドウの詳細(どれか)にチェックが入っているか確認。

②パラメータを変数値に昇格

Step Width
Step Height
Step Depth
Num Steps
それぞれを「変数に昇格」

変数にフォーカスを合わせると右に詳細パネルが表示されます。
インスタンス編集可能にチェックマーク

作業が終わったら忘れずにコンパイル。

変数化時の注意点

変数化した数値に関しては、BP自体には情報が保持されません。
つまり配置したアクタ自体にしかそれらの情報が保存されてないので、変数化した値に関してはコピーで作成したものでない場合、配置する度に設定する必要があります

何でもかんでも変数化した方が便利というわけではないので、必要な部分のみを変数化しましょう。

③ビューポート画面で視覚化しながら変形

ビューポート画面に戻ると、先ほどはなかった「Step Width」「Step Height」「Step Depth」「Num Steps」のパラメータが出現しています。

数値を直打ちしてもいいのですが、数値の書いてあるエリアでマウスをD&Dすることで視覚的に見ながら変形できますので、ざくっと目的の形にしたい場合に便利です。

なお、通常の視覚的UIのトランスフォームは右の「拡大・縮小」と連動していますが、今回の設定値とは別のパラメータとなります。
デフォルトに設定された幅・奥行・高さをさらに拡大縮小の倍率で変化させているイメージ。

階段に関してはモデリングモードのStairsでも最初の建設時に段数等の指定ができますが、作成後に段数の変更はできない為1つのアクタBPを色々な場面で使いまわすのには不向きです。
その点、Geometry Scriptであれば場面に応じて柔軟に変化させることが可能なので、1つ階段を作ってしまえば色々な場面で使いまわせます。

④当たり判定を付ける

ここまででとりあえずの形は出来たと思いますが、問題点があります。

イベントグラフで作成したappend XXXでは、すり抜けてしまう。

当たり判定をつけるには、イベントグラフに戻って先ほど作ったAppend Linear Stairsの先にEnable Complex as Simple Collisionというアクションを繋いであげるだけ。

コンパイルして実行すれば、今度はきちんと階段に当たり判定がついているはず。

ちなみにこれに関しては、ビューポート画面の「ダイナミックメッシュコンポーネント>Collision」でも設定可能

ただ、こちらはBPをレベルに配置した際に毎回設定し直す必要があるので、Collisionが必ず必要なのであればイベントグラフの方で設定した方が人為的ミスが減ると思います。


複数の形状の組み合わせ

今度は、壁を円形にくりぬいた形を作ってみたいと思います。

①壁を作成(復習)

先ほどと同じ要領でAppend Boxに変更するだけなので工程省略。

大きさはX2000,Y1000,Z2000

②GeometryScriptの加算処理

先ほどのボックス型に、シリンダー型を追加。
追加するにはAppendアクションを繋げてあげればOK。
シリンダー型を追加するアクションはAppend Cylinderを使います。

同じように変数化していますが、今回はTransformも変数化しています。

Transform(変数化後)に関しては「インスタンス編集可能」以外に「3Dウィジェットを表示」をチェックを入れることで、別のアクタとして個別に位置/回転/拡大・縮小を矢印マーカーから行えるようになります。
シンメトリ構造などを目指す場合は目分量ではなく数値指定の方がいいので、3Dウィジェットに関しては必要であれば、という感じではありますがウィジェットで動かせるのはやはり便利。

ビューポートの詳細パネルに円柱用のRadius/Height/Radial Steps/Height Stepsと(円柱用)Transformの設定が追加されました。
今回は円柱型にくり抜きたいのでビューポート画面で円柱アクタの方向を変えます。
画面をみながら数値を調整して、画面のようにボックス型と円柱型を繋ぎ合わせました。
位置に関しては相対位置表示になっているようです。

③GeometryScriptの減算処理

先ほどはボックス型にシリンダー型を加算でしたが、今度は減算です。
結論からいうと、以下のようになります。

追加されたアクションは中央やや左(boxとシリンダーの間)のAllocate Compute Meshと、シリンダーの次のApply Mesh BooleanとRelease All Compute Meshesの3つ。
ただし、実行ワイヤー(青)も少し変化しています。

ポイントとなる部分だけ抜き出すと

Box型のMeshから、シリンダー型のMeshをSubstract(減算)して最終的なMeshとしています。
Apply Mesh BooleanのOperationによって最終的な形が変化します。
Release All Compute MeshesはAllocateによって動的に増加したメモリを解放しているおまじない(多分)。

Union(結合)

これは普通にapply連続と同じ?

Intersection(交差)

重複部分のみ

Substract(減算)

Target Meshからtool Mesh(重なる部分)を減算。

これらを使えば、壁にドアや窓を付けたりできそうです。
くり抜いた形は後からでもTransformをいじることで動かせますが、(ALT+移動等で)増やすことはできませんので、「複数の穴をあけたい」等の時はAppend Cylinder-Apply Mesh Booleanで何回か減算処理を入れる必要があると思います。
あくまで私の知識なので上手い方法がある気もしますが。

というわけで、今回はGeometry Scriptを使って複数の形の複合を見てきました。
いきなりプラグインを利用していますが、UE5で思い描いた形を作るのに重要だと思うので備忘録として。

なお、Geometry Scriptは結構以前からあるプラグインのようですが、β版なので商品化するような作品などで使う場合は品質面で注意が必要とのことです。
また、UE5で導入されたNanite/LumenではDynamicMeshComponetはサポート外とのこと。
最終的にはStatic Mesh化する必要がありそうです。


今回はGeneratedDynamicMeshActorで行いましたが、DynamicMeshActorの方で同じことを行う場合は、Construction Scriptで以下のように始めれば、同じような動作になるようです。

では、今回はこのあたりで。


コメント

コメントする

目次