parse_scenes_and_prefabs.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import argparse
  2. import sys
  3. from pathlib import Path
  4. # Add the utils directory to the Python path
  5. utils_path = Path(__file__).parent.parent / 'utils'
  6. sys.path.append(str(utils_path))
  7. from file_utils import find_files_by_extension
  8. from deep_parser import parse_scene_or_prefab
  9. from json_utils import write_json
  10. from yaml_utils import load_unity_yaml, convert_to_plain_python_types
  11. from hierarchy_utils import HierarchyParser
  12. def main():
  13. parser = argparse.ArgumentParser(description="Parses scenes and prefabs into a per-GameObject breakdown.")
  14. parser.add_argument("--input", type=str, required=True, help="The root directory of the target Unity project.")
  15. parser.add_argument("--output", type=str, required=True, help="The directory where the output will be saved.")
  16. parser.add_argument("--indent", type=int, default=None)
  17. args = parser.parse_args()
  18. input_dir = Path(args.input).resolve()
  19. output_dir = Path(args.output).resolve()
  20. assets_dir = input_dir / "Assets"
  21. if not assets_dir.is_dir():
  22. return
  23. scene_files = find_files_by_extension(str(assets_dir), '.unity')
  24. prefab_files = find_files_by_extension(str(assets_dir), '.prefab')
  25. files_to_process = scene_files + prefab_files
  26. if not files_to_process:
  27. print("No scene or prefab files found.")
  28. return
  29. print(f"\n--- Starting Scene/Prefab Parsing ---")
  30. print(f"Found {len(files_to_process)} files to process.")
  31. for file_path_str in files_to_process:
  32. file_path = Path(file_path_str)
  33. print(f"\nProcessing: {file_path.name}")
  34. gameobject_list = parse_scene_or_prefab(str(file_path))
  35. relative_path = file_path.relative_to(input_dir)
  36. asset_output_dir = output_dir / relative_path
  37. asset_output_dir.mkdir(parents=True, exist_ok=True)
  38. if gameobject_list:
  39. print(f"Saving {len(gameobject_list)} GameObjects to {asset_output_dir}")
  40. for go_data in gameobject_list:
  41. file_id = go_data.get('fileID')
  42. if file_id:
  43. output_json_path = asset_output_dir / f"{file_id}.json"
  44. write_json(go_data, output_json_path, indent=args.indent)
  45. else:
  46. print(f"Skipped deep parsing for {file_path.name}.")
  47. try:
  48. documents = load_unity_yaml(file_path)
  49. if not documents:
  50. continue
  51. raw_object_map = {int(doc.anchor.value): doc for doc in documents if hasattr(doc, 'anchor') and doc.anchor is not None}
  52. object_map = {file_id: convert_to_plain_python_types(obj) for file_id, obj in raw_object_map.items()}
  53. parser = HierarchyParser(object_map)
  54. root_object_ids = parser.get_root_object_ids()
  55. root_ids_list = [file_id for file_id, _ in root_object_ids]
  56. if root_ids_list:
  57. roots_output_path = asset_output_dir / "root_objects.json"
  58. write_json(root_ids_list, roots_output_path, indent=args.indent)
  59. print(f"Successfully saved root object list to {roots_output_path}")
  60. except Exception as e:
  61. print(f"Error during hierarchy parsing for {file_path.name}: {e}", file=sys.stderr)
  62. print("Scene and prefab parsing complete.")
  63. if __name__ == "__main__":
  64. main()