階層・グループ
MaxScript チートシート の章一覧
オブジェクトを構造化する操作です。親子リンク(transform が伝播する)、グループ(まとめて扱う箱)、レイヤー(表示・管理の単位)はそれぞれ別物です。
親子リンク
$Child.parent = $Parent -- リンクする
$Child.parent = undefined -- リンクを外す
$Parent.children -- 直接の子(読み取り専用の配列)
$Child.parent -- 親(無ければ undefined)
- 親を動かすと子も追従します(transform が伝播)。
- ⚠️
parentへの代入は 現在の見た目の位置を維持 します(ワールド位置は変わらない)。
階層をたどる
-- 直接の子だけ
for c in $Parent.children do print c.name
-- 子孫すべて(再帰)
fn getDescendants node =
(
local result = #()
for c in node.children do
(
append result c
join result (getDescendants c)
)
result
)
getDescendants $Parent
childrenは 直接の子だけ です。孫まで欲しいときは上のように再帰します。
グループ
group selection name:"MyGroup" -- 選択をグループ化
ungroup $MyGroup -- 1階層だけ解除
explodeGroup $MyGroup -- 入れ子も含めて完全に解除
isGroupHead $MyGroup -- グループの親ノードか
isGroupMember $Box001 -- グループの中身か
setGroupOpen $MyGroup true -- グループを開く(中身を個別選択可能に)
- グループは「グループヘッド」というダミーノードに子をぶら下げた構造です。
- ⚠️ グループの中身を直接いじるには
setGroupOpen ... trueで開くか、$MyGroup.childrenでアクセスします。
レイヤー
lm = LayerManager
lay = lm.newLayerFromName "Props" -- 作成(同名があると undefined)
lay = lm.getLayerFromName "Props" -- 取得
lay.addNode $Box001 -- ノードをレイヤーへ移動
$Box001.layer -- ノードが属するレイヤー
$Box001.layer.name -- レイヤー名
レイヤーの表示・状態を変える
lay.on = false -- 非表示(レイヤーごと)
lay.isFrozen = true -- 凍結
lay.current = true -- カレントレイヤーにする
-- レイヤーに属するノードを集める(参照渡し)
nodes = #()
lay.nodes &nodes
nodes
- ⚠️
lay.nodes &nodesは 参照渡し(&)で配列を受け取る独特な API です。戻り値ではなく引数が書き換わります。
落とし穴まとめ
parent代入はワールド位置を維持する(見た目は動かない)。childrenは直接の子のみ。子孫は再帰で集める。- グループの中身は
setGroupOpenで開くかヘッドのchildren経由。 - レイヤーのノード列挙は
lay.nodes &配列の参照渡し。
関連
- まとめる対象を選ぶ: 「選択・取得」章
- レイヤーの表示と個別ノードの表示: 「表示・名前・色」章