Zh/$sequence

该命令用于定义骨骼动画。可单独使用，也可结合一个或多个$animation来利用Source引擎更高级的骨骼动画功能。
:
== 用法 ==
$sequence有两种模式：一种直接引用单个骨骼动画（SMD或DMX文件）；另一种需要通过中间$animation定义。
 $sequence <名称> <骨骼动画SMD/DMX文件路径> <简单选项> {		// 左花括号必须与命令在同一行
 	// 若内部无内容可省略花括号
 	<高级选项>
 	<动画事件>
 	<简单选项>
 }
 $sequence <名称> <简单选项> {		// 左花括号必须与命令在同一行
 	<$animation名称列表>
 	<高级选项>
 	<动画事件>
 	<简单选项>
 }
=== 示例 ===
$modelname		"weapons/shell.mdl"
$cdmaterials		"models/weapons/"
$body		shell	"shell-ref"
$sequence idle	"shell-idle"
$animation a_strokechin "strokechin" subtract idle 0
$sequence strokechin {
	a_strokechin
	delta
}
$sequence run_holding_all {
	a_runS a_runSE a_runE a_runNE a_runN_SMG a_runNW a_runW a_runSW a_runS
	blendwidth 9
	blend move_yaw -180 180
	addlayer layer_run_holding
	ACT_RUN_RIFLE 1
	node "running"
}
== 选项 ==
=== 基础选项 ===
; <string|名称>
: 动画名称。将显示在HLMV、Hammer等工具中。
; <string|骨骼动画文件路径>
: $sequence的源文件路径。包含此参数表示使用该命令的简单模式。
; frame <int|起始帧> <int|结束帧>
; frames <int|起始帧> <int|结束帧>
: 指定从源动画中提取的帧范围。适用于裁剪特定动画中未使用的帧。
:: 例如：若源动画包含80帧（0-79），但该动画只需播放最后30帧，则使用frames 50 79仅加载这些帧。
: 当起始帧与结束帧相同时可提取单帧动画。
: frames与frame可互换使用。
: 
: 
: 
; numframes <int|总帧数>
: 强制设置动画总帧数，通过裁剪或重复最后一帧实现。
: 与frame/frames联用时，将保留起始帧。若总帧数小于实际帧数则截断，大于则重复最后一帧。
:: 例如：frames 10 12 numframes 12将提取10-12帧，但第12帧会被重复以满足总帧数要求。
; origin <float|x> <float|y> <float|z>
: 在局部空间内调整动画位置。
; angles <float|x> <float|y> <float|z>
: 在局部空间内调整动画旋转。
; rotate <float|角度>
: 仅沿Z轴旋转，等同于angles的Z轴分量。
; scale <float|缩放比例>
: 缩放此序列中的骨骼尺寸。允许负值。
; reverse 
: 反转动画播放方向。
; loop
: 标记为循环动画，StudioMDL会对首尾帧进行优化。
: 启用后，动画在播放过程中无法被自身中断。
; hidden
: 在用户界面中隐藏该$sequence。适用于仅作为其他动画图层的序列。
; noanimation
: 强制序列使用零权重动画。忽略frame/frames但保留numframes。
: 等效于使用移除所有骨骼权重的$weightlist。适用于创建仅含叠加层的复合序列。
; fps <float|帧率>
: 覆盖动画帧率。默认30。
: 
: 
; <string|动作提取轴向>
: 解决角色"原地行走"动画需求，通过剥离根骨骼位移实现。
:: 可在轴向前添加walkframe <int|动作提取结束帧>来限制提取范围。
:: 
:: 
$sequence sword_attack {
	"knight_anims/sword_attack"
	ACT_SPECIAL_ATTACK1 1
	fadein 0.2
	fadeout 0.2
	fps 30
	walkframe 10 LX LY LZR //从起始到第10帧提取动作
	walkframe 30 LX LY LZR //从第10到30帧提取动作
	LX LY LZR //从第30帧到结尾提取动作
}
:可用轴向：
:* X, Y, Z, XR, YR, ZR（R表示旋转）
::
:* LX, LY, LZ, LXR, LYR, LZR：根骨骼沿轴向移动至动画中途后返回原位。
:* LM：线性动作提取
:* LQ：二次曲线动作提取
: 此命令也可用于$animation。
; activity <string|活动名称> <float|权重>
: 将序列关联到游戏活动。
: 
: 权重决定该序列在活动触发时被选中的概率（权重/总权重）。
:: 例如：权重为2的swing_a和权重为1的swing_b，前者有2/3概率被选中。
:: 
; autoplay
: 使该序列始终在顶层播放，无视其他动画。适用于呼吸等混合动画。
; addlayer <string|其他$sequence名称>
: 在当前序列上叠加播放其他序列。两者同步起止，时长差异会影响叠加层的帧率。被叠加序列无需定义在当前序列上方。
: 通常用于添加瞄准矩阵等delta层或特定骨骼权重层。
; blendlayer <string|其他$sequence名称> <int|起始帧> <int|峰值帧> <int|衰减帧> <int|结束帧> [选项...]
: 类似addlayer，但仅在指定帧范围播放，并支持多种选项。
: 强度从起始帧0%渐变至峰值帧100%，从衰减帧开始淡出，到结束帧完全消失。
: 选项：
:; spline
:: 使用样条曲线渐变
:; xfade
:: 仅淡入不淡出
:; poseparameter <string|参数名称>
:: 使用姿势参数控制渐变。示例：
::: blendlayer aimmatrix -1 0 0 1 poseparameter move_x
参数值: -2.000 -1.500 -1.000 -00.80 -00.60 -00.40 -00.200 000.00 00.200 00.400 00.600 00.800 1.0000 1.5000 2.0000
层权重: 0.000% 0.000% 0.000% 20.00% 40.00% 60.00% 80.00% 100.0% 80.00% 60.00% 40.00% 20.00% 0.000% 0.000% 0.000%
:; noblend
:: 保持100%强度，忽略序列过渡。
:; local
:: 将层标记为本地上下文序列，在主序列关键帧应用前混合。
: 
; worldspace
: 作为图层时，以世界空间计算骨骼位置。
: 
; worldspaceblend
: 
; snap
: 过渡到该动画时取消所有混合。适用于突然状态变化（如受击动作）。
: 
; realtime
: 同步动画时钟与地图时间。适用于呼吸等独立速率图层。
; fadein <float|秒数>
: 设置淡入时长。默认0.2秒。
: 
; fadeout <float|秒数>
: 设置淡出时长。默认0.2秒。
; weightlist <string|权重列表名称>
: 应用权重列表。若存在默认权重列表将被覆盖。
; worldrelative 
: 
; localhierarchy <string|骨骼名称> <string|新父骨骼名称> [range <int|起始帧> <int|峰值帧> <int|衰减帧> <int|结束帧>]
: 临时修改骨骼层级关系。""表示移除父骨骼。
: 用于优化混合抖动（如武器换手动画）。需配合snap使用。
; compress <int|跳帧数>
: 仅存储指定间隔的动画帧（从0开始）。值≤1无效。
; posecycle <string|姿势参数>
: 使用姿势参数控制动画帧。适用于创建线性混合序列。
: 示例（参数范围-180~180，动画9帧）：
参数值: -180.0 -135.0 -90.0 -45.0 0.0 45.0 90.0 135.0 180.0
动画帧: 0 1 2 3 4 5 6 7 8
: 
=== 高级选项 ===
除基础选项外：
; delta
: 表示引用的$animation已进行subtract处理。该序列将在当前动画上层叠加播放。
; predelta
: 配合"presubtract"使用，改变骨骼动画合成基准。
; blend <string|名称> <float|最小值> <float|最大值>
; blendwidth <int|宽度>
; blendref <string|名称>
; blendcomp <string|名称>
; blendcenter <string|名称>
; calcblend <string 名称> <string 附着点> <XR YR ZR>
: 详见混合序列。
; ikrule
: 见反向运动学链。
; iklock
: 锁定反向运动学链中的指定骨骼。
; activitymodifier <string|修饰符> 
: 
=== 杂项 ===
;node (名称)
: 标记序列在状态图中的节点位置。循环动画常用此标签。同节点序列间无需过渡动画。
;transition (来源节点) (目标节点)
: 声明该序列为过渡动画（如行走转站立）。
;rtransition (名称1) (名称2)
: 可逆过渡动画。曾用于半衰期的触手怪，不建议常规使用。 
;exitphase (相位)
: 声明循环动画的过渡起始相位。
;$skiptransition (名称1) (名称2) [(名称3)...]
: 允许指定节点间直接过渡（如行走转奔跑无需经过站立状态）。
;keyvalues { [内容] }
: 为序列添加键值块（用于Faceposer手势设置）。
== 事件 ==
可在$sequence中定义动画事件：
$sequence tentacle_grab "tentacle_grab" {
 fps 15
 { event 1000 1 }
 { event 1004 4 "*scientist/scream02.wav" }
 { event 1003 18 "smash" }
 { event 1004 65 "*scientist/c1a4_sci_tent.wav" }
}