extract_low_level.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import argparse
  2. import sys
  3. import json
  4. from pathlib import Path
  5. # Add the utils directory to the Python path
  6. utils_path = Path(__file__).parent / 'utils'
  7. sys.path.append(str(utils_path))
  8. from file_utils import find_files_by_extension
  9. from deep_parser import parse_scene_or_prefab
  10. def main():
  11. """
  12. Main function to run the low-level data extraction process.
  13. """
  14. parser = argparse.ArgumentParser(
  15. description="Generates a deeply detailed, per-GameObject breakdown of scenes and prefabs."
  16. )
  17. parser.add_argument(
  18. "--input",
  19. type=str,
  20. required=True,
  21. help="The root directory of the target Unity project."
  22. )
  23. parser.add_argument(
  24. "--output",
  25. type=str,
  26. required=True,
  27. help="The directory where the generated output folder will be saved."
  28. )
  29. args = parser.parse_args()
  30. input_dir = Path(args.input).resolve()
  31. output_dir = Path(args.output).resolve()
  32. if not input_dir.is_dir():
  33. print(f"Error: Input path '{input_dir}' is not a valid directory.", file=sys.stderr)
  34. sys.exit(1)
  35. # Create the main output folder, named "LowLevel"
  36. low_level_output_dir = output_dir / "LowLevel"
  37. try:
  38. low_level_output_dir.mkdir(parents=True, exist_ok=True)
  39. print(f"Output will be saved to: {low_level_output_dir}")
  40. except OSError as e:
  41. print(f"Error: Could not create output directory '{low_level_output_dir}'. {e}", file=sys.stderr)
  42. sys.exit(1)
  43. # --- Orchestration ---
  44. assets_dir = input_dir / "Assets"
  45. if not assets_dir.is_dir():
  46. print(f"Error: 'Assets' directory not found in '{input_dir}'.", file=sys.stderr)
  47. return
  48. scene_files = find_files_by_extension(str(assets_dir), '.unity')
  49. prefab_files = find_files_by_extension(str(assets_dir), '.prefab')
  50. files_to_process = scene_files + prefab_files
  51. print(f"\nFound {len(files_to_process)} scene/prefab files to process.")
  52. for file_path_str in files_to_process:
  53. file_path = Path(file_path_str)
  54. print(f"\nProcessing: {file_path.name}")
  55. gameobject_list = parse_scene_or_prefab(str(file_path))
  56. if gameobject_list:
  57. # Create the output subdirectory for this asset
  58. relative_path = file_path.relative_to(input_dir)
  59. asset_output_dir = low_level_output_dir / relative_path
  60. try:
  61. asset_output_dir.mkdir(parents=True, exist_ok=True)
  62. except OSError as e:
  63. print(f"Error creating directory {asset_output_dir}: {e}", file=sys.stderr)
  64. continue
  65. print(f"Saving {len(gameobject_list)} GameObjects to {asset_output_dir}")
  66. for go_data in gameobject_list:
  67. file_id = go_data.get('fileID')
  68. if file_id:
  69. output_json_path = asset_output_dir / f"{file_id}.json"
  70. try:
  71. with open(output_json_path, 'w', encoding='utf-8') as f:
  72. json.dump(go_data, f, indent=4)
  73. except IOError as e:
  74. print(f"Error writing to {output_json_path}: {e}", file=sys.stderr)
  75. else:
  76. print(f"Skipped {file_path.name} as deep parsing failed.")
  77. print("\nLow-level extraction complete.")
  78. if __name__ == "__main__":
  79. main()