【Unity教程】零基础带你从小白到超神part3
粒子系统
在创建粒子系统之前,需要先添加一些粒子样式,这可以在资源商店中通过导入官方提供的StandardAssets资源包得到。完成资源的导入后,该资源包中的StandardAssets>ParticleSystems>Prefabs文件夹下包含多种成品粒子效果,如烟雾和火焰等,如图所示。我们可以将这些预制件拖曳到场景视图中进行预览,部分效果如图示。
在“层级”面板中执行“创建>效果>粒子系统”命令,即可在场景中创建出一个基础的粒子系统,效果如图所示。
- 预热:勾选该选项后,粒子在最初时播放循环一个周期后的状态,而不会从一开始就逐渐产生粒子。以雨天效果为例,如果不勾选该选项,那么会有一个从不下雨到雨逐渐下大的过程;而如果勾选该选项,那么该场景一开始就已经在下着大雨了。
- 启动延迟:粒子系统发射粒子的延迟时间。
- 技巧提示
在ParticleSystem组件中,部分选项框的右侧有一个黑色的三角形图标,单击后可以切换该选项为曲线、随机或渐变等模式。 - 起始生命周期:粒子从发射出来到消失的存活时间。
- 起始速度:粒子的初始速度。
- 3D开始大小:是否使用3D模式设置粒子在3个轴向上的大小。
- 起始大小:粒子的初始大小。
- 3D开始旋转:是否使用3D模式设置粒子在3个轴向上的旋转。
- 开始旋转:粒子的初始旋转。
- 翻转旋转:设定部分粒子相对其他粒子反方向旋转。
- 起始颜色:粒子的初始颜色。
- 重力修改器:重力数值,默认0为不使用重力。
- 模拟空间:粒子相对于局部坐标系、世界坐标系,或基于自定义物体坐标系进行模拟。
- 模拟速度:粒子的模拟速度。
- 时间差:设定粒子是否受到增量时间的影响。
- 缩放模式:粒子受到哪个模式的影响而缩放,有“层级”“局部”“形状”3种模式。
- 层级:受自身缩放影响,也受父级缩放影响。
- 局部:受自身缩放影响。
- 形状:不受缩放影响。
- 唤醒时播放:是否自动播放。
- 发射器速度:粒子系统在移动时是通过刚体还是通过转换组件进行计算。
- 最大粒子:粒子数量限制,超过限制数量后不会发射新粒子。
- 自动随机种子:让每次播放模拟的效果都不同。
- 停止行动:粒子系统播放完成并且所有粒子消失后,可以选择一个停止行动,如禁用、销毁和回调。
- 剔除模式:粒子离开屏幕后执行的操作。
- 环状缓冲模式:粒子不会在生命周期内结束,而在存活到最大粒子缓冲区已满时,用新粒子取代旧粒子。
汇入Standardassets的粒子
技术提示
除了这些属性,Unity还提供了对粒子进行基本操作的快捷工具,可快速对粒子的形状、位置、旋转和缩放进行修改,工具栏
6.2.3 粒子渲染效果
在Particle System组件中,“渲染器”也是默认激活的粒子模块。该模块规定了粒子是如何进行渲染的,可以在该模块设置粒子为不同类型的渲染模式并对每种渲染模式进行详细的设置,“检查器”面板
重要参数介绍
- 渲染模式:粒子使用的渲染模式。
- 法线方向:数值范围为0~1,值为0时向外指向粒子发射方向,值为1时指向摄像机。
- 材质:渲染粒子时使用的材质。
- 排序模式:粒子的排序模式,不同的排序模式会影响显示的粒子。
- 排序矫正:较小的值会让粒子显示在其他透明物体或粒子之前。
- 最小粒子大小:粒子的最小尺寸。
- 最大粒子大小:粒子的最大尺寸。
- 渲染对齐:设定粒子对齐方式,是面向摄像机还是与世界坐标对齐等。
- 轴心:设定单个粒子的轴心位置偏移。
- 可视化枢轴:在场景视图中显示每个粒子的轴心。
- 遮罩:当有遮罩时,设置粒子的显示行为。
- 投射阴影:粒子接受阴影的方式。
- 接受阴影:设定粒子接受阴影,只有不透明材料才可以接受阴影。
- Sorting Layer ID(图层ID):设置粒子的排序图层。
- 图层顺序:渲染器在排序图层中的顺序。
6.2.4 粒子速度
除了前面所讲的3个模块,其他功能模块在默认情况下都是非激活状态,如果想要使用某个功能模块,那么需要先激活该模块。这里介绍其他常用功能模块中的“生命周期内速度”模块,“检查器”面板
重要参数介绍
-
线性:设置粒子在3个轴向上的线性速度。
-
空间:设置使用的坐标系为世界坐标系还是本地坐标系。
-
轨道:让粒子围绕3个轴进行旋转。
-
偏移:旋转中心点的偏移设置。
-
射线:粒子远离中心位置的径向速度。
-
速度修改器:修改粒子的速度倍数。
6.2.5 粒子颜色、大小与旋转
对粒子来说,常常需要设置的就是颜色、大小和旋转属性,在前面的设置中我们已经学习了对起始状态的粒子进行基本的属性设置。除此之外,我们还可以对粒子在生命周期内或基于速度内的这3种属性进行设置。
-
粒子颜色
在“颜色”选项组中,“生命周期内颜色”和“速度颜色”功能模块都可以对粒子的颜色进行设置。“生命周期内颜色”模块是基于生命周期进行颜色的设置,而“速度颜色”模块是基于速度进行颜色的设置,“检查器”面板如图
技术专题:粒子的渐变调节
要想进一步对粒子的颜色进行调节,可使用“生命周期内颜色”模块对粒子进行渐变处理,丰富粒子的效果。执行“游戏对象>效果>粒子系统”菜单命令在场景中创建一个粒子系统,
在“生命周期内颜色”模块的“颜色”选项中,通过“颜色”面板对颜色和Alpha值进行设置。颜色条上方的色标用于对Alpha值进行设置,颜色条下方的色标用于对颜色值进行设置,在颜色条上、下方的空白部分进行单击还可以添加新的色标。这里添加一个中间区域的颜色色标,如图所示。另外,颜色选择界面中有两种模式可供选择,第1种模式为默认的“混合”模式,可让色标中间的颜色呈渐变色;第2种模式为“非渐变”模式。
双击新添加的颜色色标,设置颜色为(R:131, G:242, B:248);同时设置第1个色标的颜色为(R:64, G:248, B:25),最后一个色标的颜色为(R:255, G:13, B:246)。渐变颜色设置完成后,粒子就能在生命周期内呈现所设置的颜色了,如图
2. 粒子大小与旋转
与“颜色”模块类似,在“生命周期内大小”和“速度决定大小”模块中可以对粒子的大小进行设置。在“生命周期内旋转”和“按速度旋转”模块中可以对粒子的旋转进行设置。
技术专题:粒子的形态调节
要想进一步对粒子的形态进行调节,可使用“生命周期内大小”模块对粒子的曲线进行调节,丰富粒子的效果。执行“游戏对象>效果>粒子系统”菜单命令在场景中创建一个粒子系统。
单击“生命周期内大小”模块的“大小”选项框,通过面板底部一栏提供的常用的曲线样式可对曲线进行设置,
如果没有一个样式可以满足我们的需求,那么还可以手动设置曲线样式。在曲线上的任意一处位置单击鼠标右键,选择“添加密钥”选项
这时会出现一个曲线操纵杆,拖曳曲线操纵杆完成曲线的编辑,参数及效果分别如图
实例1和其他功能
实例2
线条效果
在任意游戏物体上添加LineRenderer(线段渲染器)组件,即可通过该组件进行线段的绘制;或执行“游戏对象>效果>线”菜单命令创建一个线段渲染器物体,其“检查器”面板
重要参数介绍
-
简化预览:显示简化线段预览。
-
容差:评估从线上删除哪些点,数值越大,线条越简单。
-
循环:勾选该选项后,会自动连接线段的首、尾点。
-
位置:当前线段点的数量和具体位置。
-
宽度:线段宽度设置,也可以设置一条曲线来应用于宽度。
-
颜色:线段颜色设置,也可以设置渐变色。
-
角顶点:每个角添加多少个顶点,数值越大越平滑。
-
末端顶点:每个端点添加多少个顶点,数值越大越平滑。
-
材质:线段所使用的材质。
使用“线段渲染器”并不难:先设置“线段渲染器”所使用的材质,然后设置需要的宽度和颜色,最后单击“创建”按钮并在场景视图中进行单击,即可在单击位置添加线段端点。
除此之外,还可以在“位置”属性上通过填写坐标的方式来添加端点,展开“位置”选项即可设置
实例1
实例2
“拖尾渲染器”
可用于绘制各种形式的拖尾效果,起到丰富游戏画面的作用。
1. 添加组件
“拖尾渲染器”的用法与“线段渲染器”的用法十分相似,如果想让某个游戏物体具有拖尾效果,那么就需要在该游戏物体上添加Trail Renderer(拖尾渲染器)组件;或执行“游戏对象>效果>拖尾”菜单命令创建一个自带“拖尾渲染器”的游戏物体
重要参数介绍
- 宽度:拖尾宽度设置,也可设置一条曲线来应用于宽度。
- 时间:拖尾时间,以s为单位。
- 最小顶点距离:在拖尾上生成新顶点的距离。
- 自动销毁:无拖尾时销毁游戏物体。
- 正在发射:暂停拖尾生成。
- 颜色:线段颜色设置,也可以设置渐变色。
- 角顶点:每个角添加多少个顶点,数值越大越平滑。
- 末端顶点:每个端点添加多少个顶点,数值越大越平滑。
- 材质:线段所使用的材质。
实例1
实例2
旧版动画系统Animation
添加组件animation,在窗口-动画-动画,打开动画的制作面板,选择一个,
接下来跟ae一样,手动K帧可太痛苦了
关键帧确实是一个很关键的概念,涉及到视觉效果的开发基本都会用到
执行“面板>动画>动画”菜单命令打开“动画”面板,保持选择该动画物体,即可看到创建动画剪辑的提示
每个动画组件都可以创建多个动画剪辑。单击“创建”按钮创建,待选择了动画剪辑的保存位置和修改名称后,即可创建第一个动画剪辑
重要参数介绍
- 新建动画剪辑New Animation:选择要编辑的动画剪辑或创建新的动画剪辑。
- 预览:是否开启场景预览模式。
- 记录关键帧:是否开启关键帧记录模式。
- 转到剪辑开头:转到动画剪辑开头。
- 上一个关键帧:跳转至上一个关键帧。
- 播放:播放动画剪辑。
- 下一个关键帧:跳转至下一个关键帧。
- 动画剪辑结尾:跳转至动画剪辑结尾。
- 筛选:按选择筛选。
- 关键帧:添加关键帧。
- 帧事件:添加帧事件。
技巧提示
动画剪辑创建完成后,在“项目”面板中即可看到创建完成的动画剪辑。选择该动画剪辑,在“检查器”面板中可选择动画的循环模式,默认情况下仅播放一次,也可以更改为“循环模式”等
通过属性制作动画
动画的制作就是属性的变化,如位置属性变化就会产生移动动画,旋转属性变化就会产生旋转动画。因此制作动画的第一步就是要明确制作的动画类型及相关属性,再将该属性添加到“动画”面板中。下面以立方体的位置移动为例进行动画的说明。
先为立方体添加Animation组件,然后创建一个动画剪辑,接着单击“添加属性”按钮为新建的动画添加动画属性。可以选择的动画属性均为物体组件具有的基础属性,也就意味着我们可以添加各种组件,然后分别为这些组件制作动画。这里我们选择添加“位置”属性,所以单击Position右侧的“添加”按钮
添加属性后,观察右侧的时间线面板,系统将自动在第0s和第1s处生成两个关键帧,代表动画剪辑的头部和尾部。然后选择时间线上的0:30(图中白色竖线指向的位置),在左侧面板修改已添加的属性数值,如将Position.x设置为10,即可生成一个关键帧
动画剪辑设置完成后,需要将“项目”面板中的动画剪辑关联到立方体的Animation组件中
运行游戏,立方体开始执行移动动画。因为在第0.5s处修改了立方体在x轴的位置,所以生成的动画效果就为0.5s内从原点沿x轴方向移动10个单位,接下来在0.5s内再回到起始位置。第0s、第0.5s和第1s时物体的位置。
技术专题:添加关键帧的另外3种方式
除了上述方法,关键帧的添加方式还有多种。第1种方式,单击“关键帧记录模式”按钮,然后通过在场景中拖曳游戏物体的位置来添加或修改关键帧;第2种方式,单击“添加关键帧”按钮手动添加关键帧;第3种方式,在时间线上选择需要添加的关键帧的位置后,在“检查器”面板中找到Transform组件的“位置”属性,然后单击鼠标右键,选择“添加密钥”选项,
在“动画”面板中单击左下角的“曲线”按钮即可切换到曲线显示模式,可在曲线模式中清楚地看到位置属性的变化和关键帧的位置。
在动画曲线编辑设置界面中,可直接对关键帧进行修改,如对曲线中间的关键帧进行拖曳
技术专题:动画曲线的操作
在动画曲线编辑设置界面中,选择关键帧并单击鼠标右键即可看到关键帧控制菜单,可对关键帧处的曲线控制等操作进行切换
Delete Key选项可删除当前关键帧,Edit Key选项可修改当前关键帧的具体数值和时间
其他选项均为曲线操纵杆的设置,读者可对该菜单中的选项一一进行选择并观察效果。这里要重点注意“断开”选项,当选择了“断开”选项后,即为将曲线操纵杆断开,断开后可对“左切线”和“右切线”分别进行设置
选择新添加的关键帧,然后在“检查器”面板中选择脚本中创建的方法
对基本的位移动画来说,它是通过物体向左右两侧来回移动实现的。现在大家来思考一个小需求,为这个简单的动画添加一个功能,即当立方体移动到最右侧的时候播放一个爆炸效果。要想制作这样一个效果,仅靠动画是很难实现的,我们就需要配合代码来完成这类需求。
在某一帧触发一个脚本事件,在事件中用代码来配合动画执行,这就是帧事件。帧事件可以完美解决上述需求,在“项目”面板中执行“创建>C#脚本”命令创建一个脚本,并命名为Test,然后将其添加到有移动动画的立方体上。编写的脚本代码如下。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimationTest : MonoBehaviour
{
//Startiscalledbeforethefirstframeupdate
void Start()
{
//Updateiscalledonceperframe
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GetComponent<Animation>().Play("right");
}
}
}
技巧提示
灵活运用帧事件可以做很多事情,当动画执行到某个关键位置时,我们可以添加不同的特效或播放不同的音频。例如,角色播放的挥拳动画,可以在挥拳动画中找到一个合适的位置来添加关键帧,同时当动画播放到该位置时播放挥拳的音频,并在拳头处产生挥拳特效。又如在走路动画中,可以在角色的左、右脚触地时分别添加一个关键帧,然后在关键帧上播放鞋子碰到地面的音频,这样当角色通过该动画走路时就会发出鞋子碰到地面的声音。
本例将实现门的开与关,效果如图
新版动画系统Animator
Unity提供了新版的Animator(动画器)系统,新版动画系统可以方便地管理大量动画及动画间的切换和过渡,同时也区分了普通动画和人物骨骼动画。选择要制作动画的游戏物体,为其添加Animator组件。
在中间的项目里创建动画器控制器,和旧版一样,先创建一个动画,双击就出现一个这个,出现
直接行动树加状态机 加动画组件集合,每个框都是一个动画状态entry就是入口
在“项目”面板中的RPGCharacterAnimationPackFREE/Animations/Unarmed文件夹中包含了多个动画模型,选择动画模型就可以看到其中包含的动画。然后将RPG-Character@Unarmed-ldle动画拖入“动画器”面板,会自动生成一个ldle状态,并且会自动关联ldle动画,即有一条线从Entry连向Unarmed-ldle状态;也就意味着当动画开始播放时直接进入ldle状态,并播放ldle动画。运行游戏后,选择要播放动画的角色,可以看到“动画器”面板中的ldle动画也会显示一个进度条,代表当前执行该动画
Unity一般使用FBX格式的模型和动画。如果希望进行复杂建模操作,那么一般会先使用3dsMax、Maya等软件进行模型和动画的制作,再导出为FBX格式的文件,最后导入Unity中进行使用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimatorTest : MonoBehaviour
{
private Animator animator;
// Start is called before the first frame update
void Start()
{
// 获取动画器组件
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
animator.Play("right");
}
}
}
在上节中,我们学习了为角色添加动画控制器并添加默认的站立动作,接下来我们继续为动画控制器添加其他动画。找到“项目”面板中的RPGCharacterAnimationPackFREE/Animations/Unarmed/RPG-Character@Unarmed-Run-Forward动画并将其拖曳到“动画器”面板中,
选择ldle状态并单击鼠标右键,选择“创建过渡”选项,然后单击Run状态,即可创建一个过渡,表示允许从ldle状态过渡到Run状态
在状志“中创建一个新BledTree
同样,选择Run状态并单击鼠标右键,选择“创建过渡”选项,然后单击ldle状态,即可创建一个过渡,表示允许从Run状态过渡到ldle状态
松开鼠标左键,角色停止跑步,状态从Run过渡到Idle
角色动画可以在mixamo做,我们先在商店下载CharacterPack:FreeSample
里面有一个预设的MaleFree1
条件:左上角float,int,bool和trigger,trigger是触发器,
playercontrol.cs
控制角色移动
先创建一个平面,找到我们的角色,放到地面上,创建一个脚本PlaterControl.cs,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 水平轴
float horizontal = Input.GetAxis("Horizontal");
// 垂直轴
float vertical = Input.GetAxis("Vertical");
// 向量
Vector3 dir = new Vector3(horizontal, 0, vertical);
// 面向向量
transform.rotation = Quaternion.LookRotation(dir);
}
}
这个有问题,就是停止输入后dir会回到(0,0,0),导致静止时方向也会被强行摆正
创建一个动画器模拟器,要实现平时站立动画,偶尔触发run动画的条件,左上角选择bool值,创建IsRun的方法,右边编订两条线是true和false
接下来进一步完善代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 水平轴
float horizontal = Input.GetAxis("Horizontal");
// 垂直轴
float vertical = Input.GetAxis("Vertical");
// 向量
Vector3 dir = new Vector3(horizontal, 0, vertical);
// 当用户按下了方向键
if (dir != Vector3.zero)
{
// 面向向量
transform.rotation = Quaternion.LookRotation(dir);
// 播放跑步动画
animator.SetBool("IsRun", true);
// 朝向前方移动
transform.Translate(Vector3.forward * 2 * Time.deltaTime);
}
else
{
// 播放站立动画
animator.SetBool("IsRun", false);
}
}
}
动画剪辑。那么我选中一个动画,将检查器里的rig中选择人形,定义不管。在Animation中下滑话找到时间轴,双击+号即可生成新的对话,里面进一步修改。
实例
曲线与帧事件
接上集,Animation中下滑有一个曲线,比如游戏的蓄力状态,时间越大火焰越大,可以自行画一个火焰,我们新增float来获取曲线的数值,在原来的PlayerControl上获取,曲线名字要和参数名一样才行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 水平轴
float horizontal = Input.GetAxis("Horizontal");
// 垂直轴
float vertical = Input.GetAxis("Vertical");
// 向量
Vector3 dir = new Vector3(horizontal, 0, vertical);
// 当用户按下了方向键
if (dir != Vector3.zero)
{
// 面向向量
transform.rotation = Quaternion.LookRotation(dir);
// 播放跑步动画
animator.SetBool("IsRun", true);
// 朝向前方移动
transform.Translate(Vector3.forward * 2 * Time.deltaTime);
}
else
{
// 播放站立动画
animator.SetBool("IsRun", false);
}
//随时获取Test参数并打印出来
//Debug.Log(animator.GetFloat("Test");
/**/
}
}
帧事件我们可以在run动画中设定两个时间为leftfoot和rightfoot,这样可以便于播放时间声音(脚步), 在/**/中添加代码
void leftFoot(){
Debug.Log("左脚");
}
void rightFoot(){
Debug.Log("右脚");
}
混合动画
正如图片所说,创建新混合树blendtree,双击进入选择1D,blend,左侧添加一个新的float参数Blend。右侧parameter添加一个新的+运动域,motions中添加walk和run的混合动画,左侧选择动画的混合程度。
那么2d就是......
动画层
我们一直在默认图层base layer中,第一个入口状态我们已经知道了,第二个也就是说如果拿它创建了过渡以后啊,那就证明无论是当前场景的什么状态,他就代表任何场景中的状态啊,无论什么状态都可以过渡为谈这个跑步和这个战力啊。比如现在有100多个动画,直接anystate--->到run上,就证明这100多个动画都可以过渡到跑步呀,如果没有,那就很麻烦了;
还有一个Exit出口,除了我们可以创建一个空的状态和混合树,还可以创建一个子的状态机new statemachine,双击进入。一般我们也不怎么用他。
比如现在我们拿刀的一个动画,拿枪的一组,那么就不同子状态机里。
我们创建新的layer, 发现有设定的新的动画不显示,是因为layer的权重较低。
实例
动态捕捉
千面视频动捕 - AI在线视频动作捕捉平台摄像头捕捉,有点感慨我在大概2021年第一次听说中国的v圈,那时看天下描绘了洛天依的巨变,asoul的变故,好像现在嘉然糖下面还有人说,知乎上已经说cv领域绝大部分已经发展到了极点,令人感慨,这不正是吗?b站上一堆底层小v画皮套钱,视频捕捉,每时每刻有新vtuber,每时每刻有坚持不了的,然后b站的特有的风光大葬,哎哎
反向动力学
实例
实例
本例将制作潜入游戏,效果如图所示。