Unity3D教程:动画系统教程

u3d动画系统一【动画基础工作流+Animator视图】 介绍u3d的动画基础工作流+Animator视图 阅读详情

转自 : http://www.unitymanual.com/thread-1906-1-1.html

动画系统非常的灵活强大,动画系统支持动画融合、混合、叠加动画,行走循环的时间同步,动画层,控制动画的各个方面,以及支持基于物理的布娃娃系统和程序动画。这里做个笔记文章,记录整个从0开始使用Unity的动画系统。下载官网的CharacterAnimation例子里面带有3个动画模型,以及这三个模型的简单调用的例题。unity3d教程手册

 

Unity3D教程:动画系统教程(一)

这里例题中包含三个基本的数据模型,Goober是一个简单的小丑,Robot则是一个机器人战士,Soldier是一个人类战士。

 

Unity3D教程:动画系统教程(一)

在自带的动画模型里,除了模型Robot以外,还包含了很多@XXX结尾的动作,我们调用的时候,只需要按照@后面的动作名称调用即可。
1)新建一个场景,创景地形,并且将Robot模型拖到场景中。

 

Unity3D教程:动画系统教程(一)

这个时候的场景中是没有任何代码的,直接运行场景,你就能看到这个模型在运行“idle”动作。

 

Unity3D教程:动画系统教程(一)

看来Unity不但自己加载了模型,而且识别出了动作,自动调用了待机动作。为了防止Unity自己的动作影响到我们的代码操作,在开始的时候我们就把默认动作关闭。创建一个JS脚本,加入如下代码:

[C#]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
function Start ()  
 
{  
 
   animation.Stop(); 
 
}<!--DVFMTSC-->


    在动画播放方式上,Unity有两种方法,一种是Play(),这种方式的动画没有任何混合,直接播放动作,这样的动作看起来比较生硬,而且在Unit用的官方文档里建议个别动画可以使用Play()方式播放,那似乎是不建议使用Play来播放动画;另外一种是Animation.CrossFade。这是一种再带混合的动画播放模式,他可以让动画逐渐变化,而不是生硬的切换。Unity3D教程手册

    这就是动画融合的用武之地。在Unity同一个角色可以拥有任意数量的动画。所有动画被融合或添加在一起,来产生最终

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
// Makes a character contains a Run and Idle animation  
 
// fade between them when the player wants to move 
 
// 让一个角色包含Run和Idle动画,并且在玩家想移动的时候在他们之间淡入淡出。 
 
function Update () { 
 
     if (Mathf.Abs(Input.GetAxis( "Vertical" )) > 0.1) 
 
         animation.CrossFade( "Run" ); 
 
     else 
 
         animation.CrossFade( "Idle" ); 
 
}


    将上面这段代码拷贝到JS脚本中,我们按方向键就可以看到刚刚的Robot在“Run”和“Idle”两个动画柔和切换的动作变化。

    如今的游戏,Animation Blending是确保角色平滑动画的一项重要功能。动画师创建的分段动画,如:行走循环、跑步循环、 空闲动画或射击动画。在游戏的任何时间点都有可能从空闲转换到走动,反之亦然。当然你不希望两个不同的动作之间突然跳转,想要动画平滑过渡。

    通过animation还可以设定动画的运行方式,可以animation.WrapMode方式来修改是否循环播放。

[C#]  纯文本查看  复制代码
?
1
2
3
animation.wrapMode = WrapMode.Loop; 
 
animation[ "jump" ].wrapMode = WrapMode.Clamp;


    动画层可以控制玩家的动画播放优先级,具体的用法似乎还挺丰富的,从文档上看,最起码的用途是可以在其他的动画还在播放的时候,优先播放而不影响底层级的动画。比如当层级都是1,在跑动的时候,点击射击按钮,则没有反应会一直奔跑。如果设定射击的动作层级为1,其他都为0的时候,跑动的时候点射击,角色就会执行射击动作。

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function Start ()  
 
{  
 
// Set all animations to loop 
 
   animation.wrapMode = WrapMode.Loop;     
 
   // except shooting     
 
   animation[ "shoot" ].wrapMode = WrapMode.Once;       
 
   // Put idle and walk into lower layers (The default layer is always 0)     
 
   // This will do two things     
 
   // - Since shoot and idle/walk are in different layers they will not affect     
 
   //   each other's playback when calling CrossFade.     
 
   // - Since shoot is in a higher layer, the animation will replace idle/walk     
 
   //   animations when faded in.     
 
   animation[ "shoot" ].layer = 1;       
 
   // Stop animations that are already playing     
 
   //(In case user forgot to disable play automatically) 
 
   animation.Stop(); 
 
}


[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
function Update () { 
 
  
     if (Mathf.Abs(Input.GetAxis( "Vertical" )) > 0.1 || Mathf.Abs(Input.GetAxis( "Horizontal" )) > 0.1) 
 
         animation.CrossFade( "run" ); 
 
     else 
 
         animation.CrossFade( "idle" ); 
 
     // Shoot     
 
     if (Input.GetButtonDown ( "Fire1" ))        
 
         animation.CrossFade( "shoot" );  
 
}
============================================

测试一下控制角色,这样在上次人物动作的基础上让角色可以在场景里面跑起来。首先为角色增加一个CharacterController。然后设定一些变量控制角色的速度。

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var speed = 3.0; 
 
var rotatationSpeed = 200.0; 
 
private var curSpeed = 0.0; 
 
  
function Update () { 
 
     // Rotate around y-axis 
 
     var newRotation = Input.GetAxis( "Horizontal" ) * rotatationSpeed; 
 
     transform.Rotate(0, newRotation * Time.deltaTime, 0); 
 
  
     // Calculate speed 
 
     var newSpeed = Input.GetAxis( "Vertical" ) * speed; 
 
     if (Input.GetKey( "left shift" )) 
 
         newSpeed *= 1.5; 
 
  
     // Move the controller 
 
     var controller : CharacterController = GetComponent (CharacterController); 
 
     var forward = transform.TransformDirection(Vector3.forward); 
 
     controller.SimpleMove(forward * newSpeed); 
 
  
}<!--DVFMTSC-->


要让我们控制的机器人可以一边跑一边射击,那么就必须要用到 unity 中一个非常重要的动画技术 “动画混合Animation Mixing”。
找个动画文件来看看: robot@idle2shoot.fbx 这个动画。在这套动画文件中,包含了很多的动画动作。我们的每一个动画都包含了好多的动作,其中包括了 手上的动作和腿脚的动作。通常情况下我们播放动画就是直接播放一个动作就可以了,但是遇到需要动作融合的时候,就不能直接的调用动画,而是要选用其中的一部分有用的动画。 unity3d 教程手册

 


现在我们要对Run这个动作和Shoot两个动作进行混合。先来看看Shoot的动作序列:在这个动作中基本上只包含了两个上身持枪和动作,下身基本上没动。这个动作融合主要是针对shoot的上半身。
 



    首先,利用Shoot动画片段,生成一个新的动画片段“shootUpperBody”

[C#]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
animation.AddClip(animation[“shoot”].clip, “shootUpperBody”);
 
  
  animation[“shootUpperBody”].AddMixingTransform(transform.Find(“mover/roothandle/spine1”));
 
  
  animation[“shootUpperBody”].AddMixingTransform(transform.Find(“mover/gun”));


增加两个混合矩阵,让动作融合。这个动画角色的动作骨骼矩阵包含四部分,我们选择的spine1是上身的动作矩阵的根矩阵:

 


然后在运动的代码中调用

[C#]  纯文本查看  复制代码
?
1
animation.CrossFadeQueued( "shootUpperBody" , 0.3, QueueMode.PlayNow);


    然后跑起来的的角色,就有shoot和run混合的效果。Unity3D教程手册

[C#]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function Update () { 
 
  
     if (Mathf.Abs(Input.GetAxis( "Vertical" )) > 0.1 || Mathf.Abs(Input.GetAxis( "Horizontal" )) > 0.1) 
 
     { 
 
         animation.CrossFade( "run" ); 
 
         animation[ "run" ].speed = Mathf.Sign(Input.GetAxis( "Vertical" )); 
 
     } 
 
     else 
 
         animation.CrossFade( "idle" ); 
 
  
     // Play the cross fade animation 
 
     if (Input.GetButtonDown ( "Jump" )) 
 
     { 
 
         animation.CrossFade( "jump" , 0.3); 
 
     }    
 
  
     // Shoot     
 
     if (Input.GetButtonDown ( "Fire1" )) 
 
     { 
 
     // We are running so play it only on the upper body 
 
         if (animation[ "run" ].weight > 0.5) 
 
             animation.CrossFadeQueued( "shootUpperBody" , 0.3, QueueMode.PlayNow); 
 
         // We are in idle so play it on the fully body 
 
         else 
 
             animation.CrossFadeQueued( "shoot" , 0.3, QueueMode.PlayNow);    
 
       } 
 
}

VGG16 VGG16学习笔记 阅读详情

相关推荐

ROS-Industrial :simple_message

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1. 概述2. 协议(Protocol)3. HEADER解析3.1 MSG_TYPE3.2 COMM_TYPE3.3 REPLY CODE 1. 概述 Simple_Message是ROS-Industrial的一部分,定义了用于与工业机器人控制器通信的简单消息连接协议。另外还包括处理连接受限系统的处理器和管理器类。 2. 协议(Protocol) 简单消息(simplemessage)协议定义了ROS的驱动层和机器人控制器之.

flsxyw的博客 780

Unity核心9——3D动画

Has Exit Time:是否有退出时间,如果勾选,当切换动画时,动画一定是播放到下方的 Exit Time(百分比)的时间时才过渡到下一个动画。​ 我们是否可以这样做,比如开枪动画只影响上半身,下半身根据实际情况播放站立,跑动,蹲下动作,通过上下半身播放不同的动画就可以达到动画的组合播放。不同的是有一个上层的图标(Up Base Layer),通过连接该状态来转移到上层状态机的某个状态。主要用于直接从另一个层复制状态过来,在该层中进行修改,另一个层的设置信息都将保留,我们只需要替换状态对应的动画即可。

weixin_53163894的博客 7889

H桥电路原理

一、H桥原理 图1中所示为一个典型的直流电机控制电路。电路得名于“H桥式驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图1及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。   如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左...

Loadingzc的专栏 7万+

独立开发,产品如何冷启动?前Uber增长大佬的产品冷启动指南

Andrew Chen是Andreessen Horowitz的普通合伙人,专注于早期消费类初创公司。他曾担任Uber的增长团队主管,负责司机注册、推荐计划和供应侧的顶层漏斗工作。在他的领导下,Uber实现了历史上最高的增长速度,用户数量超过1亿,并在六个月内完成了从10亿次到20亿次出行的里程碑。

程序员陆通 1562

学习Python,小白如何搭建Python环境?

学习Python,首先需要搭建好Python环境,主要分为【运行环境搭建】、【开发环境搭建】以及【Python环境配置】三个环节,接下来我将对Python环境搭建这三个部分进行介绍。

weixin_72923265的博客 9001

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 106

2022-07-06 Unity核心9——3D动画

​ 使用导入的 3D 动画:(一)状态设置相关参数​ 我们可以选中状态机窗口中的某一个状态为其设置相关参数,我们可以称之为动画状态设置​ 主要设置的是当前状态的播放速度等等细节​ 在 Animator 窗口中选择其中一个状态,可以看见 Inspector 窗口中如下参数:Motion:分配给此状态的动画剪辑Speed:动画的默认速度Multiplier:控制速度的乘数,如果要使用需要勾选的 Parameter 选中配合的参数 float 类型Motion Time:运动的时间,如果要使用需要勾选的 Para

zheliku的博客 4092

YOLOv8性能提升:基于SPD-Conv的高效空间深度转换卷积技术解析【YOLOv8】

SPD-Conv是一种结合了空间和深度信息的卷积技术。与传统卷积不同,SPD-Conv通过在卷积过程中动态调整空间维度和深度维度之间的关系,使得模型能够在较少的参数下捕捉到更多的空间细节。这种方法尤其适用于检测小目标和复杂场景中的细微特征。SPD-Conv的核心思想是通过引入一个空间深度转换矩阵,将输入特征图的空间信息有效地映射到更高维度的深度信息中。这种转换不仅可以保留输入图像的空间细节,还可以在卷积操作中增强特征的表达能力。空间深度转换:通过一个线性变换矩阵,将输入特征图的空间信息转换为深度信息。

博客 1809

Unity3D 实用技巧 - 理解骨骼动画原理 & 在Unity3D中使用

其实我们在游戏中,会常会应用到动画。所以今天小编与大家一起来深入了解“动画”,其实动画主要分为关节动画、骨骼动画、单一网格模型动画(关键帧动画)。1)关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;2)骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运...

unityofficial的博客 2935

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 239

使用Python实现深度学习模型:智能光污染监测与管理

本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。

Echo_Wish 591

Unity3D 4.0新功能:Mecanim动画系统基础教程

作为Unity4.0的主要更新功能,Mecanim动画被寄予了很多的期望。系统有先进的地方,也有不足的地方。这些我们留到最后再来总结。          阿赵粗略的学习了一下,写下以下的教程。这篇教程简单的说明了Mecanim系统的用法和控制方式,里面用到的资源,是从AssetStore里面下载的,如果有兴趣的朋友可以去免费下载。            学习目标:         

仰望星空 2509

46、大数据助力SDN优化流量管理与控制器

本文探讨了大数据在软件定义网络(SDN)中的应用,重点分析了如何利用大数据技术优化SDN控制器的可扩展性和弹性。通过介绍SDN控制器的核心功能及其面临的挑战,提出了集中式、分布式、混合式和分层式控制器放置策略,并结合大数据分析系统架构与技术,详细阐述了在控制器放置优化、流聚合和备份路径识别等场景中的实际应用。文章还给出了大数据分析在SDN控制器优化中的操作流程与优势,展望了未来结合人工智能与物联网的发展方向,强调了数据安全与算法效率的重要性。

xx56789的博客 86

unity基础开发 ----Unity3D 4.0新功能:Mecanim动画系统基础教程

作为Unity4.0的主要更新功能,Mecanim动画被寄予了很多的期望。系统有先进的地方,也有不足的地方。这些我们留到最后再来总结。 阿赵粗略的学习了一下,写下以下的教程。这篇教程简单的说明了Mecanim系统的用法和控制方式,里面用到的资源,是从AssetStore里面下载的,如果有兴趣的朋友可以去免费下载。 学习目标: 我预先准备了几个没有带动画的3d模型,fbx格式,然后一些导出

wanglang3081的专栏 7896

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: C#中out和ref之间的区别
下一篇: C#中的委托和事件
我是一纸巾
博客等级 码龄12年 14粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值