【Unity】パーティクルシステムで光剣っぽいエフェクトの作成

というわけで、仕事繁忙のため全然更新できていませんが、今回のお題はこちらです!

shot2ss20161001091241801

剣のモデルから「光の剣」のようなものを出してみました!
「武器に光が纏って強くなる」なんてシチュエーションはファンタジーなゲームでよくありますよね!
プレイヤーがこの状態になると攻撃力やリーチが上がり、見た目と相まってテンションが上がったりします。

パーティクルシステムの Renderer モジュールで、生成するパーティクルの形状を変化させることができます。
初期状態では Billborad ですが、これを Mesh にしてモデルを指定すればOKです。

このあたりはテラシュールブログさんに分かりやすく記載されております。

下準備

パーティクルのベースとなる剣のモデルを作成します。
剣といっても柄の部分は不要で、刃の部分だけそれっぽくなっていればいいので、割と適当でも問題ありません。
そんなわけで、Blender でさくっと作ってみました。

shot2ss20161001100028913

今回は専用のモデルを作りましたが、キャラクターが剣を持っている場合はそのメッシュを使ってしまっても大丈夫です。
ただし剣の刃と柄が1オブジェクトに結合されている場合、パーティクルのエフェクトに柄も反映されてしまうので注意が必要です。
専用のモデルを作ると剣の形に依存しなくもなるので、モデルの状態や作成するゲームの雰囲気に合わせて・・・といった感じでしょうか。

ベースエフェクトの作成

光の剣となるエフェクトを作成します。
新規でパーティクルシステムを作成し、パラメータを設定していきます。

shot2ss20161001092021719

shot2ss20161001092101239

ポイントはやはり Renderer モジュールのメッシュ指定です。
これを剣の位置・移動に合わせるため、 剣に近い bone の子オブジェクトに設定し微調整します。

地味に詰まった点として、RenderMode を Mesh にし、シェーダーを Particle~ 系にすると、画面上に表示されなくなってしまいました。
ProjectSettings→Player→Other Settings→Auto Graphics API for Windows にチェックを入れることで解決しました。

shot2ss20161001092242887

新規プロジェクト作成時はチェックが入っているので外れている理由が分かりませんが、Windows10 にしたから・・・かも?
7→10のアップデート時にいろいろトラブったので、関係がないとは言い切れなそうです。

shot2ss20161001093940980

出来上がったのがこちら!
ちょっと安っぽい感じはしますが、雰囲気だけならそれなりに出来ているのではないでしょうか。
マテリアルの設定とかテクスチャとか拘ればもっと見た目はよくなると思われます。

20161001_01

振り回すとこんな感じに。
見た目は剣のリーチが伸びたように見えますが、現状では攻撃判定が伴っていない詐欺エフェクトだったりします。
通常時と光剣時で攻撃判定を分ける必要がありそうです。

ちなみに剣の軌跡の部分は「X-WeaponTrail」というアセットで簡単かつ綺麗に作れます。
下の記事で紹介しています。

「X-WeaponTrail」を使った武器の軌跡について

サブエフェクトの作成

↑だけでは寂しいので、何か適当にエフェクトを追加してみます。
関連オブジェクトをまとめるための空オブジェクトを作成し、先ほどのパーティクルを子オブジェクトとした上で追加していきます。

まず簡単にできるエフェクトとして、剣から少しオーラが出ているような見た目にしてみます。
メインエフェクトを複製し、Start Speed を少しだけ上げてみました。

shot2ss20161001095516161

もし「水の剣」など流動的なものを想定する場合は Start Speed ではなく、 Gravity Modifier を使うとそれっぽい見た目になります。
上げすぎると自己主張が強くなるので、少しだけ上げましょう。

shot2ss20161001100342543

あとちょっとしたエフェクトとして、剣の周りに粒子を出してみます。
今度は Shape を Mesh にして先程と同じ剣のモデル選択し、RenderMode は Billborad にします。
その他はデフォルトのマテリアルで適当に。

shot2ss20161001095638977

エフェクトとはちょっと違いますが、光剣という名目なのでライトが欲しいところです。
適当に PointLight を追加します。

shot2ss20161001095747584

上は Range が50、 Intensity を1.5に設定してあります。
Directional Light が効いていると微妙ですが、暗い場所なら目立つ・・・かも。

まとめ

そんなわけで、パーティクルシステムを使った光の剣 (っぽいもの) について考えてみました!
攻撃時の見栄えがかなりよくなるので、強力な攻撃の際には付けると良さそうです。

【Unity】パーティクルシステムのSkinned Mesh Rendererについて

というわけで、Unity5.3 からパーティクルシステム (Shuriken) の Shape に「Skinned Mesh Renderer」が加わったそうです!
ちょっと気になったので、どんな感じの機能か使ってみました!

パーティクル設定

当然ですが、「Skinned Mesh Renderer」が付いたオブジェクトが必要です。
3Dモデルをインポートすればメッシュに付いてくるので、適当な自作キャラクターの体を使います。

shot2ss20160907233803185

シーン内の Skinned Mesh Renderer を指定すると、パーティクル本体をどこに配置しても、指定したメッシュに合わせてレンダリングされます。
故に空オブジェクト内に整理して置いたり、キャラクターの子オブジェクトにしても問題ないようです。
他にもメッシュからの生成位置(オフセット)を調節したり、マテリアルの色をメッシュに合わせたりできます。

shot2ss20160908001214777

この状態で再生すると、上のようにキャラクターのメッシュに合わせてパーティクルが生成されます。
体からオーラが出ているような感じですね。
「Start Speed」や「Color Over Lifetime」をいじるともっとそれっぽくなります。

キャラクターのメッシュを分けている場合、その分だけパーティクルを作成・設定しておく必要があります。
画像のマリンパも「頭」「上半身」「下半身」と無駄に分かれていたりします。

何が良いかと言えば、「アニメーションの動きに合わせてパーティクルを出せる」ことでしょうか。
今までは固定のメッシュに対してレンダリングするのが限界だったので猶更ですね。
「ダッシュ中にキャラクターの形に合わせてエフェクトを出す」といったことも簡単にできるようになるかも。

いじって分かったこと

「アニメーションの動きに合わせてパーティクルを出せる」と書きましたが、その時点のメッシュの位置に合わせて生成するだけです。
生成後もメッシュに合わせて追従してくれる・・・なんてことはありません。
「Simulation Space」を Local にするとオブジェクト自体の移動には付いてきてくれますが、メッシュの移動には付いてきてくれません。
「アニメーションに合わせてリアルタイムで動かしたい」というケースでは不向きかと思われます。

また、流石に Cloth コンポーネント適用時の動きには対応してくれないようです。

shot2ss20160907232506900

マント (赤い部分) に Cloth を追加し、軽く動かした状態でパーティクルを出してみましたが、(分かりにくいですが) SkinnedMeshRenderer 元々の位置にレンダリングされます。
Cloth の動きに合わせてパーティクルを出すのは大変そうなので、こればかりはしょうがない部分でしょうか。

という点を踏まえると、使い道がありそうでないかもしれません。
手持ちの武器を光らせるのに手っ取り早いかなーと思いきや、パーティクルが追従してくれないので微妙でした。

応用例

「生成後はアニメーションの動きに合わせて移動しない」ことから、アニメーション中に断続的に生成すると残像っぽいエフェクトになります。
これを高速で動くオブジェクトに適用すると面白そう。

shot2ss20160910201151286

「Duration」と「Start Lifetime」の値を短めに調節します。
短時間にドバッとパーティクルを出す場合、Rate を0にして Bursts を設定するといい感じです。
「Simulation Space」は World に設定。
色やサイズ、スピード等はお好みで。

20160910_01

自分のキャラは小さめなのであまり実感はありませんが、頭身の高い人型ならもっと見栄えはよくなるかも。
もっとサイズやスピードを上げても良さそうですね。

まとめ

そんなわけで、パーティクルシステムの「Skinned Mesh Renderer」を試してみました!
ネタがないときはこんな感じで「Unityの気になった機能」を調べてみるのもいいかもしれません。

【開発メモ】Effekseerを使ったエフェクトの作成

というわけで、まだまだPHPな日々なりべるんです。
やっとSymfony2にも慣れてきましたが、未だに詰まる部分もあります。
EntityやType、DBとの連携など、意識すべき部分が多いです。

今回はエフェクト作成ツール「Effekseer」を使ってみました!
オープンソースのフリーソフトで、GitHub上で公開・開発されています。

エフェクト作成ツール自体は前からいろいろ探しており、有名所の「Prominence」や「SpriteStudio」は訳あって断念した経緯があります。
Effekseerはオープンソースで、かつUnityとの連携プラグインもあるとのことなので、ちょっと使ってみることにしました!
基本的に作成物も含めてフリーのようですが、使用するゲームを公開する場合はコピーライト表記が必要らしいです。

Unity標準のShurikenを使っていませんが、利便上「パーティクル」カテゴリに分類してあります。
何かしっくりこないので「エフェクト」とかに名前を変えた方がいいかも。

エフェクトの作成

所謂「ソニックブーム」のような衝撃波をEffekseerで作ってみます。
「横向きの衝撃波→横向きと縦向きの衝撃波→衝撃波の移動」のような感じになります。

sordwave

下準備として、衝撃波のテクスチャを作成します。
GIMPで適当に刃の形を作り、フィルター→変形→風で調節します。

・・・透明な背景に白いテクスチャだとさっぱり分からないですねorz
一応画像にマウスポインタを乗せるとうっすらと見えます。

shot2ss20151112215027049

Effekseerを起動し、描画共通タブから衝撃波のテクスチャを読み込みます。
ノードに対して以下のように設定しました。

【共通】
・生存時間:中心、40

【回転】
X:120、Y:270、Z:0

【拡大】
X:15、Y:15、Z:12

【描画】
・描画:スプライト
・配置:固定
・ブレンド:加算
・フェードイン:あり、フレーム数10

バージョンの違いか、画面レイアウトが若干異なっている場合があります。
自分の場合、「回転」の項目がなかったので、メニューのウィンドウから表示させました。

shot2ss20151112215452840

次に縦と横両方の衝撃波を生成するため、ノードを2つ追加します。

最初の衝撃波の生存時間が40なので、生成開始時間を40にします。
適当に回転角度を付け、縦と横で十字になるように調整。
あとは衝撃波を移動させるため、「位置」タブの速度のZを1.5に設定します。
他のパラメータは最初のものとほぼ同じです。

完成間際になって重要なお話ですが、Unityへインポートした際のXYZ軸に注意する必要があります。
Effekseerビュー上の青い線の方向が前になるように作ると上手くできます。

・・・とここまで書きましたが、正直分かりにくいと思われます!
今回のサンプルとして、以下のリンクからファイルとテクスチャをダウンロードできます。
こちらを見て頂いた方が手っ取り早い・・・かも。

サンプルダウンロード

プロジェクトを開いた際にエラーが出る場合、各ノードのテクスチャを解除→再選択すると直ると思います。

インポートと実行

Effekseer公式からUnity用プラグインをダウンロードし、Assets上にインポートします。
空のGameObjectを作成し、EffekseerEmitterを付与します。

shot2ss20151112215813049

PlayOnAwakeやLoopはUnityのパーティクルと同じですね。
EffectNameにはEffekseerからエクスポートした.efkファイルの名前を指定します。
・・・のですが、デフォルトでは「/Assets/StreamingAssets/Effekseer/」直下のディレクトリを参照しにいくようです。
StreamingAssetsなんてディレクトリは作っておらず、そもそもエフェクト系は別ディレクトリで管理しているので、そこを参照しにいくようにソースコードを修正します。
EffekseerSystemの15行目付近になります。

public static string resourcePath
{
    get {
        return Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Assets\\Particle\\Effekseer");
    }
}

GetCurrentDirectory()でプロジェクトまでの絶対パスが取得できるので、あとはAssets~から先のパスを指定します。
自分は「Assets/Particle/Effekseer」にしました!
上記ディレクトリ内に.efkファイルを放り込み、再度実行してみます。

shot2ss20151112215702041

今度はしっかり再生されました!
ちょっとエフェクトを入れるだけでもかなり違うもので、前に紹介した「X-WeaponTrail」と合わせると攻撃系は別物と言えるレベルになります。

注意点として、作成時にテクスチャ等の外部ファイルを使用した場合、Effekseerのプロジェクトファイル(.efkproj)から見た相対パスで参照が保存されるようです。
そのため、出力ファイルとプロジェクトファイルのディレクトリが異なると外部ファイルを上手く読み込めません。
出力・プロジェクト共に同一ディレクトリ内に放り込んでおくのが確実かと思われます。
自分は上で参照パスを変えているので、「Assets/Particle/Effekseer」内に保存し、テクスチャはその中にtextureというディレクトリを作って参照しています。

まとめ

そんなわけで、フリーソフト「Effekseer」を使ってエフェクトを作ってみました!
単純なエフェクトならUnityで十分ですが、派手なものや複雑なものはEffekseerを活用して作っていきたいです。