Api讲义

讲义(UnityAPI)

讲义(UnityAPI) 1
第一章 常用基础类 3
1.1 MonoBehavior类 3
1.1.1 概念 3
1.1.2 MonoBehavior类中的函数 4
1.1.3 MonoBehavior类中函数的生命周期 4
1.2 GameObject成员 4
1.3对象常用的组件 5
第二章 常用API 5
2.1 transform 5
2.1.1 Vector3 5
2.1.2 rotation(欧拉角) 6
2.2 Time类 6
2.3数学类 mathf 6
2.4 协同程序 6
2.5 输入类 6
2.6 鼠标 7
第三章 Rigibody刚体 7
3.1 Rigbody的概念 7
3.2属性 7
3.3 刚体的用法 7
3.4 相机视角案例 8
第四章 射线 8
4.1射线的基本使用 8
4.1.1射线的概念和作用 8
4.1.2 射线的相关API解析 8
4.2 射线的实例解析 9
4.2.1 利用射线实现点击拾取物体 9
4.2.2 利用射线实现物体的旋转 9
第五章 场景加载 10
5.1 场景加载用的类和结构 10
5.2 场景加载的方法 10
5.3场景加载实例 11
第六章 PlayerPfers 11
6.1 PlayerPfers的用法 12
第七章NGUI 12
7.1 NGUI简介 13
7.1.1 13
7.1.2 UI的概念 13
7.1.3 平面坐标系 13
7.1.4 UGUI和NGUI 13
7.1.5 DrawCall 13
7.2 NGUI在Unity里的使用 14
7.2.1 NGUI导入和目录结构分析 14
7.2.2 简介NGUI中的基本元素 15
7.2.3 详细解释UIROOT 15
7.2.4 NGUI中物体简介 15
7.2.5 图集的制作 16
7.2.6 NGUI中button的创建 16
7.2.7 创建一个输入框 16
7.3 实例演练 16
第八章 结合UGUI做一个换装的案例 16
8.1分析换装案例 17
8.1.1GUI Texture的创建: 17
8.2制作UGUI界面 18
8.2.1制作Button动画 18
8.2.2 人物选择功能的实现 18
8.2.3 皮肤切换 18
8.2.4 武器切换 18
8.2.5 动画切换 18
8.2.6 相机状态 19
混合树 (Blend Tree) 19
一维混合 (1D Blending) 20
参数范围 22
阈值 22
二维混合 (2D Blending) 23
二维混合示意图 (The 2D Blending Diagram) 24
位置 25
其他混合树 (Blend Tree) 选项 26
时间尺度 (Time Scale) 27
镜像 (Mirroring) 27

第一章 常用基础类
1.1 MonoBehavior类
1.1.1 概念
脚本:附加在游戏对象上的用于定义游戏对象行为的指令代码.
创建脚本的方法:
1.Assets——create ——C#脚本
2.projec里面右击——create ——C#脚本
1.1.2 MonoBehavior类中的函数
MonoBehavior是Unity中非常重要的类,几乎所有的脚本都和MonoBehavior有间接或直接的联系.所以我们要重点掌握!
1.update 每帧执行一次 用于更新游戏场景和状态(逻辑判断)
2.start 函数第一次运行之前调用 用于游戏对象的初始化
3.awake 脚本实例被创建 用于游戏对象的初始化 awake早与其他的start (all)
4.fixedupdate 每个固定的物理时间 用于物理引擎的参数更新
5.lateupdate 每帧调用 次序在update之后 用于更新摄像头
6.OnTirggerEnter/Exit/Stay 触发器函数
7.OnCollisionEnter/Exit/Stay 碰撞器函数
8.OnEnable 对象启用或者激活时候调用,可以多次执行的。
9.OnDisable 对象禁用或者取消激活时候调用
10.OnDestory 脚本销毁时候调用
11.OnGUI渲染GUI或者处理GUI消息时候调用
1.1.3 MonoBehavior类中函数的生命周期
Awake ——OnEnable ——start ——fixedupdate ——update ——lateUpdate——OnGUI——OnApplicationPause ——OnDisable ——OnDestroy ——OnApplicationQuit
1.2 GameObject成员
1.2.1 GameObject中的组件

1.Name: 对象的名称
2.Tag: 对象的标签
3.Transform:对象的transform组件,设置对象的位置 旋转 缩放
4.Animation: 游戏对象上面的animation的组件,设置动画的属性
5.Audio:游戏对象上面的audioSource组件,设置声音

三种构造方法:
GameObject go = new GameObject();
GameObject go = new GameObject(name);
GameObject go = new GameObject(name,typeof(rigibody));

1.2.2 GameObject中的函数

1.Find:静态函数,根据名称查找游戏对象 性能比较低
2.FindwithTag:根据标签,查找符合条件的游戏对象
3.SetActive:激活/取消激活游戏对象
4.GetComponent: 获取游戏对象上面的指定组件
5.GetComponentInChildren:获取游戏对象上子对象的指定组件
6.AddComponent:为游戏对象添加指定组件
7.SendMessage:调用某些方法
8.Destroy: 删除销毁一个游戏物体,组件,或者资源
9.Instantiate:复制对象(静态类调用)
10.DontDestroyOnLoad:加载场景的时候不销毁
1.3对象常用的组件
1.Transform: 设置对象的位置 旋转 缩放
2.Rigidbody: 设置物理引擎的刚体属性
3.Light: 设置灯光属性
4.Camera: 设置相机属性
5.Collider: 碰撞体属性
6.Animation: 设置动画属性
7.Audio: 设置声音属性
第二章 常用API
2.1 transform
2.1.1 Vector3
Vector3:表示3D的向量和点。 这个结构用于在Unity传递3D位置和方向。它也包含做些普通向量运算的函数。 (piant)
向量:在数学中,几何向量(也称为欧几里得向量,通常简称向量、矢量),指具有大小(magnitude)和方向的量.
Position: 世界坐标系中的位置
Localposition: 局部坐标系

up:Vector3(0, 1, 0). 写Vector3(0, 1, 0)的简码,也就是向y轴.
down: Vector3(0, -1, 0). 写Vector3(0, -1, 0)的简码.
forward:Vector3(0, 0, 1). 写Vector3(0, 0, 1)的简码,也就是向z轴。
back:Vector3(0, 0, -1). 写Vector3(0, 0, -1)的简码。
left:Vector3(-1, 0, 0). 写Vector3(-1, 0, 0)的简码,也就是向x轴的反方向.
right:Vector3(1, 0, 0). 写Vector3(1, 0, 0)的简码,也就是向x轴。
one:Vector3(1, 1, 1). 写Vector3(1, 1, 1)的简码。
zero: Vector3(0, 0, 0). 写Vector3(0, 0, 0)的简码。
Magnitue:返回度(只读)(慎用,对Cpu消耗较大)。
Nomalized:返回长度为1的该向量(只读)把向量标量化。
sqrMagnitude :返回这个向量的长度的平方(只读)。
Translate: 按照指定位置平移
Angle:由from和to两向量返回一个角度。形象的说,from和to的连线和它们一个指定轴向的夹角。向量的长
Cross:两个向量的叉积乘积结果在垂直于两个输入向量的三分之一个向量.一般用于判断小怪在玩家的左方或右方,可以方便旋转。
Dot :两个向量的点乘积。一般用于判断小怪是否和玩家的方向相同。
Distance:返回a和b之间的距离。
Lerp:两个向量之间的线性插值。
2.1.2 Rotation(欧拉角)
万象节锁:是指物体的两个旋转轴指向同一个方向。实际上,当两个旋转轴平行时,我们就说万向节锁现象发生了,换句话说,绕一个轴旋转可能会覆盖住另一个轴的旋转,从而失去一维自由度。
Quaternion:四元数用于表示旋转。它们是紧凑的,不会出现万向节锁并且能够很容易被插值。Unity内使用Quaternion表示所有旋转。
eulerAngles:返回表示旋转的欧拉角度。 表示旋转的角度,绕z轴旋转euler.z度,绕x轴旋转euler.x度,绕y轴旋转euler.y度(这样的顺序)。
Rotate:应用一个欧拉角的旋转角度,eulerAngles.z度围绕z轴,eulerAngles.x度围绕x轴,eulerAngles.y度围绕y轴(这样的顺序)。
Rotatearound:按照给定的参数旋转
LoaakAt: 旋转面向谁
2.2 Time类
Time: 从开始到现在的时间
Deltatime: 上一帧消耗的时间
Fixedtime:最近物理更新的时间
2.3数学类 mathf
Random.range():获取随机数,但是整型是包括最小值不包括最大值,浮点型是包括最小值和最大值。
Max 返回两个或更多值中最大的值。
Min 返回两个或更多值中最小的值。
Abs 返回绝对值。
2.4 协同程序
Startcoroutine:启动协同程序
Stopcoroutine: 停止协同程序
Stopallcoroutine:停止所有的协同程序
Waitforseconds:等待几秒钟
2.5 输入类
Getaxis: 得到哪个输入轴
Getbutton: 如果按下返回值TRUE
Getkey:按下的键
Mouseposition: 得到鼠标的位置信息
2.6 鼠标
1.定义缩放因子
2.获取鼠标的Mouse Y or Mouse X
3.指定物体旋转
第三章 Rigibody刚体
3.1 Rigbody的概念
刚体能让你的游戏对象被物理引擎所控制,它能通过受到推力和扭力来实现真实的物理表现效果。所有游戏对象必须包含刚体组件来实现重力、通过脚本施加力、或者与其他对象进行交互,这一切都通过NVIDIA的PhysX物理引擎来实现。
3.2属性
Mass 质量,单位为Kg,建议不要让对象之间的质量差达到100倍以上
Drag 空气阻力,为0表示没有阻力,infinity表示立即停止移动
Angular Drag 扭力的阻力,数值意义同上
Use Gravity 是否受重力影响
Is Kinematic 是否为Kinematic刚体,如果启用该参数,则对象不会被物理所控制,只能通过直接设置位置、旋转和缩放来操作它,一般用来实现移动平台,或者带有HingeJoint的动画刚体
Interpolate 如果你的刚体运动时有抖动,尝试一下修改这个参数,None表示没有插值,Interpolate表示根据上一桢的位置来做平滑插值,Extrapolate表示根据预测的下一桢的位置来做平滑插值
Collision Detection 碰撞检测算法,用于防止刚体因快速移动而穿过其他对象
Constraints 刚体运动的约束,包括位置约束和旋转约束,勾选表示在该坐标上不允许进行此类操作
Freeze Rotation 如果选中了该选项,那么刚体将不会因为外力或者扭力而发生旋转,你只能通过脚本的旋转函数来进行操作

3.3 刚体的用法
Position:该刚体的位置。
Rotation:刚体的旋转角度。
Velocity:刚体的速度向量。
AddExplosionForce:应用一个力到刚体来模拟爆炸效果。
AddForce :添加到刚体的力。
ForceMode 力模式
Force 添加一个rigidbody持续力,使用 的质量。
Acceleration 添加一个持续的加速度到刚体,忽视他的质量。
Impulse 添加一个即时rigidbody力脉冲,利用其质量。
VelocityChange 添加一个rigidbody瞬时速度变化,忽略了它的质量。
3.4 相机视角案例
第一人称视角和第三人称视角的写法
第四章 射线
4.1射线的基本使用
4.1.1射线的概念和作用
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。
用途:射线应用范围比较广,多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等。
4.1.2 射线的相关API解析
1.Ray Camera.main.ScreenPointToRay(Vector3 pos)
返回一条射线Ray从摄像机到屏幕指定一个点(点的取值范围为:屏幕的宽和高)
2.Ray Camera.main.ViewportPointToRay(Vector3 pos)  
返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点(点的取值范围为视口:0,1)
3.Ray 射线类 
4.RaycastHit 光线投射碰撞信息
5.bool Physics.Raycast(Vector3 origin, Vector3 Direction, float distance, int layerMask)
当光线与任何碰撞器交叉时为真,否则为假
6.bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()
7.bool Physics.Raycast(Ray ray, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
8.RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
  注意:如果从一个球型体的内部到外部用光线投射,返回为假。
9.bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
  当光线投射与任何碰撞器交叉时为真,否则为假。

  参数理解:
  origin : 在世界坐标中射线的起始点
  direction: 射线的方向
  distance: 射线的长度
  hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰 撞物体的transform,rigidbody,point等信息。 
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
1 << 2
0 << 2
0 << 5
4.2 射线的实例解析
4.2.1 利用射线实现点击拾取物体

4.2.2 利用射线实现物体的旋转

第五章 场景加载
5.1 场景加载用的类和结构
结构:UnityEngine.SceneManagement.Scene:
类UnityEngine.SceneManagement.SceneManager用于进行场景相关的操作
5.2 场景加载的方法
方法LoadScene():以索引、名称为参数,加载场景
方法LoadSceneAsync():以索引、名称为参数,异步加载场景,返回AsyncOperation对象,结合协同使用
方法 UnloadScene() 卸载某一个场景
类UnityEngine.AsyncOperation:表示异步加载场景的进度
属性isDone:表示是否加载完成,返回bool类型的值
属性progress:当前进度,返回float类型的值
属性allowSceneActivation:加载完成后是否自动切换到新场景,如果在场景比较小又希望看到进度条,则可以先设置成false,进度条完成后再设置成true
5.3场景加载实例

第六章 PlayerPrefs
6.1 PlayerPrefs的用法
//保存数据
PlayerPrefs.SetString(“Name”,mName);
PlayerPrefs.SetInt(“Age”,mAge);
PlayerPrefs.SetFloat(“Grade”,mGrade)
//读取数据
PlayerPrefs.GetString(“Name”,”DefaultValue”);
PlayerPrefs.GetInt(“Age”,0);
PlayerPrefs.GetFloat(“Grade”,0F);
第七章NGUI
7.1 NGUI简介
7.1.1
NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已有功能。对所有其他用户而言,这意味着更高的性能、更低的学习难度和更加有趣。完全集成到Inspector面板中。 不需要点击Play按钮就能查看结果。 在场景视图中看到的就是在游戏视图中得到的(所见即所得)。 基于组件的、模块化的特性:要让你的界面控件做什么,只需为其附加相应的行为,而不需要编码。 全面支持iOS/Android和Flash。 灵活的事件系统。 可以让复杂的UIs只占用一个draw call。
7.1.2 UI的概念
UI:user interface 用户界面
图形用户界面(Graphical User Interface)
UI在游戏中的重要作用: 游戏美术风格的主要组成部分,承担着重要的美观职责,负责清晰了的展示游戏方式,让玩家舒服,方便地进行人机交互.
7.1.3 平面坐标系
屏幕坐标系:以屏幕左下角为原点,右上角为(Screen.Width,Screen.Height)
鼠标位置坐标采用屏幕坐标系
GUI坐标系:以屏幕的左上角为原点,右下角为(Screen.width,Screen,Height)
7.1.4 UGUI和NGUI
UGUI:
就是unity官方出的一套新的UI系统. U就是unity
NGUI:
就是用于制作UI的一款插件.
NGUI的优势:
1.成熟稳定(历经数十个版本迭代,现在已经相当成熟)
2.功能丰富(拖曳 事件监听 各种TWEEN动画 )
3.操作方便(不需要运行就可以看到效果,直接显示在scene面板中)
4.好的性能优化(需要一次DrawCall 就可以完成大部分渲染)
5.高灵活性(通过改变组件就可以进行切换)
7.1.5 DrawCall
DrawCall就是CPU(图形处理器)采集顶点,纹理,数据(位置、角度等)之后,通知GPU绘制的这一个过程.更严谨的说就是CPU调用底层渲染接口的过程.
在手游开发中降低DrawCall是一件大事!一般控制在100以内.

例如红米手机CPU为1.5GHz,假设分出20%资源供渲染,希望游戏跑到30帧。那么能抗多少DrawCall? 25k * 1.5 * 0.2 / 30 = 250。因此从这方面也能看出,如果CPU不能分出更多的资源供渲染计算,能抗的DrawCall就会变少。
7.2 NGUI在Unity里的使用
7.2.1 NGUI导入和目录结构分析
NGUI我们可以去Unity的应用商店进行下载。下载完毕后导入Unity进行使用。
NGUI导入后目录为:

NGUI目录结构
Editor:编辑目录,以Editor命名的文件夹允许其中的脚本访问Unity Editor(自定义窗口)的API. Editor文件夹中的脚本不会在build时被包含。 
Examples: 案例目录,里面存放了一些NGUI中的案例.
Resources:资源目录.里面存放一些常用的资源,会在打包的时候放入到包内.
Scripts: 脚本目录,里面存放了NGUI的脚本.
7.2.2 简介NGUI中的基本元素
精灵:精灵就是从大图片中扣出来的一个小图片.
图集:就是把很多小图片压缩到一个大的图片中.这张图片叫做图集
UI贴图:就是一张大图片,和精灵类似,但是得使用一次UI贴图不需要依靠任何图集.
lable:通俗一点就是游戏中的文字
UIfont:就是在UI中使用的字体.
text:文本输入框
制作UI的前奏
在开始搭建NGUI之前,通常由美术人员给你一个效果图,NGUI搭建人员,根据美术效果图,开始搭建NGUI.
1.分析效果图由哪些元素组成
2.根据效果图自己裁剪/获取小图标
3. 制作图集,然后开始制作流程
4.静态字字体和动态字体
静态字体:就是提供一张自定义的含有所需要文字的图片和配置文件(文字的位置信息).
动态字体: 就是导入的是字体文件.如同.ttf文件.
7.2.3 详细解释UIROOT
UIRoot:作用就是用来缩放
UIRoot属性:
Scaling style: flexible constrained constrained On Mobiles
flexible:永远保持像素尺寸不变;
Constrained:根据尺寸来动态调整大小
Constrained On Mobiles:移动设备使用Constrained: 自动调整,
PC等使用flexible
Flexible: 原图是多大就是多大.一张512*512分辨率的图片在2K的分辨率和4K分辨率下大小是不变的.在高分辨率下图片比较小,低分辨率比较大.
Constrained: NGUI不保护尺寸大小,只关心自己的缩放.在这种模式下必须锁定height的值.假设height的设置为1000 100*100 的图片在高度1000的屏幕分辨率下占1/10的高度.在高度为500 分辨率下也是1/10 图片尺寸变换为50*50
7.2.4 NGUI中物体简介
1、Sprite(精灵)
创建一个Sprite Sprite简单来说就是一张图片
2、Panel
Panel是面片 上面的刚体是为了检测事件的
3、UICamera
NGUI渲染用的的相机 不要轻易更改
4、Label
可以通过选择Unity模式而选择字体 更改text,通过把Gradient勾掉和keep crisp 选择never可以把字体变得清晰
7.2.5 图集的制作
选择需要制作图集的图片,然后通过点击鼠标右键选择NGUI–Open Atlas Maker进行 图集的制作。制作的时候直接选择创建新的图集,通过命名保存就可以制作好新的图集。
图集创建成功后就可以把原先的图片资源删除。
7.2.6 NGUI中button的创建
创建button button包含 uisprite uibutton boxcollider
根据button上面的组件 自己去创建一个button 先创建一个sprite 然后右键添加boxcollider 再添加 uibutton 注意先后顺序 先添加collider 才可以添加 uibutton
然后改变button的颜色 NGUI都是组件堆砌的
7.2.7 创建一个输入框
根据上面的例子创建一个输入框
inputtyep可以设置密码模式

7.3 实例演练
制作一个登录界面,首先把game界面的分辨率选为市场大部分的分辨率比例16:9,把root改成适配模式,然后创建锚点,在锚点下面创建背景图,然后创建面片添加button,给button添加事件,创建逻辑框架。其中面片的现实和消失可以通过修改面片的Alpha或者Setactive来进行控制。
第八章 结合UGUI做一个换装的案例
8.1分析换装案例
8.1.1GUI Texture的创建:
GUI Texture :GUI纹理是显示在二维的平面图像。他们特别是于用户界面元素,按钮,或装饰。它们的定位和缩放只通过改变X和Y轴来完成。它们是在屏幕坐标测量,而不是世界坐标。
Unity5.x版本以后,原版本中的 GameObject->Create Other->GUI Texture选项变换了位置,该怎样创建相同的功能呢?
1.在Hierarchy窗口中创建Create Empty.
2.在其Inspector窗口中点击Add Component–>Rendering–>GUI Texture
3.往该GUI Texture组件中添加Texture时可能会遇到场景中无法显示所添加的Texture.只会出现一个空的坐标轴。
问题的解决方案:把Transform–>Position中的x和y都调节成0.5——根据多次调试GUITexture的坐标轴的x轴只有0~1,y轴一样,所以0.5就是中心位置

因为是属于GUI系统。编辑器的那个xyz方向轴只是代表一个屏幕比例和前后关系而已,并不是实际三维空间位置
判断GUITexture有没有被鼠标点击
GUILayer.HitTest
GUIElement HitTest(Vector3 screenPosition);
角色切换
activeSelf(read only只读):物体本身的active状态,对应于其在inspector中的checkbox是否被勾选
activeInHierarchy(read only只读):物体在层次中是否是active的。也就是说要使这个值为true,这个物体及其所有父物体(及祖先物体)的activeself状态都为true。改变肤色功能解析:
GetComponent.().material.mainTexture = textureColor[0];
通过改变材质球的mainTexture 达到改变肤色的功能。
改变动画功能解析:
animationComponent[monIndex].CrossFade(animationName);
进行动画切换
改变武器功能解析:
currentweapon=Instantiate(weaponGroup.weapons[0],weaponHand.position,weaponHand.rotation) as Transform;
通过在手上实例化新武器达到改变武器的功能。
底盘旋转改变:
通过获得mousex 和 mousey 改变 camera的状态
8.2制作UGUI界面
8.2.1制作Button动画
Button的transition模式选择animation模式 然后点击auto Generate Animatoion让动画的状态变化为动画模式
需要注意:button导航模式在这里选择none,不然动画会混乱
Navigation(按钮导航):假如你现在有四个按钮,当你点击第一个时,第一个会保持选中状态,然后通过按键盘方向键,会导航将选中状态切换到下一个按钮上,例如你的第一个按钮下方存在第二个按钮,当你选中第一个按方向键下时,第一个按钮的选中状态取消,第二个按钮进入选中状态,前提是这些按钮都开启了导航功能。
None(关闭):关闭导航。
Automatic(自动导航):自动识别并导航到下一个控件。
Horizontal(水平导航):水平方向导航到下一个控件。
Vertical(垂直导航):垂直方向导航到下一个控件。
Explicit(指定导航):特别指定在按下特定方向键时从此按钮导航到哪一个控件。
8.2.2 人物选择功能的实现
把人物依次放进场景中,通过按钮事件传递id从而进行人物之间的切换
8.2.3 皮肤切换
首先获取当前玩家,获取当前玩家身上的组件render改变材质球上的mainTexture达到换肤的功能。通过button事件传递人物皮肤ID。
8.2.4 武器切换
把武器绑定到手部骨骼下面,按照制定位置,实例化,进行武器之间的切换,但是在切换前要销毁当前武器。通过button事件传递人物武器ID。
8.2.5 动画切换
因为资源用的是旧的动画系统,我们首先要把人物动画改成新的动画系统Generic,然后创建动画控制器,配置动画控制器。通过改变动画控制器里的参数切换动画,通过button事件传递人物武器ID。
8.2.6 相机状态
添加相机运动脚本
第九章动画系统中的Blend Tree
混合树 (Blend Tree)
游戏动画中的一个常见任务是在两个或更多相似运动之间混合。最佳的已知示例可能是根据角色速度混合行走和奔跑动画。另一个示例是角色在奔跑过程中转弯时向左或向右倾斜。
重要的是区分转换 (Transition) 与混合树 (Blend Tree)。虽然两者都用于创建平滑动画,但是它们用于不同类型的情况。
转换 (Transition) 用于在给定时间量内从一个动画状态 (Animation State) 平滑转换为另一个状态。转换指定为动画状态机 (Animation State Machine) 的一部分。如果转换迅速,则通常可从一个运动很好地转换为完全不同的运动。
混合树 (Blend Tree) 用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。各个运动参与形成最终效果的量使用混合参数进行控制,该参数只是与动画器控制器 (Animator Controller) 关联的数值动画参数之一。要使混合运动有意义,混合的运动必须具有相似性质和时间。混合树 (Blend Tree) 是动画器控制器 (Animator Controller) 中的特殊状态类型。
相似运动示例可以是各种行走和奔跑动画。要使混合工作良好,片段中的移动必须在相同的规范化时间点发生。例如,行走和奔跑动画可以对齐,以便脚与地面接触的时刻在相同的规范化时间点发生(例如,左脚在 0.0 踏地,而右脚在 0.5 踏地)。因为使用规范化时间,所以片段是否具有不同长度无关紧要。
要开始使用新混合树 (Blend Tree),需要:
.右键单击动动画器控制器窗口 (Animator Controller Window)上的空白空间
.从出现的上下文菜单中选择 创建状态 (Create State) > 从新混合树 (From New Blend Tree)。
.双击混合树 (Blend Tree) 以进入混合树图 (Blend Tree Graph)。
动画器控制器窗口 (Animator Controller Window) 现在显示整个混合树 (Blend Tree) 的图形,而检视器 (Inspector) 显示当前选择的节点及其直接子级。

动画器窗口 (Animator Window) 显示整个 混合树 (Blend Tree) 的图形。左侧是仅包含根混合节点 (Blend Node) 的混合树 (Blend Tree)。右侧是包含根混合节点 (Blend Node) 以及以三个动画片段 (Animation Clip) 作为子节点的混合树 (Blend Tree)。
这会为参数值变化时的动画组合方式提供 图形可视化(在拖动滑块时,源自树根的箭头会改变其底纹以显示主要动画片段)。
可以在混合树 (Blend Tree) 图中选择任何节点以在检视器 (Inspector) 中检视它。如果所选节点是动画片段 (Animation Clip),则会显示该动画片段 (Animation Clip) 的检视器 (Inspector)。如果动画是从模型导入,则设置是只读的。如果节点是混合节点 (Blend Node),则会显示混合节点 (Blend Node) 的检视器 (Inspector)。

任何运动之前在 检视器 (Inspector) 中显示的混合节点 (Blend Node) 已添加。
混合类型”(Blend Type) 下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。
一维混合 (1D Blending)
混合节点 (Blend Node) 的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。一维混合 (1D Blending) 根据单个参数混合子运动。
设置混合类型 (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter)。在此示例中,该参数为方向 (direction),它在 -1.0(左)与 +1.0(右), 其中 0.0 表示笔直运行而不倾斜。
随后可以通过单击 + ->添加运动域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:

具有三个动画片段 (Animation Clip) 的一维混合 (1D Blend Node)。
顶部的示意图显示随着参数在其最小值与最大值之间变化,各个子运动的影响力。各个运动显示为蓝色小棱锥型(第一个和最后一个仅显示一半),如果单击其中一个并按住鼠标左键,则对应运动会在下面的运动列表中突出显示。各个棱锥型的顶点定义运动具有完全影响力时的参数值,这表示其动画权重为 1,而其他动画的权重为 0。这也称为运动的阈值 (Threshold)。

混合节点检视器 (Blend Node Inspector) 顶部的示意图形象地展示各个子运动在参数值范围内的权重。
红色垂直条指示参数 (Parameter) 的值。如果在检视器 (Inspector) 底部的预览 (Preview) 中按播放 (Play) 并在示意图中左右拖动红色条,则可以看到参数的值如何控制不同运动的混合。
参数范围
混合节点 (Blend Node) 使用的参数的范围在示意图下方显示为左侧和右侧的两个数字。可以通过单击数字并使用鼠标向左或向右拖动来更改其中任一数字。请注意,这两个值对应于运动列表中第一个和最后一个运动的阈值。
阈值
可以通过单击运动在示意图中的对应蓝色棱锥型并向左或向右拖动,来更改其阈值。如果”自动化阀值 (Automate Thresholds)” 开关未启用,则还可以通过在阀值 (Threshold) 列的数字字段中键入数字来编辑运动列表中运动的阈值。
运动列表下方是自动化阀值 (Automate Thresholds) 复选框。启用该复选框会将运动的阈值在参数范围内平均分布。例如,如果有五个剪辑并且参数范围为 -90 至 +90,则阈值会按顺序设置为 -90、-45、0、+45 和 +90。
计算阀值 (Compute Thresholds) 下拉菜单会通过从动画片段 (Animation Clip) 中的根运动获取的数据选择来设置阈值。可供选择的数据有速度 (speed)、速率 (velocity) x、速率 (velocity) y 或速率 (velocity) z 以及角速度 (angular speed)(以度或弧度为单位)。如果参数 (parameter) 对应于这些属性之一,则可以使用计算阀值 (Compute Threshold) 下拉菜单计算阈值。
属性: 功能:
速度 (Speed) 根据各个运动的速度(速率的量级)设置其阈值。
速率 X (Velocity X) 根据各个运动的速率 (velocity) x 设置其阈值。
速率 Y (Velocity Y) 根据各个运动的速率 (velocity) y 设置其阈值。
速率 Z (Velocity Z) 根据各个运动的速率 (velocity) z 设置其阈值。
角速度(弧度)(Angular Speed (Rad)) 根据各个运动的角速度(以弧度/秒为单位)设置其阈值。
角速度(度)(Angular Speed (Deg)) 根据各个运动的角速度(以度/秒为单位)设置其阈值。
也就是说,例如您的行走动画每秒行进 1.5 个单位,慢跑动画每秒行进 2.3 个单位,而奔跑动画每秒行进 4 个单位,那么从下拉菜单中选择速度 (Speed) 选项会根据这些值设置三个动画的参数范围和阈值。 因此,如果将速度参数设置为 3.0,则它会混合慢跑和奔跑动画,略偏向于慢跑。
二维混合 (2D Blending)
混合节点 (Blend Node)的检视器 (Inspector) 中的第一个选项是混合类型 (Blend Type)。此下拉菜单用于选择可以根据一个或两个参数混合的不同混合类型之一。二维混合 (2D Blending) 类型根据两个参数混合子运动。
不同二维混合 (2D Blend) 类型具有不同的适合用途。它们之间的差异在于计算各个运动影响力的方式。
二维简单方向 (2D Simple Directional)
最适用于运动表示不同方向时,如“向前行走”、“向后行走”、“向左行走”和“向右行走”或是“向上瞄准”、“向下瞄准”、“向左瞄准”和“向右瞄准”。可以选择包括位置 (0, 0) 处的单个运动,如“空闲”或“笔直瞄准”。在简单方向 (Simple Directional) 类型中,相同方向上不应存在多个运动,如“向前行走”和“向前奔跑”。
二维任意方向 (2D Freeform Directional)
此混合类型也在运动表示不同方向时使用,但是可以在相同方向上具有多个运动,例如“向前行走”和“向前奔跑”。在任意方向 (Freeform Directional) 类型中,运动集应始终包括位置 (0, 0) 处的单个运动,如“空闲”。
二维任意笛卡尔 (2D Freeform Cartesian)
最适用于运动不表示不同方向时。使用任意笛卡尔 (Freeform Cartesian) 时,X 参数和 Y 参数可以表示不同概念,如角速度和线速度。示例包括“向前行走而不转弯”、“向前奔跑而不转弯”、“向前行走并右转”、“向前奔跑并右转”等运动。
设置“混合类型” (Blend Type) 之后,需要执行的第一个操作是选择将控制此混合树 (Blend Tree) 的动画参数 (Animation Parameter) 。在此示例中,参数为 velocityX (扫射) 和 velocityZ (向前速度)。
随后可以通过单击 + -> 添加运动区域 (Add Motion Field) 将动画片段 (Animation Clip) 添加到混合树中,从而添加各个动画。完成后,它应类似于下面这样:

具有五个动画片段 (Animation Clip) 的二维混合节点 (2D Blend Node)。
二维混合中的位置类似于一位混合中的阈值,除了存在分别对应于两个参数的两个值,而不是一个值。其沿水平 X 轴上的位置对应于第一个参数,其沿垂直 Y 轴上的位置对应于第二个参数。向前行走动画可能 velocityX 为 0 并且 velocityZ 为 1.5,从而应将这些值键入运动的“位置 X”(Pos X) 和“位置 Y”(Pos Y) 数字字段。
二维混合示意图 (The 2D Blending Diagram)
检视器 (Inspector) 顶部的示意图显示二维混合空间中的子运动位置。这些运动显示为蓝色点。未分配动画片段 (Animation Clip) 或混合树 (Blend Tree) 的运动对混合没有影响力,显示为灰色点。可以通过在示意图中单击其点来选择运动。一旦选择后,该运动对混合空间中每个点的影响力会展示为蓝色区域。该区域在运动位置正下方最明显(其中运动具有完全影响力,这表示其动画权重为 1,而其他动画的权重为 0)。随着距离变远,影响力会下降,同时其他运动的影响力会逐渐占优势。

混合节点检视器 (Blend Node Inspector) 顶部的示意图形象地展示各个子运动在参数值范围内的权重。
红色点指示两个参数的值。如果在检视器 (Inspector) 底部的 预览 (Preview) 中按 播放 (Play) 并在示意图中四处拖动红色点,则可以看到参数值如何控制不同运动的混合。在示意图中,还可以看到各个运动的影响力(表示为围绕各个运动的圆形)。如果将红色点移动到表示运动的蓝色点之一上,则您会看到该运动的圆形会达到其最大半径,而所有其他运动的圆形会缩小为不可见。在介于几个运动之间的位置处,多个附近的运动会对混合具有一定影响力。如果选择其中一个运动以查看该运动的蓝色影响力区域,则可以看到,随着四处移动红色点,运动的圆形大小恰好对应于影响力区域在各个位置处的强度。
未选择任何运动时,示意图显示所有影响力区域的混合,其中单个运动占优势的位置处蓝色较深,许多运动参与混合的位置处蓝色较浅。
位置
可以通过单击运动在示意图中的对应蓝色点并四处拖动,来更改运动的位置。还可以通过在“位置 X”(Pos X) 和“位置 Y”(Pos Y) 列的数字字段中键入数字,在运动列表中编辑运动的位置坐标。
计算位置 (Compute Positions) 下拉菜单会通过从动画片段 (Animation Clip) 中的根运动获取的数据选择来设置位置。可供选择的数据有速度 (speed)、速率 (velocity) x、速率 (velocity) y 或速率 (velocity) z 以及角速度 (angular speed)(以度或弧度为单位)。如果参数 (parameters) 对应于这些属性之一,则可以使用“计算位置”(Compute Positions)下拉菜单计算“位置 X”(Pos X) 和/或“位置 Y”(Pos Y)。
属性: 功能:
速率 XZ (Velocity XZ) 根据各个运动的 velocity.x 设置其“位置 X”(Pos X),并根据其 velocity.z 设置其“位置 Y”(Pos Y)。
速度和角速度 (Speed And Angular Speed) 根据各个运动的角速度(以弧度/秒为单位)设置其“位置 X”(Pos X),并根据其速度设置其“位置 Y”(Pos Y)。
而且可以选择计算位置 (Compute Position) -> X 位置 (X Position From) 和/或 计算位置 (Compute Position) -> Y 位置 (Y Position From) 以便一次仅自动计算其中之一(另一个保持不变),从而进行混合和匹配。
属性: 功能:
速度 (Speed) 根据各个运动的速度(速率的量级)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 X (Velocity X) 根据各个运动的 velocity.x 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 Y (Velocity Y) 根据各个运动的 velocity.y 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
速率 Z (Velocity Z) 根据各个运动的 velocity.z 设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
角速度(弧度)(Angular Speed (Rad)) 根据各个运动的角速度(以弧度/秒为单位)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
角速度(度) (Angular Speed (Deg)) 根据各个运动的角速度(以度/秒为单位)设置其“位置 X”(Pos X) 或“位置 Y”(Pos Y)。
也就是说,例如您的参数对应于侧向速率和向前速率,并且有一个平均速率为 (0, 0, 0) 的空闲动画、一个平均速率为 (0, 0, 1.5) 的行走动画以及两个速率分别为 (-1.5, 0, 0) 和 (1.5, 0, 0) 的扫射动画。从下拉菜单中选择速率 XZ (Velocity XZ) 选项会根据这些速率的 X 和 Z 坐标设置运动的位置。
其他混合树 (Blend Tree) 选项
以下选项对一维和二维混合通用。
时间尺度 (Time Scale)
可以使用动画速度数字字段(顶部具有时钟图标的列)改变动画片段 (Animation Clip) 的“自然”速度,从而可以通过使用值 2.0 作为速度,使行走速度是以前的两倍。调整时间尺度 (Adjust Time Scale) > 均匀速度 (Homogeneous Speed) 按钮可重新调整片段的速度,以便它们符合参数的最小值和最大值,但是保持最初具有的相同相对速度。
请注意,仅当所有运动都是动画片段 (Animation Clip) 而不是子混合树 (Blend Tree) 时,调整时间尺度 (Adjust Time Scale) 下拉菜单才可用。
镜像 (Mirroring)
可以通过启用最右侧的镜像开关来镜像运动列表中的任何类人动画片段 (Animation Clip)。此功能使您可以采用原始形式和镜像版本使用相同动画,而无需两次使用内存和空间。

猜你喜欢

转载自blog.csdn.net/luxifa1/article/details/82584930
今日推荐