2018年9月16日日曜日

Unity2018で旧来のパーティクルがエラーになる

最近過去プロジェクトを Unity2018.2.7f1 で開いたところパーティクル関連でエラーが出るようになったので調べてみた。


エラーの概要 

エラーになるのはクラス ParticleEmitter や ParticleAnimator。
所謂 Legacy Particleコンポーネント。

これに代わる新しいパーティクルコンポーネント Particle System に完全移行が予定されているらしい。
Unity2018でいよいよLegacy Particleコンポーネントが使えなくなった、ということみたいです。


移行とUnityのバージョン対応はだいたい以下の通り。
  • Unity2017.4 以前
    Legacy Particleコンポーネント、Particle System 共に動作する。
    ※このUnityバージョンで移行作業を行うといずれも動作するのでやりやすい感。
    実際に動作してるパーティクル結果の比較もできるので。
  • Unity2018.1以降
    Legacy Particleコンポーネントは「今のところ」一応残っている。
    ただし各プロパティが Read Only でスクリプトから変更できない。
    ※近いうちに完全に消えるらしい。
    少なくとも 2018.3 では コンポーネントのクラスも無くなっている。C#ソースコードでコンパイルエラーが出る為、実質 Particle System への移行が必須になった様子。

従来この手のケースでは新しいバージョンのUnityでプロジェクトを開いた時、C#ソースコードの自動変換が走ってなんとかしてくれることが多かった。
(コンポーネントのプロパティ値変更がメンバ関数経由になった頃とか)
が、この件に関しては自動では変換できない。


対応方法概要

大まかに以下の2つの対応が必要。
  1. オブジェクトに付いている Legacy Particleコンポーネント を Particle Systemへ置き換える作業。
  2.  Legacy Particleコンポーネントを制御していたC#ソースコードを Particle System対応に修正する作業。

「1.」のコンポーネントの置き換えは自動変換できるEDITORスクリプトが公開されているのでそれを利用すれば楽ができる。
ただしUnity2018.3以降でしか利用できないと明記あるので注意。
※Unity2018.1~Unity2018.2では動作しないので注意。

「2 .」のC#ソースコードは手動で書き換えが必要。

コンポーネント自動変換手順

自動変換できるEDITORスクリプトをダウンロードして、シーン内の Legacy Particleコンポーネントを一括変換する。
  1. Unityフォーラムのココを開く
    https://forum.unity.com/threads/release-legacy-particle-system-updater.510879/
  2. ページ下の方のにある「Legacy_Particle_System_Updater.cs]をダウンロードする。
    ※Unityの中の人が作成したものらしいが、一応プロトタイプと明記されているので色々自己責任(?)で使用。
  3.  UnityのAssetsフォルダ内のEditorフォルダに入れる。
    無ければAssets直下にフォルダ名 Editor を作成してそこにドラッグ&ドロップで入れる。
  4. 一旦Unityを再起動。目的のプロジェクトを再度読み込む。
  5. ツールバーから、Assets>Upgrade Legacy Particles が新たに選べるようになっている。これを選択する。
  6. 「Upgrade Legacy Particles 」ダイアログが開く。
  7. 「Cleanup Mode」のプルダウンから
    ■「Disable Legacy Renderer」を選んだ場合:
    Legacy な Component は削除はされないがコンポーネントをDisableにする。
    とりあえず以前のパラメータ等確認目的で残しておきたい場合等。
    ■「Delete Legacy components」を選んだ場合:
    Legacy な Component は自動的に削除する。
  8. 「Upgrade Everything」ボタンを押す。
    シーン内の Legacy Particle コンポーネントのある個所に、新しい Particle System コンポーネントを自動的に新規追加してくれる。
    この際、Legacy Particleコンポーネントの各種設定パラメータを読み取って、新しく追加する Particle System コンポーネントを自動的に反映してくれる。
    ※Particle AnimatorのColor遷移の指定値なども引き継いでくれるので便利。


C#の制御コード書き換え

    これは手動で書き換えないとダメ。

    パーティクルのON/OFF制御

    とりあえずこんな感じで置き換えられる。

    ----- Legacy Particle コード-----
    void SetParticle(bool sw) {
        ParticleEmitter pe_FX = GetComponent<ParticleEmitter>();
        pe_FX.emit = sw; // パーティクルON/OFF
    }

    ----- 新Particle System コード-----
    void SetParticle(bool sw) {
        ParticleSystem ps_FX = GetComponent<ParticleSystem>();
        if(sw==true) {
            ps_FX.Play();
        }
        else {
            ps_FX.Stop();
        }
    }

    パーティクル色遷移制御

    Legacy Particle だと Particle Animatorコンポーネント に色変化を配列で持たせることができた。C#ソースコードからこれの書き換えも配列書き換えで安易にできた感。

    新Particle Systemコンポーネントだと Inspectorで見える各種モジュールの「Color over Lifetime」がこれに相当。
    「Color over Lifetime」にチェックを入れて、その中の「Color」にある時間遷移点
    (デフォルト5か所)のRGB(下部)とALPHA(上部)を修正すればできる。これをC#ソースからやれば良い。

    C#ソースからのやりかたは公式ドキュメントに記載あり。


    Unity DOCUMENT(2018.2): ParticleSystem.colorOverLifetime


    クラスGradientであらかじめ、

    • 時間遷移位置とRGB値群
    • 時間遷移位置とALPHA値

    を生成しておき、メンバcolorOverLifetime下のcolorに設定して反映する感じ。
    ※RGBとALPHAが個別指定できるようになった。

    サンプル
    GitHub: Sample_LegacyParticle_to_unity2018
    (https://github.com/maruton/Sample_LegacyParticle_to_unity2018)





    0 件のコメント:

    コメントを投稿