bone 选择基于父子排序
-- ==============================================
-- 【全局递归函数】兼容2020
-- ==============================================
fn traverseBipedBone_GLOBAL currBone &validBones &sortedBones &processed =
(
if (isValidNode currBone and classOf currBone == BoneGeometry and findItem validBones currBone > 0 and findItem processed currBone == 0) do
(
append sortedBones currBone -- 先添加当前父骨骼
append processed currBone -- 标记已处理
-- 遍历子骨骼:纯()写法
for childBone in currBone.children do
(
if (classOf childBone == BoneGeometry) do
(
-- 递归调用,参数全显式传递
traverseBipedBone_GLOBAL childBone &validBones &sortedBones &processed
)
)
)
)
-- ==============================================
-- 【核心排序函数】
-- ==============================================
fn sortBipedBonesByHierarchy targetBones =
(
-- 边界检查
if (targetBones == undefined or targetBones.count == 0) then (return #())
-- 步骤1:过滤+去重,仅保留有效Biped骨骼
validBipedBones = #()
for bone1 in targetBones do
(
if (isValidNode bone1 and classOf bone1 == BoneGeometry and findItem validBipedBones bone1 == 0) then
(
append validBipedBones bone1
)
)
sortedBones = #()-- 最终排序结果
processed = #() -- 去重标记
-- 步骤2:优先处理根骨骼(无父/父非Biped骨骼)
for bone1 in validBipedBones do
(
if (bone1.parent == undefined or classOf bone1.parent != BoneGeometry) then
(
-- 调用全局递归函数,全引用传参
traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
)
)
-- 步骤3:补充处理未递归到的非根骨骼
for bone1 in validBipedBones do
(
if (findItem processed bone1 == 0) then
(
traverseBipedBone_GLOBAL bone1 &validBipedBones &sortedBones &processed
)
)
return sortedBones
)
-- ==============================================
-- 【快捷执行函数】
-- ==============================================
fn selectBipedBonesByHierarchy =
(
-- 提取当前选中的所有Biped骨骼
selectedBones = for obj in selection where (classOf obj == BoneGeometry) collect obj
-- 按父子层级排序
sortedBones = sortBipedBonesByHierarchy selectedBones
-- 执行选中并反馈结果
if (sortedBones.count > 0) then
(
select sortedBones
print "========================================"
print ("✅ 成功排序并选中 " + sortedBones.count as string + " 个Biped骨骼:")
for i = 1 to sortedBones.count do
(
print ("" + i as string + ". " + sortedBones.name)
)
print "========================================"
)
else
(
print "❌ 未检测到有效Biped骨骼!请先选中Biped骨骼后重试。"
)
return sortedBones
)
-- ==============================================
-- 【一键执行】直接运行此句即可
-- ==============================================
for a in selection do print a.name
selectBipedBonesByHierarchy()
页:
[1]