示例成品 看全文 ↓

写Blender批量重命名脚本

手动挨个改名易出错、耗时长,复制粘贴脚本又怕版本不兼容或逻辑错漏。

免费看示例成品:代码写代码做网站 ›

有人这样说「这角色骨骼命名乱得像蜘蛛网,得赶紧批量重命名,明天要交稿了。」

能替你选的都选好了。不想动,直接点下面「交给 AI 办」,点一下就开始做;想改,就点一下要的那个。

已替你选好想改就点一下

只有你知道的不填就先空着,成品里留【待填】

还想怎么改可以不选

开工前请确认

高级选项一般不用动 · 这件事通常 1 分钟左右做好

示例成品全文按上面这组示例选项真跑出来的

选中骨架对象,把下面脚本复制到 Blender 的 Text Editor 里运行。TARGET_PREFIX 改成你要的统一前缀,LEGACY_PREFIXES 是要清掉的旧前缀。原名会备份到骨骼属性 old_name_backup,这脚本只跑一次,别重复跑。

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()

别人还这样问

同类还能办

全部 ›

同样出写代码做网站的

首页