Appearance
フィードバック1028
修正サマリー:根本原因と解決方法
問題の推移
- 3画面表示 - メイン + 余計な画面 + Looking Glass
- UI操作不可能 - ボタンがクリックできない
- UI描画異常 - 横縞、崩れ、NVIDIAオーバーレイ異常
根本原因(4つ)
1. CalibrationLoader の Display 自動Activate
問題:
Display.displays[1].Activate()をハードコードで実行- Display 1 が必ずしも Looking Glass ではない
解決:
- 自動Activate を削除
- LenticularPlayer で動的検出に変更
ファイル: Looking Glass Plugin/Scripts/CalibrationLoader.cs
2. Player Settings のバックグラウンドレンダリング
問題:
runInBackground: 1→ すべてのDisplayにレンダリング- フォーカス状態に関係なく描画される
解決:
runInBackground: 0visibleInBackground: 0
ファイル: ProjectSettings/ProjectSettings.asset
3. InputSystemUIInputModule の無効化
問題:
m_Enabled: 0でUI操作が機能しない- UI Toolkit でも一部入力は EventSystem に依存
解決:
m_Enabled: 1(最終的に EventSystem 削除で解決)
ファイル: QuiltLoader/Scene/QuiltLoader.unity
4. Canvas と UIDocument の混在(最重要)
問題:
- 同じDisplayに Canvas(uGUI)と UIDocument(UI Toolkit)が混在
- レンダリングパイプラインの競合
- 描画順序の問題で横縞・崩れが発生
解決:
- 完全に分離
- Display 0: UIDocument ONLY(メインUI)
- Display 4: Canvas + RawImage ONLY(Looking Glass表示)
理由:
- Canvas (uGUI) と UIDocument (UI Toolkit) は異なるレンダリングパイプライン
- 同じDisplayに混在すると競合する
- 完全に分離することで干渉を排除
ファイル: QuiltLoader/Scene/QuiltLoader.unity
実施した修正
修正1: CalibrationLoader.cs
diff
- if (Display.displays.Length > 1) {
- Display.displays[1].Activate();
- }
+ // Display 1 を自動的にActivateしない
+ // LenticularPlayer が適切なディスプレイを検出修正2: Player Settings
diff
- runInBackground: 1
- visibleInBackground: 1
+ runInBackground: 0
+ visibleInBackground: 0修正3: LenticularPlayer.cs
- メインウィンドウサイズを 800x600 に設定
- Looking Glass Display を動的検出(CalibrationSync.GetLKGDisplayIndex)
- Camera と Canvas の targetDisplay を動的に設定
修正4: シーン構成の分離
削除:
- EventSystem
- 古い Camera(無効化されていたもの)
構成:
Display 0 (メイン):
└─ UIDocument
- PanelSettings.targetDisplay: 0
- 操作UIのみ
Display 4 (Looking Glass):
├─ LKGCamera (Camera, targetDisplay: 4)
└─ LKGCanvas (Canvas, Screen Space - Camera, targetDisplay: 4)
└─ LKGRawImage (RawImage, Lenticular表示)解決のポイント
- Display 管理を動的に
- ハードコードを削除
- キャリブレーションデータから検出
- レンダリングパイプラインを分離
- Canvas (uGUI) と UIDocument (UI Toolkit) は混在させない
- Display ごとに最適な技術スタックを使用
- バックグラウンドレンダリングを抑制
- Player Settings で無効化
再現手順
- CalibrationLoader から Display 自動Activate を削除
- Player Settings:
runInBackground: 0,visibleInBackground: 0 - Looking Glass の動的検出を実装(CalibrationSync.GetLKGDisplayIndex)
- シーン構成を分離:
- Display 0: UIDocument ONLY
- Display 4: Canvas + Camera + RawImage ONLY
- EventSystem を削除
最終構成
QuiltLoader (Scene)
├─ UIDocument (Display 0) ← UI Toolkit, 操作UI
├─ LKGCamera (Display 4) ← Looking Glass用Camera
└─ LKGCanvas (Display 4) ← uGUI, Lenticular表示
└─ LKGRawImage結果:
- ✅ 2画面のみ(メイン + Looking Glass)
- ✅ UI正常表示(横縞なし)
- ✅ UI操作可能
- ✅ Lenticular表示正常
最終更新: 2025-10-26
バージョン: 2.0.0
🧩 AM3D QuiltLoader :問題点と修正内容まとめ
1. 概要
Unity 6 + URP 環境で Looking Glass 向けに Quilt形式(多視点画像/動画)を変換・再生するアプリ。
機能は正常化済みだが、過程で以下の主要な技術的問題が発生していた。
2. 主な問題点と修正内容
| 区分 | 問題 | 原因 | 修正内容 | ファイル |
|---|---|---|---|---|
| 🧱 初期化 | RenderTexture破棄による MissingReferenceException | BasicUI_UXML.Start() が CalibrationLoader より先に走り、RenderTexture未生成で ApplyCalibration() 実行 | 初期化を StartCoroutine(InitializeAsync) に分離し、yield return new WaitUntil(() => MultiviewData.texturesGenerated) を追加 | BasicUI_UXML.cs |
| ⚙️ 同期処理 | CalibrationSync が RenderTexture未生成のまま Apply | MultiviewData の内部状態を確認せず ApplyCalibration() 実行 | MultiviewData.texturesGenerated が true の場合のみ実行 | CalibrationSync.cs |
| 🪞 プレビュー | Editor専用 KlakPreviewSender が nullで例外 | Editorモードで FindAnyObjectByType が nullを返す | if (klakPreview != null) チェックを追加 | CalibrationLoader.cs |
| 🔢 シリアル管理 | シリアル番号が「LKG-LKG-H00114」になる | 既に "LKG-" を含む文字列に再度プレフィックス付加 | if (serialRaw.StartsWith("LKG-")) で重複防止 | QuiltVideoPipeline.cs |
| 🎥 動画変換 | FFmpegが即終了(code=-1)、Bake結果が0フレーム | FFmpeg起動確認・タイムアウト判定が厳しく、プロセスが実行前に切断 | フォールバック処理強化:中間H.264変換+再抽出、再試行ロジック追加 | FFmpegRunner.cs / QuiltVideoPipeline.cs |
| 🗂️ 出力 | フォルダ構造が一部重複/誤出力 | シリアルフォルダ名生成のロジックが複数箇所で不一致 | LKGFolderLayout の一元管理+ Path.Combine に統一 | QuiltImagePipeline.cs / QuiltVideoPipeline.cs |
| 🔁 UI制御 | Loopモードやフォルダ切替の同期ズレ | currentSerial 更新後にUIリスト再読込が遅延 | OnFolderChanged() 内で RefreshList() & SyncLoopFromControl() を確実に呼び出し | BasicUI_UXML.cs |
| 📁 ファイルパス | 相対・絶対パスの混在で制御JSON参照ミス | ControlJsonIO で相対パス基準のズレ | Path.Combine と Application.persistentDataPath で正規化 | ControlJsonIO.cs |
| 🧮 FPS検出 | 動画のFPS判定失敗で再生速度異常 | GuessFps() が負値を返す | 下限値30fpsを設定 (if (fps < 0.1) fps = 30.0;) | QuiltVideoPipeline.cs |
3. 根本的な設計改善点
| 改善項目 | 対応内容 |
|---|---|
| 初期化順序の統一 | すべてのMonoBehaviour初期化を InitializeAsync() パターンに変更。依存関係 (CalibrationLoader → UI) を保証。 |
| 非同期FFmpeg制御 | Diagnostics.Process の監視ループを WaitForSecondsRealtime(0.1f) にし、強制Killを廃止。 |
| エラー回復設計 | 失敗時に段階的フォールバック(AV1→H.264→PNG再抽出)を自動実行。 |
| キャリブレーション共通化 | CalibrationSync.RefreshAndApply() を唯一のエントリポイントにし、すべてのPipelineから共通呼び出し。 |
| 制御ファイルの一元管理 | ControlJsonIO を全Pipelineで使用し、選択・追加・ループ情報を統合。 |
| UI非依存動作 | コマンドライン実行(EditorBatchMode)でも変換が可能なように設計(FFmpeg周辺)。 |
4. 構造整理(再構成済)
Assets/
├── QuiltLoader/
│ ├── Script/
│ │ ├── QuiltImagePipeline_Improved.cs
│ │ ├── QuiltVideoPipeline.cs
│ │ ├── LenticularPlayer.cs
│ │ ├── CalibrationSync.cs
│ │ ├── ControlJsonIO.cs
│ │ └── FFmpegRunner.cs
│ ├── UI/BasicUI_UXML.cs
│ └── Scene/QuiltLoader.unity
└── Looking Glass Plugin/
├── Scripts/CalibrationLoader.cs
├── Shaders/
└── Prefabs/5. 修正結果(最終状態)
✅ QuiltLoader.unity シーンが安定起動
✅ 画像・動画変換とも正常出力
✅ ディスプレイ2でLKG自動再生確認
✅ UIと制御JSONの同期動作安定
✅ FFmpegのフォールバック動作確認済
6. 今後別AIに再実装させる際の指示テンプレ
目的:AM3D QuiltLoader の安定版リファクタリング
優先事項:
- 初期化順序(CalibrationLoader → UI → Player)
MultiviewData.texturesGeneratedの待機導入- RenderTexture参照の安全化
- シリアル名と出力パスの一貫性保持
- FFmpeg失敗時のフォールバック設計
- UIとControlJsonIOの完全同期
- Editor/Standalone両対応
Author: 水上 | Source:
水上\フィードバック1028 1ababa435ee780b4ba38ea6e211b65a6.md