# Audit d'optimisation (lot O0) : inventaire de /Game par le registre d'assets, sans charger les assets. # Lecture seule. Pour chaque asset : paquet, classe, taille du fichier, tags du registre (dimensions, # compression, triangles, LOD, Nanite...), nombre de paquets qui le referencent (durs et souples). # # Usage : # UnrealEditor-Cmd.exe -run=pythonscript -script="/Tools/AuditAssets.py" -unattended -nopause -nosplash # Sortie : Saved/Audit/assets.jsonl (une ligne JSON par asset) import json import os import unreal out_dir = os.path.join(unreal.Paths.project_saved_dir(), "Audit") os.makedirs(out_dir, exist_ok=True) out_path = os.path.join(out_dir, "assets.jsonl") registry = unreal.AssetRegistryHelpers.get_asset_registry() registry.search_all_assets(True) assets = registry.get_assets_by_path("/Game", recursive=True) hard = unreal.AssetRegistryDependencyOptions(include_soft_package_references=False, include_hard_package_references=True, include_searchable_names=False, include_soft_management_references=False, include_hard_management_references=False) soft = unreal.AssetRegistryDependencyOptions(include_soft_package_references=True, include_hard_package_references=False, include_searchable_names=False, include_soft_management_references=False, include_hard_management_references=False) content_dir = unreal.Paths.convert_relative_path_to_full(unreal.Paths.project_content_dir()) def package_file(package): rel = str(package)[len("/Game/"):] for ext in (".uasset", ".umap"): p = os.path.join(content_dir, rel + ext) if os.path.exists(p): return p return None count = 0 with open(out_path, "w", encoding="utf-8") as f: for a in assets: package = a.package_name path = package_file(package) size = os.path.getsize(path) if path else -1 if path: ubulk = path[:-len(".uasset")] + ".ubulk" if path.endswith(".uasset") else None if ubulk and os.path.exists(ubulk): size += os.path.getsize(ubulk) tags = {} for key in ("Dimensions", "Format", "CompressionSettings", "LODGroup", "SRGB", "NeverStream", "MipGenSettings", "Triangles", "Vertices", "LODs", "Materials", "NaniteEnabled", "ApproxSize", "Sections", "MorphTargets", "Bones", "Skeleton", "BlendMode", "ShadingModel", "TwoSided", "Duration", "NumFrames", "SequenceLength", "ParentClass", "NativeParentClass"): v = a.get_tag_value(key) if v is not None and v != "" and v != "None": tags[key] = str(v) refs_hard = registry.get_referencers(package, hard) or [] refs_soft = registry.get_referencers(package, soft) or [] rec = { "package": str(package), "class": str(a.asset_class_path.asset_name), "size": size, "tags": tags, "refs_hard": len([r for r in refs_hard if str(r) != str(package)]), "refs_soft": len([r for r in refs_soft if str(r) != str(package)]), } f.write(json.dumps(rec, ensure_ascii=False) + "\n") count += 1 unreal.log_warning("AuditAssets : {} assets -> {}".format(count, out_path))