Unity动画系统详解:从Mecanim到鸿蒙跨平台实战_c# unity实现设备动画
引言
Unity的动画系统是赋予角色与场景生命力的核心工具。无论是角色行走、UI动效,还是复杂的过场动画,都需要通过Mecanim状态机、动画层与遮罩、程序化动画以及Timeline等模块实现。本文将从零基础视角出发,深入解析这些功能,并结合鸿蒙5+的跨平台能力,提供代码示例与实战案例,助你快速掌握动画开发的核心技能。
一、Mecanim状态机:动画的指挥官
1. 状态机基础:从走路到跑步
Mecanim状态机通过Animator Controller管理动画过渡。以角色移动为例:
- 创建动画剪辑:导入
Idle
、Walk
、Run
动画。 - 搭建状态机:在Animator窗口中拖拽动画片段,形成状态节点。
- 参数控制过渡:通过
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):平滑过渡的秘密
混合树通过插值算法混合多个动画,实现无缝过渡(如不同速度的行走)。
- 创建混合树:右键Animator窗口 → Create State → From New Blend Tree。
- 配置参数:添加
Speed
和Direction
参数,关联动画片段。
// 控制混合树参数(C#)float turnInput = Input.GetAxis(\"Horizontal\"); // 获取水平输入(A/D或←/→)animator.SetFloat(\"Direction\", turnInput); // 控制角色转向
二、动画层与遮罩:精准控制局部动画
1. 动画层(Layers):分层管理动画
通过分层实现上半身射击与下半身移动的分离:
- 添加动画层:在Animator窗口顶部点击“+”号。
- 设置权重:调整层的权重(如上半身层权重为1,下半身为0.5)。
// 动态调整动画层权重(C#)animator.SetLayerWeight(1, 0.8f); // 设置第二层权重为80%
2. 遮罩(Avatar Mask):局部动画控制
遮罩允许仅对特定骨骼应用动画(如手臂挥动不影响躯干):
- 创建Avatar Mask:在Project窗口右键 → Create → Avatar Mask。
- 勾选骨骼:选择需要控制的骨骼(如左臂、右臂)。
- 应用遮罩:在动画层的设置中指定遮罩。
代码示例:
// 动态启用/禁用动画层(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. 基础使用:剪辑与轨道
- 创建Timeline:Window → Sequencing → Timeline。
- 添加轨道:包括动画、音频、摄像机轨道。
- 录制关键帧:选中物体,在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中的灯光动画。
- 鸿蒙端:采集触摸事件,发送到Unity。
- Unity端:解析事件并控制灯光颜色渐变动画。
- Timeline同步:在灯光变化时播放闪烁特效。
代码示例:
// Unity端灯光控制(C#)public class LightController : MonoBehaviour { public Animator lightAnimator; void Update() { // 接收鸿蒙发送的触摸事件 Vector2 touchPos = HarmonyOS.GetTouchData(); if (touchPos != Vector2.zero) { // 触发Timeline动画 lightAnimator.SetTrigger(\"ToggleLight\"); } }}