Skip to content

フィードバック1028

修正サマリー:根本原因と解決方法

問題の推移

  1. 3画面表示 - メイン + 余計な画面 + Looking Glass
  2. UI操作不可能 - ボタンがクリックできない
  3. 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: 0
  • visibleInBackground: 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表示)

解決のポイント

  1. Display 管理を動的に
    • ハードコードを削除
    • キャリブレーションデータから検出
  2. レンダリングパイプラインを分離
    • Canvas (uGUI) と UIDocument (UI Toolkit) は混在させない
    • Display ごとに最適な技術スタックを使用
  3. バックグラウンドレンダリングを抑制
    • Player Settings で無効化

再現手順

  1. CalibrationLoader から Display 自動Activate を削除
  2. Player Settings: runInBackground: 0, visibleInBackground: 0
  3. Looking Glass の動的検出を実装(CalibrationSync.GetLKGDisplayIndex)
  4. シーン構成を分離:
    • Display 0: UIDocument ONLY
    • Display 4: Canvas + Camera + RawImage ONLY
  5. 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破棄による MissingReferenceExceptionBasicUI_UXML.Start()CalibrationLoader より先に走り、RenderTexture未生成で ApplyCalibration() 実行初期化を StartCoroutine(InitializeAsync) に分離し、yield return new WaitUntil(() => MultiviewData.texturesGenerated) を追加BasicUI_UXML.cs
⚙️ 同期処理CalibrationSync が RenderTexture未生成のまま ApplyMultiviewData の内部状態を確認せず 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.CombineApplication.persistentDataPath で正規化ControlJsonIO.cs
🧮 FPS検出動画のFPS判定失敗で再生速度異常GuessFps() が負値を返す下限値30fpsを設定 (if (fps < 0.1) fps = 30.0;)QuiltVideoPipeline.cs

3. 根本的な設計改善点

改善項目対応内容
初期化順序の統一すべてのMonoBehaviour初期化を InitializeAsync() パターンに変更。依存関係 (CalibrationLoaderUI) を保証。
非同期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 の安定版リファクタリング

優先事項

  1. 初期化順序(CalibrationLoader → UI → Player)
  2. MultiviewData.texturesGenerated の待機導入
  3. RenderTexture参照の安全化
  4. シリアル名と出力パスの一貫性保持
  5. FFmpeg失敗時のフォールバック設計
  6. UIとControlJsonIOの完全同期
  7. Editor/Standalone両対応

Author: 水上 | Source: 水上\フィードバック1028 1ababa435ee780b4ba38ea6e211b65a6.md