土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

"unity シェーダー"で土屋のシェーダー本にリーチしないのが悔しい

 悔しいのでエントリ名にしました。本文とは関係ありません。
 シェーダー本3の作業が佳境に入っていましてブログを書く余裕がありません。小ネタを幾つかまとめて。

ハマりポイント:VisualStudioのアップデート

 Unity2018.3でちょっとしたC#コードをビルド使用としたら大量のエラーが出てコンパイルできませんでした。2018.2でも状況が変わらず、いつのまにか土屋の環境ではビルドができなくなっていました(いつからこうなってたのか正直分からない)。
 出力結果を見る限り、「.NET Frameworkが現在の環境より新しいバージョンをターゲットにしているためコンパイルできません」的なことらしく、色々試した結果、Visual Studio 2017をアップデートしたら治りました。ちゃんと記録してないけど、以前のVSは15.5.2くらいだった思います。アップデート後は15.9.7です。
 しかしこの現象、いつから発生していたのかな……。2018環境はシェーダーの検証がメインで、C#スクリプトを書く時は主に2017環境を使っていたので、よくわからない……。

Unity2018.3.6はまだ安定していない(のか?)

(※これ結構前に書いた物なので、最新の2018.3.6では改善してるかもです)
 シェーダー本3はUnity2018.3.0までの環境を対象としていて、それより先のバージョンをインストールしていないのですが、ある時ハマってた問題がUnityのバグなのかどうかを確認する為に、最新版の2018.3.6をインストールしました。
 結果としてUnityのバグではなかったのですが、その検証の最中にUnity2018.3.6が起動中にウィンドウ全体がピンクになったままフリーズする事が2回発生しました。たまたま事象が重なっただけかもですが、まだ最新環境に移行するのは早いかな……。

Shadow Distanceのフェード値の設定方法はない(マジか)。

 通常、リアルタイムシャドウはShadow Distanceの距離までにフェードで消えるのですが、このフェードの割合を設定するパラメーターは用意されていません(マジか)。
 海外ではUnityComputeShadowFadeを改造して対応する人が多い模様です。
https://forum.unity.com/threads/shadow-fadeoff-approaching-far-clip-plane.356893/
 ちらっとコード読んでみたんですが難しくていったん諦めました。どうもスクリーンに対して水平にフェードさせるためにずいぶんとトリッキーな事をしているようで、単純にオフにするのも難しいようです。

商業ゲームでデータを管理する方法

 国内では「エクセル(あるいはCSV)でテーブルを作り、そのデータをバイナリファイル化し、プログラムから読み込む」という方法が多いと思います(少なくとも土屋が見てきた現場はどこもそうだった)。
 Unityではcsvをアセット化し、リソースデータとしてそのまま読み込めるのが非常に便利なんですが、csvを編集するたびにUnity Editorで更新処理が走るのが地味にストレスです(スケールする気がしない)。とはいえバイナリファイル(*.bytes)にしても更新処理はかかるのか……? どこかで検証しておきたい。
 なんでここにこだわっているかと言うと、商業ゲームでは管理するパラメーターが膨大になるので、当然このデータもファイル数、ファイルサイズ共に膨大になります。なので可能な限り開発時には編集や変換がしやすく、実行時には高速に取り込みたいのです。
 C/C++時代はメモリマップドファイルという手法が使われていました。これはバイナリファイルをメモリ上に展開し、そのメモリの先頭アドレスを構造体(共用体)配列のポインタに代入することでO/Rマッピングを達成するという物です。当然ながらこれは危険な方法で、ちょっとデータが壊れると即ハングする事が日常茶飯事でしたが、トータルでの作業効率が優先されました。
 C#で同コスト処理を実現するのは難しいと思いますが、MessagePackForC#が使えそうです。シェーダー本が一段落したら試してみたいと思っています(いつなんだそれは?)