跳转至

Unity 6.3 — Animation Module Reference

最后验证: 2026-02-13 Knowledge Gap: Unity 6 动画改进、Timeline 增强


概述

Unity 6.3 动画系统:

  • Animator Controller (Mecanim):基于状态机(推荐)
  • Timeline:电影化序列、过场动画
  • Animation Rigging:程序化运行时动画
  • Legacy Animation:已弃用,避免使用

2022 LTS 以来的关键变更

Animation Rigging 包(Unity 6 中生产就绪){#animation-rigging-package-production-ready-in-unity-6}

// Install: Package Manager > Animation Rigging
// Runtime IK, aim constraints, procedural animation

Timeline 改进

  • 更好的性能
  • 更多轨道类型
  • 改进的信号系统

Animator Controller (Mecanim)

基本设置

// Create: Assets > Create > Animator Controller
// Add to GameObject: Add Component > Animator
// Assign Controller: Animator > Controller = YourAnimatorController

状态转换

Animator animator = GetComponent<Animator>();

// ✅ Trigger transition
animator.SetTrigger("Jump");

// ✅ Bool parameter
animator.SetBool("IsRunning", true);

// ✅ Float parameter (blend trees)
animator.SetFloat("Speed", currentSpeed);

// ✅ Integer parameter
animator.SetInteger("WeaponType", 2);

动画层

  • Base Layer:默认动画(移动)
  • Override Layers:替换基础层(例如武器切换)
  • Additive Layers:在基础层之上叠加(例如呼吸、瞄准偏移)
// Set layer weight (0-1)
animator.SetLayerWeight(1, 0.5f); // 50% blend

混合树

1D 混合树(速度混合){#1d-blend-tree-speed-blending}

// Idle (Speed = 0) → Walk (Speed = 0.5) → Run (Speed = 1.0)
animator.SetFloat("Speed", moveSpeed);

2D 混合树(方向移动){#2d-blend-tree-directional-movement}

// X-axis: Strafe (-1 to 1)
// Y-axis: Forward/Back (-1 to 1)
animator.SetFloat("MoveX", input.x);
animator.SetFloat("MoveY", input.y);

动画事件

从动画剪辑触发事件

// Add in Animation window: Right-click timeline > Add Animation Event
// Must have matching method on GameObject:

public void OnFootstep() {
    // Play footstep sound
    AudioSource.PlayClipAtPoint(footstepClip, transform.position);
}

public void OnAttackHit() {
    // Deal damage
    DealDamageInFrontOfPlayer();
}

根运动

通过动画实现角色移动

Animator animator = GetComponent<Animator>();
animator.applyRootMotion = true; // Move character based on animation

void OnAnimatorMove() {
    // Custom root motion handling
    transform.position += animator.deltaPosition;
    transform.rotation *= animator.deltaRotation;
}

Animation Rigging(Unity 6+){#animation-rigging-unity-6}

IK(反向运动学){#ik-inverse-kinematics}

// Install: Package Manager > Animation Rigging
// Add: Rig Builder component + Rig GameObject

// Two Bone IK (Arm/Leg)
// - Add Two Bone IK Constraint
// - Assign Tip (hand/foot), Mid (elbow/knee), Root (shoulder/hip)
// - Set Target (where hand/foot should reach)

// Runtime control:
TwoBoneIKConstraint ikConstraint = rig.GetComponentInChildren<TwoBoneIKConstraint>();
ikConstraint.data.target = targetTransform;
ikConstraint.weight = 1f; // 0-1 blend

瞄准约束(Look At){#aim-constraint-look-at}

// Character looks at target
MultiAimConstraint aimConstraint = rig.GetComponentInChildren<MultiAimConstraint>();
aimConstraint.data.sourceObjects[0] = new WeightedTransform(targetTransform, 1f);

Timeline(过场动画){#timeline-cutscenes}

Timeline 基本设置

// Create: Assets > Create > Timeline
// Add to GameObject: Add Component > Playable Director
// Assign Timeline: Playable Director > Playable = YourTimeline

// Play from script:
PlayableDirector director = GetComponent<PlayableDirector>();
director.Play();

Timeline 轨道

  • Activation Track:启用/禁用 GameObject
  • Animation Track:在 Animator 上播放动画
  • Audio Track:同步音频播放
  • Cinemachine Track:摄像机移动
  • Signal Track:在特定时间触发事件

信号系统(事件){#signal-system-events}

// Create Signal Asset: Assets > Create > Signals > Signal
// Add Signal Emitter to Timeline track
// Add Signal Receiver component to GameObject

public class CutsceneEvents : MonoBehaviour {
    public void OnDialogueStart() {
        // Triggered by signal
    }
}

动画播放控制

直接播放动画(无状态机){#play-animation-directly-no-state-machine}

// ✅ CrossFade (smooth transition)
animator.CrossFade("Attack", 0.2f); // 0.2s transition

// ✅ Play (instant)
animator.Play("Idle");

// ❌ Avoid: Legacy Animation component
Animation anim = GetComponent<Animation>(); // DEPRECATED

动画曲线

自定义属性动画

// In Animation window: Add Property > Custom Component > Your Script > Your Float

public class WeaponTrail : MonoBehaviour {
    public float trailIntensity; // Animated by clip

    void Update() {
        // Intensity controlled by animation curve
        trailRenderer.startWidth = trailIntensity;
    }
}

性能优化

剔除

  • Animator > Culling Mode:
  • Always Animate:始终更新(开销大)
  • Cull Update Transforms:屏幕外时停止更新骨骼(推荐)
  • Cull Completely:屏幕外时停止所有动画

LOD(细节层次){#lod-level-of-detail}

  • 远处角色使用更简单的动画
  • 减少 LOD 网格的骨骼数量

Common Patterns

检查动画是否完成

AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Attack") && stateInfo.normalizedTime >= 1.0f) {
    // Attack animation finished
}

覆盖动画速度

animator.speed = 1.5f; // 150% speed

获取当前动画名称

AnimatorClipInfo[] clipInfo = animator.GetCurrentAnimatorClipInfo(0);
string currentClip = clipInfo[0].clip.name;

调试

Animator 窗口

  • Window > Animation > Animator
  • 可视化状态机,查看活动状态

动画窗口

  • Window > Animation > Animation
  • 编辑动画剪辑,添加事件

来源

  • https://docs.unity3d.com/6000.0/Documentation/Manual/AnimationOverview.html
  • https://docs.unity3d.com/Packages/com.unity.animation.rigging@1.3/manual/index.html
  • https://docs.unity3d.com/Packages/com.unity.timeline@1.8/manual/index.html

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/Claude-Code-Game-Studios