トラブルシューティング

症状から対処を引ける形式でまとめています。

オブジェクトがライトマップに入らない

次を順に確認してください。

  1. Contribute GI の Static フラグが付いているか(Inspector 右上の Static ドロップダウン)。
  2. オブジェクトと Renderer が有効か(無効のものは既定で収集されません)。
  3. シーンに Hikari Lightmapper が 1 個だけ置かれているか。

光や影が別の面ににじむ・漏れる

ほとんどの場合、ライトマップ UV(UV2)の重複が原因です。

  • モデルに重なりのない UV2 があるか確認してください。UV2 が無い場合、Hikari はインポート時に UV0 を UV2 へコピーします。UV0 も無い場合は全頂点を (0, 0) として扱うため、そのメッシュはライトマップを正常に受けられません。モデルの Generate Lightmap UVs を ON にするか、手作業で UV2 を用意してください。より高品質な xatlas 生成への切り替えは UV2 の生成 を参照してください。

床に密着した面の接地部分だけが漏れる場合は、Advanced の Exclude Hidden Texels を試してください(Hikari Settings の Advanced)。

UV の境界にずれ・細い光漏れが出る

UV2 が重複していないのに境界のずれや細い光漏れが出る場合は、Unity の Vertex Compression によって UV の精度が不足している可能性があります。

  1. Edit → Project Settings → Player を開きます。
  2. Other Settings → Optimization → Vertex Compression を開きます。
  3. Tex Coord 0 と Tex Coord 1 のチェックを外して、UV の圧縮を無効にします。
  4. ライトマップを再度ベイクします。

Tex Coord 0 はマテリアル用 UV0、Tex Coord 1 はライトマップ用 UV2 に対応します。圧縮を無効にするとメッシュのメモリ使用量は増えますが、UV の量子化による位置ずれを避けられます。

ベイク結果がノイズっぽい

  • 環境光(スカイボックス・HDRI)が主光源で、窓や開口からしか光が入らない屋内シーンでは、Sampling > Env Light Samples を上げます(4 → 8 → 16)。環境光由来のノイズには Samples Per Texel を増やすよりはるかに安価に効きます。
  • Samples Per Texel を増やします(64 → 128 → 256)。
  • Denoise Mode が NL-Means になっているか確認し、Denoise Strength を上げます。

Play すると影がリアルタイムに戻る・ライトマップが外れる

他のライトマップベイクツールを併用していたシーンでは、そのツールが保存したバインドが Hikari の結果を上書きすることがあります。メニューの Hikari → Utility → Detach Foreign Lightmap Binding で切り離してから、再度ベイクしてください。

また、Unity 標準の Generate Lighting を実行するとベイク結果が上書きされます。Hikari 使用中は標準ベイクを実行しないでください。

「Hikari data was written by an incompatible format」というエラー

エンジンと Unity 側スクリプトのバージョンが食い違っています。.unitypackage を部分的にインポートした場合などに起きます。パッケージ全体を再インポートしてください。

同じ原因で、次の文言が出ることもあります。

  • Hikari data was written by an incompatible format (version N; current M).(Unity 側)
  • Hikari data was written by an incompatible format (version N; engine supports A-B).(エンジン側)
  • Mesh file '...' was written by an incompatible format (version N; engine supports A-B).(メッシュファイル)

ベイクが遅い

効果が大きい順に:

  1. Texels Per Unit を下げる(解像度を落とす)。
  2. Samples Per Texel を下げ、デノイザに任せる。
  3. Device で GPU を追加する(マルチ GPU 分担)。
  4. クラウドベイク にオフロードする(提供準備中のため、現時点では実行できません)。
  5. コースティクスが不要なら Caustic Mode を Off にする。

一時ディスク容量が不足する

ベイク中の巨大な作業配列は、RAM・VRAMとは別に一時ディスク領域を使います。データはプロジェクトの Temp/Hikari/EngineTemporary に保存されるため、このディレクトリがあるドライブの空き容量を確保してください。

GPU が列挙されない・ベイクが始まらない

Hikari ウィンドウの Device に GPU が出てこない場合は、次を確認してください。ベイクボタンを押しても進まない場合にも該当します。

  • Windows: GPU ドライバを最新にしてください。Vulkan GPU は shaderStorageBufferArrayNonUniformIndexing に対応している必要があります。この機能はソフトウェアレイトレーシングを使う場合にも必要です。
  • macOS: macOS 13.3 以降を搭載した Apple Silicon Mac が必要です。GPU は Metal のレイトレーシング機能に対応している必要があります。Hardware Raytracing をオフにしたローカルベイクには対応していません。
  • 共通: 他の Hikari エンジンプロセスが動いていないか確認してください。別のベイクや golden/render プレビューが動いている間は待機します。その場合は Waiting for another Hikari engine process to release the process lock. と表示されます。

macOS でエンジンの起動時に警告が表示される場合や、Could not list GPUs と表示される場合は、次の quarantine の項目も確認してください。

macOS で Hikari エンジンを起動できない

ブラウザなどからダウンロードした .unitypackage には、macOS が com.apple.quarantine 属性を付加することがあります。この属性が Hikari のエンジンファイルに残っていると、macOS が実行をブロックします。その場合は GPU の列挙やベイクを開始できません。

Hikari は起動前にこの属性を検出します。Hikari macOS Security ダイアログが表示されたら、内容を確認してください。Fix and Continue を選択すると、Hikari のエンジンファイルから quarantine 属性を解除して起動します。

Cancel を選択すると、エンジンを起動しません。次回の起動時に再度確認します。

自動修正に失敗する場合は、ターミナルで次を実行します。/path/to/UnityProject は対象プロジェクトの絶対パスに置き換えてください。

xattr -dr com.apple.quarantine "/path/to/UnityProject/Assets/SuzuFactory/Hikari/Editor/HikariEngine/macOS-arm64"

解除する対象は Hikari の macOS-arm64 ディレクトリだけに限定してください。macOS の Gatekeeper を無効にする必要はありません。

実行後に Hikari ウィンドウを開き直してください。その後、GPU の列挙またはベイクを再試行します。

ベイク中に Unity がクラッシュする(TDR)

ベイク中に次のような Unity Error ダイアログが出てエディタが強制終了することがあります。

Failed to present D3D11 swapchain due to device reset/removed. This error can happen if you draw or dispatch very expensive workloads to the GPU, which can cause Windows to detect a GPU Timeout and reset the device. … This is an unrecoverable error and the editor will shut down.

これは Windows の TDR(Timeout Detection and Recovery) によるものです。GPU が一定時間(既定 2 秒)以内に OS へ応答しないと、Windows は「GPU がハングした」とみなしてデバイスを強制的にリセットします。リセットされると Unity は描画先(スワップチェーン)を失い、復帰できないためエディタごと終了します。

Hikari のベイクは GPU を長時間フルに使うため、その裏で Unity 自身の描画が 2 秒以内に終わらず TDR が発動する、という形で起きます。落ちているのは Hikari ではなく Unity 側で、Unity の不具合でもありません。

対処(まずこちら)

Hikari ウィンドウ(メニュー Hikari → Hikari)の Device セクションで、GPU をベイクに占有させすぎないように調整します(Device 設定)。

  1. GPU Priority を Low にする — ベイク中も Unity やデスクトップの描画が GPU を使いやすくなります。
  2. それでも落ちる場合は GPU Usage (%) を下げる(既定 90 → 50 など)— サブミットの合間に GPU をアイドルさせるため、Unity の描画が割り込む余地ができます。ドライバの優先度制御に依存せず、どの GPU でも効きます。

いずれもベイクは遅くなりますが、その分だけ Unity 側の描画に余裕が生まれ、TDR を回避できます。値を下げるほど安定しますが遅くなるため、落ちなくなる範囲で少しずつ調整してください。

それでも落ちる場合:TDR の緩和・無効化

警告自己責任で行ってください

以下は Windows のレジストリを変更して TDR を緩和・無効化する方法です。自己責任で行ってください。 TDR は本来、GPU がハングしたときに自動復旧させるための安全機構です。無効化すると、実際に GPU がハングした場合に自動復旧できず、画面が固まったままとなり電源長押しでの強制再起動が必要になります。レジストリの変更前にバックアップを取り、可能なら完全な無効化ではなくタイムアウトの延長(TdrDelay)から試してください。

対象キー(regedit で開きます):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
値の名前 型 内容
TdrDelay DWORD GPU の応答を待つ秒数。既定は 2。まずはこちらを少し延ばして、落ちなくなる範囲で最小限にとどめるのが安全側です
TdrLevel DWORD 0 で TDR の検出自体を無効化(最終手段)。既定は 3(タイムアウト時に復旧)
  • 値が存在しない場合は新規に DWORD (32 ビット) 値として作成します。
  • 変更後は Windows の再起動が必要です。
  • 元に戻すには、作成した値を削除する(または TdrDelay = 2 / TdrLevel = 3 に戻す)だけです。