示例成品 · 平台演示,按左边这组点选真跑出来的
选中骨架对象,把下面脚本复制到 Blender 的 Text Editor 里运行。`TARGET_PREFIX` 改成你要的统一前缀,`LEGACY_PREFIXES` 是要清掉的旧前缀。原名会备份到骨骼属性 `old_name_backup`,这脚本只跑一次,别重复跑。
<div>
<button style="margin-bottom:8px;padding:6px 12px;cursor:pointer;" onclick="navigator.clipboard.writeText(document.getElementById('blender-rename-script').innerText)">复制代码</button>
<pre><code id="blender-rename-script">import bpy
TARGET_PREFIX = "Rig_"
LEGACY_PREFIXES = [
"mixamorig:",
"mixamo:",
"DEF_",
"ORG_",
"MCH_",
"CTRL_",
"Bip01_",
]
INDEX_DIGITS = 3
MAX_NAME_LEN = 63
def strip_legacy_prefix(name):
lower_name = name.lower()
for p in sorted(LEGACY_PREFIXES, key=len, reverse=True):
if lower_name.startswith(p.lower()):
return name[len(p):]
return name
def sanitize_name(name):
for ch in (" ", ":", ".", "/", "\\"):
name = name.replace(ch, "_")
return name
def walk_hierarchy(bones):
ordered = []
def rec(bone):
ordered.append(bone)
for child in sorted(bone.children, key=lambda b: b.name):
rec(child)
roots = sorted([b for b in bones if b.parent is None], key=lambda b: b.name)
for root in roots:
rec(root)
if len(ordered) != len(bones):
known = set(ordered)
for bone in bones:
if bone not in known:
ordered.append(bone)
return ordered
def make_unique_name(base, used):
name = base[:MAX_NAME_LEN]
i = 1
while name in used:
suffix = f"_{i:02d}"
name = base[:MAX_NAME_LEN - len(suffix)] + suffix
i += 1
return name
def main():
obj = bpy.context.active_object
if obj is None or obj.type != 'ARMATURE':
print("请先选中一个骨架对象")
return
bpy.ops.object.mode_set(mode='OBJECT')
for bone in obj.data.bones:
if "old_name_backup" not in bone:
bone["old_name_backup"] = bone.name
bpy.ops.object.mode_set(mode='EDIT')
edit_bones = obj.data.edit_bones
bones = list(edit_bones)
ordered = walk_hierarchy(bones)
used = set()
final_pairs = []
for index, bone in enumerate(ordered, start=1):
clean = strip_legacy_prefix(bone.name)
clean = sanitize_name(clean)
if not clean:
clean = "Bone"
base = f"{TARGET_PREFIX}{index:0{INDEX_DIGITS}d}_{clean}"
final = make_unique_name(base, used)
used.add(final)
final_pairs.append((bone, final))
for i, bone in enumerate(bones):
tmp = f"__renaming_tmp_{i:04d}"
while edit_bones.find(tmp) != -1:
tmp += "_x"
bone.name = tmp
for bone, final in final_pairs:
bone.name = final
print(f"已重命名 {len(bones)} 个骨骼,原名备份在 old_name_backup")
main()</code></pre>
</div>
点左边「开工 · 直接出成品」,出一份你自己的版本(文字免费)