一个 表达式 是一个简短的类似 Luau 的公式,它读取图形参数并返回一个值,例如 math.clamp((MovementSpeed + 0.5) / MaxSpeed, 0, 1)。使用表达式来驱动节点属性或 状态机过渡。表达式将参数转换和动画决策保留在您的图形中,靠近它们驱动的节点。
前提条件
在您创建表达式之前,请熟悉 动画图形编辑器,包括如何 打开它并创建动画图形。
创建表达式
此示例使用表达式来驱动 Blend1DNode 的 Position 属性。将节点配置为在位置 0 处有一个闲置动画,在位置 1 处有一个奔跑动画。该表达式将角色的移动速度转换为节点用于在这些动画之间混合的 0 到 1 范围。
添加 MovementSpeed 和 MaxSpeed 数字图形参数。

从 Blend1DNode 的 Position 属性引脚拖动连接并选择 新表达式。

输入以下表达式:
math.clamp(MovementSpeed / MaxSpeed, 0, 1)
点击表达式框外以刷新它。随着 MovementSpeed 向 MaxSpeed 上升,Blend1DNode 接收从 0 到 1 的值,并从闲置动画过渡到奔跑动画。
在您将图形加载到 AnimationTrack 上后,通过您的游戏脚本使用 AnimationTrack:SetParameter() 更新 MovementSpeed 和 MaxSpeed。以下示例使用 MoveDirection 和 WalkSpeed 属性:
game:GetService("RunService").Stepped:Connect(function()
animationTrack:SetParameter("MovementSpeed", humanoid.MoveDirection.Magnitude * humanoid.WalkSpeed)
animationTrack:SetParameter("MaxSpeed", humanoid.WalkSpeed)
end)随着参数值的变化,表达式会进行评估。有关参数工作流,请参见 API 集成。
支持的内容
表达式支持包括算术和比较操作、逻辑和条件表达式、对 math 库中函数的调用、CFrame、Vector2、Vector3 和 Color3 值的构造和成员访问,以及字符串连接。以下部分列出了支持的语法和函数。
算术和比较
使用标准的算术和比较操作,遵循通常的运算顺序。例如,// 进行除法并向下取整。
Speed * 2.0 + Offset
(Health / MaxHealth) * 100
DamageMultiplier ^ 2
Count % 3
10 // 3
Speed < 1
Health >= MaxHealth比较运算符适用于数字。使用 == 和 ~= 来比较数字、布尔值或字符串。
逻辑和短路
and、or 和 not 遵循 Luau 的真值和短路评估。只有 false 和 nil 被视为假。
IsGrounded and GroundSpeed or AirSpeed
not IsDisabledIf-then-else 表达式
使用 Luau 的条件表达式形式在单个表达式中进行分支:
if Speed > 10 then "sprint" elseif Speed > 2 then "run" else "idle"数学库
使用 math 库。图形表达式尚不支持 math.frexp()、math.noise() 或 math.randomseed()。math.modf() 目前仅返回整数部分。
math.clamp(Speed / MaxSpeed, 0, 1)
math.sin(Time * 2 * math.pi)
math.atan2(Direction.Y, Direction.X)
math.max(A, B, C)向量构造和成员访问
构造 Vector2 和 Vector3 值,执行向量算术,并访问向量成员,如 Magnitude 和 Unit。
Vector3.new(math.cos(Time), math.sin(Time), 0)
Vector2.new(InputX, InputY)
MoveDirection.Magnitude * 2.0
Position.X + Offset
Vector3.zeroColor3 构造和成员访问
构造 Color3 值并访问其颜色通道。
Color3.fromRGB(255, 128, 0)
Color.RCFrame 构造、成员访问和操作
构造 CFrame 值,访问 CFrame 成员,并将它们与 CFrames 或 Vector3 值结合。
CFrame.new(Position, LookAtPosition)
CFrame.Angles(RotationX, RotationY, RotationZ)
CFrame.identity
Transform.LookVector
Transform.Position + Vector3.new(0, 1, 0)字符串连接
使用 .. 连接两个字符串:
"state_" .. CurrentState局部变量和多行表达式
使用多行表达式将公式分解为命名步骤。多行表达式支持 local 声明、return、if/elseif/else 和独立表达式。在 if 或 else 体内,仅使用 return 或独立表达式;不支持嵌套的 if 语句和局部声明。
local normalizedSpeed = Speed / MaxSpeed
local eased = math.clamp(normalizedSpeed, 0, 1)
return eased