parse_generic_assets.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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.parent / 'utils'
  7. sys.path.append(str(utils_path))
  8. from file_utils import find_files_by_extension
  9. from json_utils import write_json
  10. from yaml_utils import load_unity_yaml, convert_to_plain_python_types
  11. def main():
  12. parser = argparse.ArgumentParser(description="Parses generic YAML-based assets (.mat, .controller, .anim) into JSON.")
  13. parser.add_argument("--input", type=str, required=True, help="The root directory of the target Unity project.")
  14. parser.add_argument("--output", type=str, required=True, help="The directory where the output will be saved.")
  15. parser.add_argument("--indent", type=int, default=None)
  16. parser.add_argument("--shrink-json", action='store_true')
  17. parser.add_argument("--ignored-folders", type=str, default='[]', help='JSON string of folders to ignore.')
  18. args = parser.parse_args()
  19. try:
  20. ignored_folders = json.loads(args.ignored_folders)
  21. except json.JSONDecodeError:
  22. print("Warning: Could not parse ignored-folders JSON string. Defaulting to empty list.", file=sys.stderr)
  23. ignored_folders = []
  24. input_dir = Path(args.input).resolve()
  25. output_dir = Path(args.output).resolve()
  26. assets_dir = input_dir / "Assets"
  27. output_assets_dir = output_dir / "Assets"
  28. if not assets_dir.is_dir():
  29. return
  30. extensions = ['.mat', '.controller', '.anim']
  31. files_to_process = []
  32. for ext in extensions:
  33. files_to_process.extend(find_files_by_extension(str(assets_dir), ext, ignored_folders=ignored_folders, project_root=input_dir))
  34. if not files_to_process:
  35. print("No generic asset files (.mat, .controller, .anim) found.")
  36. return
  37. print(f"\n--- Starting Generic Asset Parsing ---")
  38. print(f"Found {len(files_to_process)} files to process.")
  39. for file_path_str in files_to_process:
  40. file_path = Path(file_path_str)
  41. relative_path = file_path.relative_to(assets_dir)
  42. output_path = (output_assets_dir / relative_path).with_suffix('.json')
  43. output_path.parent.mkdir(parents=True, exist_ok=True)
  44. try:
  45. documents = load_unity_yaml(file_path)
  46. if documents:
  47. # Most asset files have one document
  48. data = convert_to_plain_python_types(documents[0])
  49. write_json(data, output_path, indent=args.indent, shrink=args.shrink_json)
  50. except Exception as e:
  51. print(f"Error processing {file_path.name}: {e}", file=sys.stderr)
  52. print("Generic asset parsing complete.")
  53. if __name__ == "__main__":
  54. main()