大家好我是帅明,欢迎大家来观看我制作的第三期视频。
在这次的视频里,首先我会向大家介绍一下Mesh编程的一些原理,利用Mesh编程来实现模型变形的效果,来模拟人物冲撞地面和墙壁并使其发生形变的过程,这一部分是参考了《Semblance》的游戏效果,在这个游戏中玩家就需要利用地形的形变进行解谜。
大家在掌握Mesh编程的原理之后也可以继续深入,利用代码来实现一些以前需要动画才能实现出的效果,例如《街霸5》中拳头打到肌肉上的变形效果,或者是像乐克乐克中各种物体的Q弹效果。具体的教学视频和demo工程文件也都已经上传至MCAT官网上了,大家可以在视频下方的简介处看到地址,觉得视频还不错的话,记得帮忙在B站上多多评论转发还有一键三连哦! 这一次我玩到了一个新游戏叫做《Semblance》。这是一个平台跳跃游戏,但区别于传统类型,它的核心玩法中加入了允许玩家改变地形的元素。
我认为这是一个非常有潜力的玩法,能够让玩家创造出很多连开发者都意想不到的通关方法。可惜原作对此的限制有些多,所以我想要在unity中把地形改变这一效果制作出来,后面实现一些我自己想要的关卡。
在这我考虑了两种用来实现地形弯曲的方法。最简单的办法就是在3维建模软件里,建出游戏里的地面。然后进行绑定骨骼和蒙皮操作,导入游戏中就可以通过改变骨骼的位置就能够实现出地形的弯曲变化了,而且效果很好。
但唯一的缺陷则是地形的长宽高以及骨骼的数量不能改变,如果需要制作新的不同的地形,需要去建模软件里建一个新的模型,增加了新关卡的制作难度。
而第二种方法则是本次视频主要介绍的,利用Mesh编程来实现地形的弯曲变化,由于是使用Mesh编程生成的地形,所以形状可以随意定制,变形的效果也非常好。
为了用mesh编程生成地形,我们首先要了解一下什么是Mesh。
Mesh的中文翻译叫做网格,其中需要至少包含一组在3D空间中的顶点以及一组由顶点组成的三角形。
Unity本身支持多种文件格式的模型,在这我们就以obj格式的文件举例。其中主要包含了4部分。
顶点的三维坐标
顶点对应在纹理上的坐标
表示法线方向的三维向量
通过对以上三项内容进行组合后就可以得到一个顶点的完整信息。而最后第四项就是使用顶点信息,每三个一组,组合出的多边形。
例如这个立方体,就是在3D空间中的8个顶点,以及构成这6个面的12个三角形。同样,圆形和椭圆形都是由点和三角形构成的。知道了3d模型在计算机里的呈现方式之后,就可以根据我们的需求生成出所需要的的模型用来显示地形了。
由于生成一个实际模型的步骤稍微有些繁琐,所以在这里就不再介绍具体的实现。
CubeCreate脚本将用于生成我们需要的地形,这个就是我之前所提到的生成网格用的逻辑。
然后是CubeShader,这个shader将用来控制地形显示的颜色。
新建3个材质球,shader全部都选择CubeShader。设置好后为这三个材质球分别设置其在XYZ三个方向的朝向。之后分别给他们设置一个容易辨识的颜色。
新建一个Cube,然后把他Mesh Filter里原本的内容以及碰撞区去掉。因为我们之后会生成一个Mesh来替代它。
选中刚才新建的Cube,添加上脚本,然后设置好Cube的长宽高。注意这里Z轴上的尺寸要大于等于2,这样才能保证正确显示模型。接着在Mesh Renderer中把3个材质都设置好,最后点击运行就能在场景里看到我们用代码生成的Cube了。
有了程序生成的地形,接下来我们就要实现弯曲的效果了。
在原游戏中,地形的弯曲是由主角冲刺后碰撞地形产生的形变。
在这里我已经提前写好了一个简单的控制主角的脚本用来演示基本功能。可以看到在这里我虽然还没有运行游戏,但是却能在场景视图中显示平台的大致形状。
这是因为我重新定义了OnDrawGizmos函数,使其能够在游戏没有运行的时候标记出网格里的顶点。
接下来就是游戏的核心功能,也就是要让玩家冲刺时冲击地形后改变地面的形状。
在这我编写了MeshDeformer这个脚本来让地形产生形变。这个脚本中,最重要的就是AddForceToVertex这个函数。通过它来根据碰撞位置对所有的顶点进行位移的计算,越靠近的顶点位移越大,而远离碰撞点的顶点则位移更小,这样就可以产生平滑的变形效果。
当然,Mesh改变了之后并不会改变碰撞盒和法线,碰撞盒错误就无法正确移动,而法线错误就会导致渲染出错,所以我们这里还需要利用Mesh Collider和RecalculateNormals这个方法,这样在每次发生变形了之后及时的更新地形的碰撞盒还有法线。
接下来,再到游戏主角的控制代码里。在这我利用了射线检测的方法来获取主角与地形的碰撞,但为了能够让玩家准确操控碰撞的方向,这里在全方向的碰撞检测上进行了一些细小的调整。
我把玩家冲刺的方向与射线检测的方向直接挂钩,如果往左冲刺就往左边发射射线,往右就向右边发射射线。当然大家也可以用OnCollisionEnter这个函数来检测碰撞,但依旧需要区别冲刺时的方向,不然可能会出现碰撞的方向和冲刺方向不符的情况。
可以看到地形已经可以跟随玩家的冲刺发生对应的形状变化。如果觉得撞击力度不够大的话,可以进入PlayerMove里调整force的大小,在这里我又尝试了从10变成了20,当然也可以随意调整为其它数值。
由于篇幅关系,这一次先只讲了基本功能的实现,不知道对你是否有所帮助。而在下一期视频里,我还会继续利用这个基础功能,再添加上一些其它的元素,让这个游戏变得更好玩,期待我们在下期再见。
评论区
共 4 条评论热门最新