Unity2018.2 へ移行したときの修正点や気になったことをメモメモ…
Unity5.6.3から現行の最新版Unity2018.2.1にアップデートしてみました。本当は今のプロジェクトが完成するまで無理やり5.6で押し切ってもよかったのですが、ビルド後のテストプレイ中にバグっぽいものを発見してしまい、対策するのもめんどくさかったので「最新版では修正されていてくれ…」と願いつつそのままアップデートしてしまったのでした。
Unity5.6 ビルド後に色がおかしくなるバグ
ちなみにそのバグというのはこれ。真ん中の木の幹とその他の幹とでは微妙に色合いが異なっています。実は両者の違いは「 Static バッチングを有効にしているかどうか」のみ。中央の木のオブジェクトは Static の項目を "Nothing" に、周囲の木は "Batching Static" にしています。ライトマップを焼いているかどうかや Reflection Probe を使用しているかどうかなどには関係なく発生。しかもエディタ内のシーンビューやゲームビューでは正常に描画されています。
もしかしたら意図した仕様なのかもしれませんが、仕様だとしてもさすがにエディタとビルド後の画面がここまで違うのはおかしい。しかもこの現象が発生するのは狭い範囲の茶褐色だけで、他の色では全く問題ありません(上の画像では緑の部分は正常)。「どう考えてもバグだろこれ!」ということで回避策を探すことすら諦め、気が付いたらUnityのダウンロードボタンを押していたというわけです。
Unity2018.2 導入
導入はめちゃめちゃ簡単ですね。インストーラーを起動して利用規約に同意、「ドキュメントだけで390MBもあるの…これはやめとこ…」とかなんとか言いつつインストールするコンポーネントを選択、念のため5.6はそのままにして別フォルダを作成しインストール先に指定。その先は全部自動でやってくれます。あとは最もドキドキする部分、旧バージョンのプロジェクトを現行版に変換する作業です。1年半近く前のバージョンからの移行…プチ浦島太郎状態で一体どれだけエラーが出るのか想像しただけで戦々恐々としていたのですが、実際やってみると警告はいくつか並んでいたものの致命的なエラーはほぼ出ることなくすんなり移行作業は完了してしまいました。ちょっと拍子抜け。
ただ、若干手を加えないといけない箇所もあったので、今後のために今回の修正点をメモしておこうと思います。
組み込みの Standard シェーダを利用していた自作シェーダの書き直し
もともと組み込みの Standard シェーダや cginc ファイルをちょっこっと改造して LODGroup のクロスフェードに対応させていたのですが、今回のアップデート後にエラーが出たため修正することになりました。バージョン5.6の頃は UnityCG.cginc 内に Dither Fade 用の便利な関数が定義されていましたが、どうやらいつの間にか削除されてしまったようです。そのまま残しといてくれてもいいじゃん!ケチ!…ただ、調べてみるとこの変更は2017.1の段階ですでに加えられていて、実はサーフェスシェーダで使用する #pragma surface … ディレクティブに dithercrossfade と書くだけで勝手に Dither Fade に対応してくれるようになったそうです。なんという神対応。ケチとか言ってすみませんでした。
Standard Particle シェーダを組み込みのものと統合
標準シェーダのライティングやカメラフェードなどを手軽に行える高機能なパーティクル用シェーダ Standard Particle ですが、2017.3からUnityに組み込まれるようになったみたいです。ただ自分の場合は正式に組み込まれる前にフォーラムなどで配布されていたものをすでに導入(&改造)していたため、競合しないようにシェーダ名を分けるなどの修正を行いました。また、パーティクル関連でいうと Particle System の Render の項目にある "Apply Active Color Space" にチェックを入れるとパーティクルの色を現在の色空間の設定に合わせて変換してくれるようになりました。やっとかよ! Unity5.6 の頃はわざわざシェーダ内でガンマ⇔リニア変換用の処理を書いて対応させていたのですが、ようやくコンポーネント側で対応してくれるようになったようです。ただしまだスクリプトからは変更できない模様。
Color Picker 関連の警告を修正
ColorUsageAttribute の一部パラメータ設定が Obsolete になっていたので書きかえ。あとシェーダGUI用のスクリプトでも Color Picker 絡みのエラーが出ていたので適当に削除して解決しました(もはや記憶にない)。そういえばいつの間にかカラーピッカーのGUIも変わってますね。なんだかかわいいゾ。
Lighting Data の作りなおし
"Lighting data asset ‘LightingData’ is incompatible with the current Unity version. Please use Generate Lighting to rebuild the lighting data. ..."
という警告が出るようになりました。これは書かれてあるとおり Lighting タブから Generate Lighting ボタンを押してシーンごとにベイクしなおせば解決。簡単です。
Command Buffer のスクリプトを修正
今回最も頭を悩ませたのがコレ。ステンシルマスクとコマンドバッファを使用して画面にエフェクトをかけている場面があったのですが、なんとそのエフェクトが機能していないのを発見。エラーも警告も出ていないのですが、スクリプトから作成してカメラに追加したコマンドバッファが Unity5.6 のときとは違う挙動をしているようでした。Frame Debug 機能でひとつずつ処理を追ってみると、どうやら SetGlobalTexture でシェーダ側に送ったはずのテクスチャが消えてしまっていることが判明。さらにいろいろなコマンドを試してみたのですが、 ReleaseTemporaryRT を実行したときにグローバルテクスチャが消えずにちゃんと残っていたり残っていなかったり…という不可解な動作をしていたのでたぶんこのあたりが原因っぽいかなと当たりをつけました。複数のカメラ、複数のタイミングでいくつもコマンドバッファを実行していたのですが、その際、取得したゲーム画面を使いまわしていたのがマズかった模様。マニュアルにも書かれているとおり、GetTemporaryRT で作成した RenderTexture は通常コマンドバッファの処理が終了した時点で削除(解放)されます。詳しいことはわかりませんが、おそらくこの RenderTexture が解放されたことでテクスチャにも影響を与えているんじゃないかなと推測しました。
そうなると解決方法は単純で、コマンドバッファごとに取得した画像を使いまわす場合は一旦ローカルの RenderTexture に保存しておき、必要になった時点でグローバルテクスチャとしてシェーダ側に送ればいいわけです。一応これで意図通りの動作をするようにはなりました。ただ、マニュアルを読んでもググってみても詳しい情報が見つけられないため、何が「正解」なのかはまだよくわかりません。もしかしたら公式の対応を待ったほうがいいのかも…
複数シーン読み込み時の警告について
エディタで複数シーンをロードした場合、各シーンのライティング設定が異なっていると警告が出る仕様に変わったようです。たとえばこんな感じ↓
"Your current multi-scene setup has inconsistent Lighting settings which may lead to different lighting when loading scenes individually or in a different order! Consider homogenizing the following: 1/2 scenes use different skyboxes."
この場合は「スカイボックスが違うよ」ということですね。これはリリースノートにも「加算的シーンライティングの警告」として記載されています。期待通りの結果が出なかった場合に原因を特定しやすくするためだと説明されていますが、ぶっちゃけ余計なお世話な感じも…。案の定フォーラムでも「ON/OFF切り替えできるようにせんかい!」というような声が上がっています。そりゃそうだ。
何はともあれ新機能が楽しみ
以上、修正点をメモしてみました。ちょっとめんどくさかったですが大きな問題もなく移行できてよかったです。しかたなく移行したバージョン2018.2ではありますが、やっぱり改良点や新機能もかなり多いのでわくわくします。Shader Graph や ProBuilder 、 TextMesh Pro なんかも試してみたいですし、前から気になっていた Aura - Volumetric Lighting もさっそく導入してみたいです。あ、ちなみにUnity5.6で発生していたバグらしきもの(ビルドすると一部色調がおかしくなる)はアップデート後に綺麗さっぱりなくなりました。やっぱバグじゃねーか!
0 件のコメント:
コメントを投稿