Skip to content

feat: 使われていない FBX の部品を読み込まないオプション (#152) - #154

Merged
utagestudio merged 3 commits into
release/1.12.0from
feat/152-skip-unused-parts
Oct 25, 2026
Merged

utagestudio merged 3 commits into
release/1.12.0from
feat/152-skip-unused-parts

Conversation

@utagestudio

@utagestudio utagestudio commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

Closes #152

#153(#151)の上に積んだ PR です。#153 をマージしたら、base を release/1.12.0 に付け替えます。

変更内容

読み込む単位 Scenes / Prefabs に「Skip Unused Parts」(既定 ON)を追加した。ON のときは、prefab・シーンが使っていない FBX の部品(#58 / #151 で隠していたもの)を読み込まない。OFF のときは、今までどおり読み込んで隠す。

  • Scenes: 最初に読み込んだモデルから使わない部品を消してからテンプレートを作るので、以後の配置では必要な分だけを複製する。テンプレートを使い回すキーに、Renderer から作った配置かどうかとメッシュ参照の fileID を加えた
  • 消すものの決め方(core/scene_import.parts_to_remove): 使う部品を子孫に持つものは、親子関係と位置を保つため残して隠す。子がすべて消えた Empty・アーマチュアは消す
  • データ: 消したオブジェクトだけが使っていたメッシュ・アーマチュアのデータも消す。マテリアルは同じ回の別のモデルと共有するので消さない
  • 警告: 件数を「… were not imported (turn off 'Skip Unused Parts' to import them hidden)」で出す
  • UI: 選択ダイアログの Scenes / Prefabs タブに「Unused Parts」のトグルを追加した。オペレーターには skip_unused_parts を追加した
  • テスト: 統合テストに absent(オブジェクトが無いこと)を追加し、OFF を確かめる期待値を Scenes / Prefabs に 1 つずつ足した(CI にも登録)
  • バージョン: 1.12.0-dev.2 にした

確認

Japanese Train Station PBR Pack / DemoScene OFF ON
読み込み 34.2 秒 3.4 秒
オブジェクト数 31,290 1,167
メッシュのデータ 2,324 55
.blend の保存 1.7 秒 0.1 秒
  • 表示されるメッシュは、DemoScene(555 個)、Japanese Street の Day_Showcase(2,118 個)と Prefabs(431 個)、Japanese Apartment(283 個)のどれでも、名前とワールド行列が OFF と一致した
  • OFF のときの警告と件数は、変更前と同じだった
  • 単体テスト、合成パッケージの統合テスト 13 ファイル、Yumeka 1.0.4 の統合テストがすべて通過

追加の修正(ほかの実パッケージで比べて見つけたもの)

手元の実パッケージ 14 個を ON と OFF で読み込み比べたところ、Gothic Lights で次の 2 つが見つかったので、このブランチで直した(1.12.0-dev.3 / dev.4)。

  • 共有メッシュの消し方: FBX の読み込み直後は、5 つのオブジェクトが共有するメッシュでも users が 1 のことがある。そのため、1 つ目を消したときにメッシュのデータまで消え、共有していた残りのオブジェクトも消えて、StructRNA of type Object has been removed で読み込みが止まっていた。オブジェクトを先にすべて消し、残したオブジェクトが使っていないデータだけを消すようにした。
  • 読み込む単位 Prefabs で、prefab が使っていない FBX の部品が表示されたまま読み込まれる #151 の判定: FBX のノード名がもともと連番付き(Base-Ring.001)だと、2 回目の読み込みで Blender が .002 に付け替える。表の名前の側の連番を外していなかったため、使っている部品を使われていないと判定していた(OFF なら隠れ、ON なら消える)。Scenes 単位と同じく、表の名前の連番も外して比べるようにした。Gothic Lights の Prefabs で表示されるメッシュは 249 → 278 になった。

修正後、比較した 9 パッケージ(Train Station、Street、UnityJapanOffice、Apartment、Gothic Lights、SUPER CUB、ずん子 PC / Quest、KizunaAI)の Scenes / Prefabs と Shibuya の Prefabs で、表示されるメッシュの名前と位置が ON と OFF で一致した。

同じ名前の付け替えで prefab のマテリアルが当たらない、以前からある不具合は #155 で別に直す。

手動確認の手順

  1. Japanese Train Station PBR Pack を読み込み、Scenes タブで DemoScene を選ぶ。「Unused Parts」のトグルが ON になっていることを確認して Import する
  2. アウトライナーに非表示のメッシュがほとんど無く、駅が今までどおり表示されていること
  3. UPI タブの警告に「28015 object(s) … were not imported」が出ていること
  4. トグルを OFF にして読み込み直すと、今までどおり 28,015 個が非表示で読み込まれること
  5. Prefabs タブでも同じように、ON なら prefab が使う部品だけが読み込まれること

🤖 Generated with Claude Code

utagestudio and others added 3 commits October 25, 2026 18:37
Japanese Train Station PBR Pack の DemoScene では、駅の部品 54 個をまとめた FBX から
prefab が 1〜3 個だけを使うため、配置ごとに FBX を丸ごと複製して残りを隠しており、
非表示のメッシュが 28,015 個できていた。オブジェクトが多く、読み込み・保存・操作が重い。

読み込む単位 Scenes / Prefabs に「Skip Unused Parts」(既定 ON)を追加し、ON なら
prefab・シーンが使っていない部品(#58 / #151 で隠していたもの)を読み込まない。
OFF なら今までどおり読み込んで隠す(照合を誤ったときの逃げ道)。

- Scenes 単位: 最初に読み込んだモデルから使わない部品を消してからテンプレートを作るので、
  以後の配置では必要な分だけを複製する。使い回しのキーに、Renderer から作った配置かと
  メッシュ参照の fileID を加えた
- 消すものは core/scene_import.parts_to_remove が決める。使う部品を子孫に持つものは
  親子関係と位置を保つため残して隠し、子がすべて消えた Empty・アーマチュアは消す。
  使われていないかの判定は unused_in_placement に切り出し、parts_to_hide と共用する
- 消したオブジェクトだけが使っていたメッシュ・アーマチュアのデータも消す。マテリアルは
  同じ回の別のモデルと共有するので消さない
- 警告は「were not imported」の文言で件数を出す
- 選択ダイアログに「Unused Parts」のトグル、オペレーターに skip_unused_parts を追加
- 統合テストに absent(オブジェクトが無いこと)を追加し、OFF を確かめる期待値を
  Scenes / Prefabs に 1 つずつ足した

DemoScene: 読み込み 34.2 秒 → 3.4 秒、オブジェクト 31,290 → 1,167。表示されるメッシュ 555 個は
名前と位置が OFF と一致した(Japanese Street の 2 シーン、Japanese Apartment でも一致)。

Closes #152

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gothic Lights を読み込む単位 Prefabs で読むと、Skip Unused Parts が ON のとき
「StructRNA of type Object has been removed」で読み込みが止まった。

FBX の読み込み直後は、複数のオブジェクトが共有するメッシュでも users が 1 のことがある。
消したオブジェクトのメッシュを users == 0 で消していたため、共有していたほかのオブジェクトまで
Blender がデータと一緒に消し、その参照が無効になっていた。

オブジェクトを先にすべて消し、残したオブジェクトが使っていないデータだけを消すようにした。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FBX のノード名がもともと「Base-Ring.001」のように連番付きだと、同じ FBX を 2 回目以降に
読み込んだとき Blender が「Base-Ring.002」に付け替える。#151 の unused_parts はオブジェクト名の
連番だけを外していたので、使っている部品まで使われていないと判定し、OFF では隠し、ON では
消していた(Gothic Lights の Ceiling-Light-001 で燭台とリングの 6 個など)。

Scenes 単位の unused_in_placement と同じく、表の名前の連番も外して比べる。外した名前が同じ別の
ノードがあっても、使っている側に倒す(隠したり消したりはしない)。

Gothic Lights の Prefabs で表示されるメッシュが 249 → 278 になり、ON と OFF で一致した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@utagestudio
utagestudio changed the base branch from fix/151-prefab-unused-parts to release/1.12.0 October 25, 2026 14:42
@utagestudio
utagestudio merged commit b5de2a8 into release/1.12.0 Oct 25, 2026
5 checks passed
@utagestudio
utagestudio deleted the feat/152-skip-unused-parts branch October 25, 2026 14:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant