-- ==============================================
-- 【全局递归函数】兼容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
)
)
-- 步骤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