VFX入门教程(二)和 XR Interaction Toolkit 系列教程(四)
这篇教程因为和两个系列教程都有关联,每个都涉及一点,所以标题两个都加进来了。Unity最近出来个VR Beginner示例工程,是用Oculus Quest作为开发机,以及XR Interaction Toolkit 作为插件的一个示例工程。这个教程里面有很多ShaderGraph和VFX的东西,大家可以下载下来学习一下。今天的例子操作比较简单,但是在很多地方都能用到,并且可以做的比较酷炫,由于是
·
这篇教程因为和两个系列教程都有关联,每个都涉及一点,所以标题两个都加进来了。Unity最近出来个VR Beginner示例工程,是用Oculus Quest作为开发机,以及XR Interaction Toolkit 作为插件的一个 示例工程 。这个教程里面有很多ShaderGraph和VFX的东西,大家可以下载下来学习一下。
今天的例子操作比较简单,但是在很多地方都能用到,并且可以做的比较酷炫,由于是个示例教程,容许我效果是最基础版本,所以有点糙,主要也是为了方便新人容易理解和学习。
好了,先看看效果。




首先按照XR Interaction Toolkit 系列教程前面的内容搭建一个基础的XR-RoomScale环境。然后我从VR Beginner工程里面抠出来了手部模型和动画。新人注意抠模型的时候把上面的脚本去掉,动画留下,不然导出资源的时候会附带一堆的其他不相关的脚本和资源。
这个时候把手部模型导入自己工程后,把模型拖到LeftHandController的XRController组件上的ModelPrefab上,再在LeftHandController新建一个Transform,用来设置模型的相对位置和方向,这个还是蛮关键。VR游戏设计时优先确定手部位置是否精确。可用双手指尖水平方向互相触碰食指指尖,对比一下,此时现实中指尖触碰到的时候,游戏中直接是否接触到了。如果现实和游戏的位置一致并且精确,则可以进行下一步。

上图中,SelectUsage 填你想要的触发按钮。它可以控制下面ModelSelectTransition和ModelDeselectTransition。而这两个参数里面填写你触发动画的参数,也就是模型上Animator Controller 上的参数,这里示例中已经给了2个Trigger参数,分别是Selected和Deselected,我这里就直接用上去了。

这里有个新发现,用了这么多年Unity,居然一直不知道。看这个示例的时候我才第一次发现原来可以这么用。我抠手的时候好奇,为什么只有一只右手,没有左手,然后我看工程的时候发现,左手的Transform的Scale的 X 为 -1 ,这样就能直接反向了。我去!真的第一次看人这么用,我以前一直以为这个值最小为0。又刷新了我的认知,这个发现为我以后解决很多其他方位朝向等问题的时候提供了新的解决思路。
这个时候你就可以按Grip握拳了。
那怎么把模型粒子化呢?
我在MainCamera下新建了一个Camera,命名为ViewCamera。并将相对位置和角度全部置为0。试图让新建的相机的视角和主相机完全一致,并且将FOV也调成和主相机一致,保持此相机和主相机完全看的视口一样。但是我这个新建的相机,为了优化性能,关掉抗锯齿,将裁剪区域设置成0.1到10,因为我的这个示例中只看手,并且手通常都离自己很近,所以我缩小了Clipping Planes。然后再在文件中新建一个RenderTexture,并且绑定到ViewCamera的TargetTexture上,让相机的直接渲染到RenderTexture上。注意FilterMode选Point。Size可以根据自己的需求填写。 再新建一个Layer,命名为Hands。并将文件夹中的手部模型的layer设置为hands。如图: 再将ViewCamera的CullingMask设置为Hands,是新建的相机只照射手的模型。再将主相机中的CullingMask中的Hands去掉,是主相机看不到手部模型,为的是只能看到后来生成的粒子,而消去原来的模型。


好了,这个时候新建一个空的VFX,将节点设置成下面的样子:

节点比较简单,一目了然,赶重点的说。首先ConstantSpawnRate,这个数是我RenderTexture的size,x与y的乘积的十倍。因为这个效果本就是运用RenderTexture的深度缓存和颜色缓存。这里因为主要介绍原理主干,我没对颜色等细节做详细处理。对于入门的人来说,其实最重要的就是知道粒子的位置是怎么得来的,有的需要通过计算,有的通过模型,有的通过相机深度缓存等等等等。下一讲可能还是主要涉及位置的赋值。这里的Position用的是depth。将外面新建的相机传进来,给到这里。
怎么传递相机呢?上一讲里面说到了blackboard。点击Blackboard右上角的‘+’,添加新的属性,选择相机。然后如图: 如果你勾选Exposed.那么就会选用外面传参,下面显示的这些都不会采用,不用管;当然你不勾选的话下面这些参数就是默认使用的参数了。 当你勾选Exposed后,VFX的Inspector下就会出现此参数,未勾选之前是不会显示出来的。


这里提示一下,URP下相机是没法传的,只有在HDRP下相机才能的各项参数才能传到VFX Graph里面。当然按粒子的数量来看,URP的硬件应该也处理不了这么庞大数量的粒子。
流程中Update模块是空的,但是没有删掉,是因为如果删除的话会导致Lifetime这类属性不再更新,所以需要留下。
我输出的是Cube,当然你可以输出任何你想的效果。 这里可以看到Discretize节点,离散化。学会离散数学的人应该一看名字就知道是什么意思了,为了防止解释不准确,贴一个百度的解释:

Discretize节点的参数A是你深度信息点的位置,此时是你粒子的位置,参数B是离散化程度的。这里建议各位可以系统的学习一下离散数学,会让你对编程的理解更加深入,有很大的帮助。很基础的数学学科,但是用处很大。
下面有个Subpixel Anti-Aliasing节点,这个节点是当你粒子小于一像素大小时,限制你粒子的大小在一个像素。如果你让手部粒子的Size会变小或远离你的话,这个节点就有用了。说到这里,给出三个隐藏的比较深的文档,希望各位学习VFX一定要看看,文档内容介绍是官方介绍基础属性的,我不可能在教程中一个个罗列出来,浪费我写的时间,也浪费大家看的时间。所以各位一定自己要看看。可能由于文档还有待完善,所以没有找到直接入口,要不是搜索引擎,根本查不到。以下地址:
这三个官方文档不多,但是一定能解决你很多问题。
好了,这篇教程就介绍到这,这篇文章主要介绍一种粒子效果的主干信息,你可以在这个基础上添加速度方向,控制它的size、color、纹理、光效等等来实现更加酷炫的效果,如果有任何想法或者好的资料,欢迎下方留言,评论。
更多推荐
所有评论(0)