> 技术文档 > Unity动画系统详解:从Mecanim到鸿蒙跨平台实战_c# unity实现设备动画

Unity动画系统详解:从Mecanim到鸿蒙跨平台实战_c# unity实现设备动画


引言

Unity的动画系统是赋予角色与场景生命力的核心工具。无论是角色行走、UI动效,还是复杂的过场动画,都需要通过​​Mecanim状态机​​、​​动画层与遮罩​​、​​程序化动画​​以及​​Timeline​​等模块实现。本文将从零基础视角出发,深入解析这些功能,并结合​鸿蒙5+​​的跨平台能力,提供代码示例与实战案例,助你快速掌握动画开发的核心技能。


一、Mecanim状态机:动画的指挥官

1. 状态机基础:从走路到跑步

Mecanim状态机通过​​Animator Controller​​管理动画过渡。以角色移动为例:

  1. ​创建动画剪辑​​:导入IdleWalkRun动画。
  2. ​搭建状态机​​:在Animator窗口中拖拽动画片段,形成状态节点。
  3. ​参数控制过渡​​:通过Speed参数决定行走与跑步的切换。
// 控制动画参数(C#)Animator animator = GetComponent();float moveInput = Input.GetAxis(\"Vertical\"); // 获取垂直输入(W/S或↑/↓)animator.SetFloat(\"Speed\", moveInput); // 设置Speed参数

​过渡条件设置​​:

  • ​Exit Time​​:动画播放完成后自动切换。
  • ​Transition Duration​​:过渡平滑时间(建议0.1~0.3秒)。

2. 混合树(Blend Tree):平滑过渡的秘密

混合树通过插值算法混合多个动画,实现无缝过渡(如不同速度的行走)。

  1. ​创建混合树​​:右键Animator窗口 → Create State → From New Blend Tree。
  2. ​配置参数​​:添加SpeedDirection参数,关联动画片段。
// 控制混合树参数(C#)float turnInput = Input.GetAxis(\"Horizontal\"); // 获取水平输入(A/D或←/→)animator.SetFloat(\"Direction\", turnInput); // 控制角色转向

二、动画层与遮罩:精准控制局部动画

1. 动画层(Layers):分层管理动画

通过分层实现​​上半身射击​​与​​下半身移动​​的分离:

  1. ​添加动画层​​:在Animator窗口顶部点击“+”号。
  2. ​设置权重​​:调整层的权重(如上半身层权重为1,下半身为0.5)。
// 动态调整动画层权重(C#)animator.SetLayerWeight(1, 0.8f); // 设置第二层权重为80%

2. 遮罩(Avatar Mask):局部动画控制

遮罩允许仅对特定骨骼应用动画(如手臂挥动不影响躯干):

  1. ​创建Avatar Mask​​:在Project窗口右键 → Create → Avatar Mask。
  2. ​勾选骨骼​​:选择需要控制的骨骼(如左臂、右臂)。
  3. ​应用遮罩​​:在动画层的设置中指定遮罩。

​代码示例​​:

// 动态启用/禁用动画层(C#)bool isShooting = Input.GetKeyDown(KeyCode.Space);animator.SetBool(\"IsShooting\", isShooting);

三、程序化动画:用代码驱动动态效果

1. 简单程序化动画:浮空与旋转

通过脚本动态修改物体位置与旋转:

// 浮空动画(C#)public class FloatingAnimation : MonoBehaviour { public float floatSpeed = 1f; public float floatHeight = 1f; private Vector3 startPosition; void Start() { startPosition = transform.position; } void Update() { float yOffset = Mathf.Sin(Time.time * floatSpeed) * floatHeight; transform.position = startPosition + Vector3.up * yOffset; }}

​应用场景​​:UI元素浮动、角色呼吸效果等。


2. 鸿蒙传感器驱动动画:陀螺仪控制角色

结合鸿蒙设备的陀螺仪数据,实现角色动态倾斜:

// 鸿蒙端传感器监听(ArkTS)import sensor from \'@ohos.sensors\';export default { onInit() { sensor.on(\'gyroscope\', (data) => { // 将数据传递给Unity this.context.sendMessageToUnity(\'gyroData\', { x: data.x, y: data.y, z: data.z }); }); }}
// Unity端应用陀螺仪数据(C#)using Huawei.HarmonyOS;public class GyroAnimation : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent(); } void Update() { // 从鸿蒙接收陀螺仪数据 Vector3 gyroData = HarmonyOS.GetSensorData(\"gyroData\"); if (gyroData != Vector3.zero) { // 控制动画参数(如倾斜角度) animator.SetFloat(\"GyroX\", gyroData.x); } }}

四、Timeline:电影级动画编排

1. 基础使用:剪辑与轨道

  1. ​创建Timeline​​:Window → Sequencing → Timeline。
  2. ​添加轨道​​:包括动画、音频、摄像机轨道。
  3. ​录制关键帧​​:选中物体,在Timeline中拖动时间轴并调整属性。

​创意用法​​:

  • ​过场动画​​:控制摄像机移动、角色对话、UI弹窗同步。
  • ​动态事件​​:在特定时间点触发音效或粒子特效。

2. 代码控制Timeline:动态播放与同步

// 控制Timeline播放(C#)using UnityEngine.Playables;public class TimelineController : MonoBehaviour { public PlayableDirector director; void Start() { director.Play(); // 播放Timeline } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { director.Pause(); // 暂停 director.Resume(); // 继续 } }}

​鸿蒙整合​​:
通过Timeline同步鸿蒙设备的输入(如触摸事件触发动画片段):

// 鸿蒙端触摸事件监听(ArkTS)import input from \'@ohos.input\';export default { onTouch(event) { if (event.type === input.EventType.TOUCH) { // 发送触摸事件到Unity this.context.sendMessageToUnity(\'touchEvent\', { x: event.x, y: event.y }); } }}
// Unity端响应触摸事件(C#)public class TimelineInteraction : MonoBehaviour { public PlayableDirector director; void OnTouchReceived(Vector2 touchPos) { if (touchPos.x > Screen.width / 2) { director.time = 10f; // 跳转到第10秒 } }}

五、鸿蒙5+跨平台实战:物联网动画同步

案例:智能家居控制面板

​目标​​:通过鸿蒙设备远程控制Unity中的灯光动画。

  1. ​鸿蒙端​​:采集触摸事件,发送到Unity。
  2. ​Unity端​​:解析事件并控制灯光颜色渐变动画。
  3. ​Timeline同步​​:在灯光变化时播放闪烁特效。

​代码示例​​:

// Unity端灯光控制(C#)public class LightController : MonoBehaviour { public Animator lightAnimator; void Update() { // 接收鸿蒙发送的触摸事件 Vector2 touchPos = HarmonyOS.GetTouchData(); if (touchPos != Vector2.zero) { // 触发Timeline动画 lightAnimator.SetTrigger(\"ToggleLight\"); } }}