ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】Shuriken Particle Unity2018

Unity2018以降で Shuriken Particle に追加された機能で個人的に気になったものを書いていきます。

確認バージョンは 2018.3.0f1 です。

Ring Buffer Mode

f:id:aki517:20181212095658p:plain
メインモジュールに追加された機能です。画面に表示されるパーティクル数が Max Particles で設定した上限値に達した時の処理を設定できます。

パラメータ
説明
Disabled Ring Buffer Mode を無効にします。上限値に達した場合、そのパーティクルの寿命(Start Lifetime)がきて上限値未満になるまで次のパーティクルは発生しなくなります。 f:id:aki517:20181213082637g:plain
Pause Until Replaced 上限値に達した場合、古いパーティクルを即時削除して次のパーティクルを発生させます。
f:id:aki517:20181213082629g:plain
Loop Until Replaced Pause Until Replaced 同様に古いパーティクルを削除するのですが、上限値に達するまでは Loop Range で設定した値内でアニメーションをループ再生できます。

下の動画では Loop Range を 0.0 - 0.5 で設定した後に Color over Lifetime で 0.0 - 0.5 間は白→緑→白、0.5 - 1.0 間はαフェードを設定しています。
f:id:aki517:20181213082436g:plain
パーティクルが出ている間は緑色に発光し続けて、上限値に達して削除対象になった古いパーティクルはαフェードで徐々に消えているのが確認できます。

設定はこんな感じです。 f:id:aki517:20181213213003p:plain
注意点として、古いパーティクルが完全に消える前に次のパーティクルが発生するため一時的に Max Particles を超えたパーティクル数が発生する事になります。
Orbital Velocity

f:id:aki517:20181214085800p:plain
Velocity over Lifetime モジュールに追加されたパラメータです。任意軸を中心に渦を巻くパーティクルの動きが設定できます。Orbital で軸を設定します。軸の中心はエミッターの位置になります。

f:id:aki517:20181214090808g:plain

(動画はパーティクルの動きを確認しやすくするためにTrailモジュールを使っています)

Offset パラメータで軸の中心を変更できます。エミッターの位置から離れるほど下の動画のように大きな渦になります。

f:id:aki517:20181214091141g:plain

Shape : Rectangle

f:id:aki517:20181214091741p:plain

Shape モジュールに追加されたパラメータです。テクスチャの色情報を元にパーティクルの発生開始位置を設定する事ができます。

f:id:aki517:20181214090019g:plain

パラメータ 説明
Texture テクスチャを設定します。対象テクスチャはRead/Writeを有効にする必要があります
Clip Channel クリップするRGBAチャンネルを設定します。選択したチャンネルで発生開始位置をマスクする感じになります。
Clip Threshold Clip Channel で設定したチャンネルの閾値を設定します。Clip ChannelでAlphaを設定した場合は適切な閾値を設定しないと下図のように見えないパーティクルが生成され余計な描画負荷が発生するので注意が必要です。f:id:aki517:20181214085418p:plain
Color affects Particles チェックを入れるとパーティクルがテクスチャのカラーの影響を受けます。
Alpha affects Particles チェックを入れるとパーティクルがテクスチャのα値の影響を受けます。
Shape : MeshRenderer

f:id:aki517:20181212100233p:plain
こちらも Shape モジュールに追加された機能です。指定Mesh上からパーティクルを発生させます。

パラメータ 説明
Type パーティクルの発生位置を設定します。f:id:aki517:20181214235847g:plain
Mode どのようにパーティクルを発生させるか設定します。Type が Vertex, Edge で設定可能
Spread パーティクルの発生間隔を設定できます。、Type が Edge で設定可能f:id:aki517:20181215001541p:plain
Speed 頂点間を移動する際の速度を設定できます。Type が Edge で設定可能
Mesh Meshを設定します。対象メッシュは Read/Write を有効にする必要があります。
Texture Sheet Animation : FPS

f:id:aki517:20181215002717p:plain
Texture Sheet Animation モジュールの Time Mode に追加されたパラメータです。テクスチャアニメーションの FPS が設定できます。
f:id:aki517:20181215003319g:plain

所感

あと今回の機能はβ版で確認したので正式リリースでは仕様が変更される可能性もありますが、色々とゲームの演出に使えそうな機能が Particle System に追加されており表現の幅が広がりそうです。

参考

【Unite Tokyo 2018】パーティクル・マニアクス - YouTube
【CEDEC2018】 パーティクル新機能の紹介 - YouTube

【Unity】パーティクルのボリューム表現

煙や雲を表現する場合、パーティクルのビルボードを使って実装するのが一般的です。(真面目に煙や雲のポリゴンモデルを用意して描画すると負荷が凄い事になってしまうので・・・)

ただ、この方法は処理が軽くなるけど四角形ポリゴンにテクスチャを貼り付けてるだけなのでボリューム感が出ない事があります。
f:id:aki517:20181027192548p:plain

ライトの影響を受ければ立体感が出るはずなので単純に光源からの距離に応じて頂点単位で明るさを調整するシェーダーを適用してみました。
f:id:aki517:20181026010111p:plain
だいぶマシになりましたがもう少しボリューム感が欲しいです ^^;

最終的にフラグメントシェーダーでテクスチャのα値を雲の厚みとして扱うようにして明るさの調整をしてみました。
f:id:aki517:20181026010150g:plain
だいぶ良い感じになりました。

テクスチャのα値とは別で設定したい場合は専用のテクスチャを用意してそちらの値を参照するのが良さそうです。

プロジェクト一式はこちらにアップしました。
github.com

今回はなるべく低コストでモバイルでも動かせるものにしたかったので擬似表現になりましたが、多光源対応やより精度の高いボリューム表現をしたい場合はボリュームレンダリングを使うとかになると思います。

参考

3Dゲームファンのための「ワンダと巨像」グラフィックス講座

【Unity】Unity2018.3からのPrefabワークフロー

Unity2018.3のβ版でPrefabのワークフローが色々と変更されました。今回はその中でもメインとなる Prefab Mode, Nested Prefab, Prefab Variant についてまとめてみました。

Prefab Mode

2018.3より前のバージョンでPrefabを編集する時は以下のような流れが一般的でした。

  1. ProjectビューのPrefabをHierarchyビューにドラッグ&ドロップ
  2. Inspector/Sceneビュー上でPrefabを編集
  3. InspectorビューからApplyボタンを押して編集内容を保存
  4. Hierarchyビュー上からPrefabを削除

この流れだとApplyボタンを押し忘れて保存されてなかったり、編集完了のPrefabを削除し忘れてシーンに不要なデータが残ってしまう問題が起こりやすかったです。

Prefab Mode はそれらの問題を解決するためのもの、、とUnityの公式ブログに書いてました ^^;

Prefab Mode への移行方法は以下の3パターンがあります。
・Projectビューで対象Prefabをダブルクリック
・ProjectビューでPrefabを選択してInspectorビューの「Open Prefab」をクリック
・Hierarchyビュー上の対象Prefabの右側にある「>」をクリック

上記のいずれかを実行すると以下のようなPrefab編集用の専用画面に移行します。

f:id:aki517:20181008085606p:plain

保存方法

Sceneビュー上部右端の「Auto Save」のチェックが有効なら編集内容は自動で保存されます。以前のように編集後に「Apply」ボタンを押す手間が無くなりました。

f:id:aki517:20181008083723p:plain

ただし、サイズの大きいPrefabを自動保存が有効な状態で編集すると動作が遅くなる場合があるので、その時は「Auto Save」のチェックを外します。手動で保存する場合は「Auto Save」の隣にある「Save」ボタンを押すか、または 「Ctrl + S」(Mac : Cmd + S) です。

f:id:aki517:20181008090406p:plain

環境設定

Prefab Modeでは 専用Sceneファイルを設定できます。 Edit > Project Settings > Editor > Prefab Editing Environments で設定できます。

f:id:aki517:20181008093715p:plain

例えば UI Environment にヘッダーとフッターのUIとCanvasを配置した Sceneファイルを設定しておけば、UI関連のPrefabを編集する際にヘッダー/フッターUIが既に配置された状態で編集できます。

f:id:aki517:20181008121807g:plain

(わざわざヘッダー/フッターUIのPrefabも Hierarchyビューにドラッグ&ドロップしてという手間が省けますね)

スクリプトからはEditorSettingsで設定できます。

EditorSettings.prefabRegularEnvironment = customScene;
EditorSettings.prefabUIEnvironment = customSceneUI;
終了方法

Prefab Mode を終了するには Hierarchyビューの「<」をクリックするか、Sceneビュー上部の「Scenes」をクリックします。
f:id:aki517:20181008092025p:plain

Nested Prefab

Prefabの中にPrefabを設定できる仕組みです。これの便利なところは例えば下図のようにある Prefab に Particle System が設定された別Prefab が3個配置されている状態から、Prefab Mode で Particle System のカラーを1つ編集するだけで他の2つにもその設定が適用されます。

f:id:aki517:20181008202446g:plain

今までのように個別で設定を行いたい場合は対象Prefabを右クリックして「Unpack Prefab」か「Unpack Prefab Completely」を選択します。2つの違いは選択したPrefabに対してのみ適用されるか、その中にある別Prefabにも適用されるかになります。

ちなみにNestは「入れ子」という意味です ^_^

Prefab Variant

あるPrefabをベースにして異なるパラメータや、追加のコンポーネントを設定したPrefabを作成したい場合に使います。

作成方法はベースとなるPrefabを右クリック > Create > Prefab Variant で作成できます。 f:id:aki517:20181008203353p:plain

下図のようにPrefabアイコンに矢印が描かれたPrefabが作成されます。今回はパーティクルサイズが異なる Prefab を作ってみるので「PrefabParticle_Large」としておきます。

f:id:aki517:20181008204111p:plain

PrefabParticle_Large の Prefab Mode に移行して Start Size を変更します。ベースと異なる部分があるとInspectorの左端に青いラインが表示されます。

f:id:aki517:20181008204514p:plain

保存方法

Variant Prefabの保存方法は通常Prefabと同様ですが、ベースのPrefabに設定値を適用したい場合はInspectorビューからOverrides > Apply All to Base をクリックするか
f:id:aki517:20181008210025p:plain

Overrides > 変更したコンポーネントを選択して 下図のようにベースとの変更差分を確認しながら 対象パラメータ上で右クリック > Apply to Prefab XXXXX で適用する方法があります。
f:id:aki517:20181008210022p:plain

所感

Prefab Modeでの編集はとても便利で今まで起こっていた操作ミスが減りそうです。Nested Prefab と Prefab Variant はきちんと仕様を把握しておかないと編集した内容が他のSceneやPrefabに影響を及ぼす可能性があるので注意が必要かなぁと思いました。

参考

Prefabs Manual - Google ドキュメント

Prefab Workflow - Unity

【Unity】Projectビューのお気に入り情報を抜き出してみる

前回に引き続き今回もProjectビューです。お気に入り情報を抜き出してファイルにエクスポート/インポートするエディタ拡張を作ってみました。

別PCのUnityエディタに自分のお気に入り情報をインポートしたい時くらいにしか使えない気がしますが内部処理を把握するのに良い勉強になりました ^^;

github.com

Unityのソースコードが公開されているのでそちらを参考にしました。調べたところSavedSearchFilter がお気に入り情報を管理してたのですが internal class だったのでリフレクションを使って参照しています・・ ^^; tsubakit1.hateblo.jp

【Unity】Projectビューについて

f:id:aki517:20180924135509p:plain

Unityエディタで開発をする上で大変お世話になるProjectビュー(Projectウインドウ?Projectブラウザ?) 色々と便利な機能があるのに私自身も知らない機能があったのでメモがてら書いていきます。

ショートカット
Windows Mac 操作
Ctrl + D Cmd + D 選択中のアセットを複製
Delete なし 選択中のアセットを削除(ダイアログ確認あり)
Delete + Shift Delete + Cmd 選択中アセットを削除(ダイアログ確認なし)
F2 Enter 選択中のアセットの名前を変更
F F フォルダ内の選択したアセットを表示
Tab Tab 左側カラム(フォルダ一覧とFavorites)と右側カラムを

自分が良く使うものだけ抜粋しました。

フィルタ機能
タイプ (t:)

Search by Type ボタンからアセットのタイプでフィルタリングします。 f:id:aki517:20180924133612g:plain

ラベル (l:)

Search by Label ボタンに設定されているラベルでフィルタリングします。 f:id:aki517:20180924133621g:plain

ちなみ以下のように任意のラベルを作成する事もできます。 f:id:aki517:20180924133630g:plain

アセットバンドル名 (b:)

その名の通りアセットバンドル名でフィルタリングします。 f:id:aki517:20180924134738g:plain

参照 (ref:)

これはほぼ使う機会がないのですが、パス or InstanceID 指定で参照するオブジェクトを検索します。Assets以下のアセット数が多くなると検索に物凄い時間がかかります。下手するとUnityエディタ固まります・・

例えば Assets/Scripts/Player.cs (InstanceID:12345)を参照するオブジェクトを検索する場合は「ref:Scripts/Player.cs」(Assets/を除く) または「ref:12345:」と入力します。
f:id:aki517:20180924133645g:plain

Scene内とかも検索する場合はこのスクリプト使ったほうが良いですね ^^;

qiita.com

ちなみに InstanceID は Object.GetInstanceID() で取得するか、下図のように Inspector > Debug に切り替えると確認できます。
f:id:aki517:20180924133605g:plain

お気に入り機能

検索結果に好きな名前を付けて左側カラムのFavoritesに保存できます。検索ファイル名 + フィルタといった複数条件も保存出来るので便利です。Unityエディタ単位での設定しか出来ず、プロジェクト単位での設定が出来ないのが懸念点ですが・・・

f:id:aki517:20180924121847g:plain

参考

プロジェクトウィンドウ - Unity マニュアル

【Linux】コマンドメモ

いまの業務でコマンド叩く事が多くなってきたので備忘録的なやつを残しておく、CUI上で全ての操作を行うサーバーエンジニアさん本当凄いです。。 ^ ^;)

cat
#ファイルの先頭10行を出力
cat memo.txt | head -10
#ファイルの末尾10行を出力
cat memo.txt | tail -10
find
# ホームディレクトリ以下のhtmlファイルを検索
find ~/ "*.html"
xargs
# 指定コマンドと初期引数に標準入力から読んだ引数を着けてコマンドライン生成して実行
# tempディレクトリ内のtxtファイルの先頭10行を表示
ls temp/*.txt | xargs head
grep
# test.txt内の"target"を検索
grep target test.txt
# ホームディレクトリ以下のtxtファイル内の'target'を検索
find ~/ *.txt | grep target

# input.txtファイル内の任意文字列がある行から2行後を表示
grep -A 2 -n "hogehoge" input.txt
# 2行前なら -B
grep -B 2 -n "hogehoge" input.txt
# 前後2行なら -C
grep -C 2 -n "hogehoge" input.txt
tail
# エラーログのリアルタイム監視
tail -f error.log
scp

リモートマシン間でファイルをコピーする

#ローカルで作成した公開鍵を www.example.co.jp に hogeユーザーでログインしてコピー (XXXXはipアドレス)
scp ~/.ssh/id_rsa.pub hoge@www.example.co.jp:/home/hoge/.ssh
du
# hogeディレクトリ以下のファイル容量表示
du /hoge
# ディレクトリだけでなくファイル容量も表示
du -a /hoge
# 単位付き表示
du -h /hoge
sed
# ファイル内の「goisagi」を「kosagi」に置換
sed -i -e "s/goisagi/kosagi/g"
pushd, popd

カレントディレクトリを変更する

pushd /var/log  #カレントディレクトリを /var/log に変更
  #何かの処理 
popd #pushd実行前のカレントディクトリに戻す

【Houdini】Game Development Toolset と Impostor Texture

久しぶりの Houdini です。普通にチュートリアル進めようと思ったのですが Side Effect Software 提供の Game Development Toolset というものがありゲーム用アセットの作成に便利な機能が色々と揃っているので今回はこれを試してみます!!

インストール

1.こちらGitHubから Clone または zipダウンロードして任意のディレクトリに解凍しておきます。私は C:\HoudiniTools 以下に配置しました。

2.次に houdini.env を開き、以下の様に環境パスを通します。

HOUDINI_PATH = {C:\HoudiniTools\GameDevelopmentToolset};&

houdini.envは各OSに応じて以下の場所にあります。

OS 場所
Windows C:\Users[username]\Documents\houdini[ver#]
OSX(Mac) /Users/[username]/Library/Preferences/houdini/[ver#]
Linux ~/houdini[ver#]

※[ver#]はインストールしたHoudiniバージョン番号

3.Houdiniを起動 シェルフの「+」> Shelves > Game Development Toolset を選択する事が出来ればインストールは完了です。
f:id:aki517:20180429193410p:plain

Impostor Texture

インストールが完了したので Impostor Texture という機能を使ってみます。カメラの視点によって参照するUVを切り替えることによって3Dオブジェクトのように見えるテクスチャを出力するものです。今回は Houdiniでテクスチャを出力 > Unityで描画までやってみます。
f:id:aki517:20180603201040p:plain

テクスチャを出力

まずは、Houdiniから Impostor Texture を作成して出力します。

1.シーンビューで Tabキー > Test Geometory: Tommy を作成、適当に名前を「geo_tommy」にしておきます。
f:id:aki517:20180603185915p:plain

2.ネットワークビューから Tabキー > GameDev > GameDev Imposture Camera Rig を作成、名前を「impostor_camera_rig」にしておきます。
f:id:aki517:20180603185920p:plain

3.ネットワークビュー上部のメニューから Other Network > out を選択して Outputs に切り替えます。
f:id:aki517:20180603185923p:plain

4.Tabキー > GameDev > GameDev Impostor Texture を作成します。
f:id:aki517:20180603185926p:plain

5.パラメータビューのBaseSettingタブで以下の設定を行います。
Render in One Image:チェックを入れる
Impostor Type:Full 3D Impostor を選択、全方位からレンダリングします。
Source Geometry:「geo_tommy」を選択
Camera Rig:「impostor_camera_rig」を選択
Sprite Resolution:128を設定、1マス辺りの解像度を指定します。
Frames Around Z Rot...:9を設定、こうすると45°毎にレンダリングします。
Output Picture:テクスチャの出力パスを設定します。
f:id:aki517:20180603201023p:plain

6.「impostor_camera_rig」を選択して、パラメータビューから Impostor ROP に 作成した Impostor Texture のパスを設定します。
f:id:aki517:20180603185929p:plain

7.Impostor Texture のパラメータビューに戻り「Render」ボタンをクリックするとテクスチャが出力されます。

Unityで描画する

1.最初にインストールしたGameDevelopmentToolsetフォルダ > unity > shader を UnityのProjectビューにドラッグ&ドロップします。
f:id:aki517:20180603201100p:plain

2.次にProjectビューからMaterialを新規作成して sidefx/Impostor Alpha Blended を選択します。
f:id:aki517:20180603201103p:plain

3.MaterialのInspectorビューから出力したテクスチャを設定、Rows と Columns は Sprite Resolution と同じ値を設定します。

4.Hierarchyビューからパーティクルを新規作成してRendererモジュールに先程のMaterialを設定して、更に Custom Vertex Streams に下図の順になるよう頂点ストリームを設定します。
f:id:aki517:20180603202532p:plain

Custom Vertex Streams についてはこちらを参照ください。
goisagi-517.hatenablog.com

5.これで準備は完了です。Unityの再生ボタンをクリックしてカメラをぐりぐり動かすと以下のようにカメラの視点に合わせてテクスチャUVの参照位置が切り替わります。なんか凄くシュールな絵になってしまいましたが・・(^_^;)
f:id:aki517:20180603203221g:plain

まとめ

今回は Game Development Tools のインストールと Impostor Texture 機能を試してみました。ちなみにHoudini内で設定したアニメーションもテクスチャとして出力できるので群衆の表現とか色々と応用が出来そうですね。

参考

GitHub - sideeffects/GameDevelopmentToolset: A series of Houdini shelf tools that are geared towards game developers! Impostor テクスチャ生成 | SideFX