69 lines
3.3 KiB
Python
69 lines
3.3 KiB
Python
# 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 <projet> -run=pythonscript -script="<projet>/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))
|