我使用UNITY3D设计3d竞速赛车游戏戏但是为什么AI不会按照我规划的路线移动

本系列文章由 Amazonzx 编写欢迎转载,轉载请注明出处

本文将重点介绍两种目前在移动平台上的主流阴影制作技术,同时也会简单介绍两种移动平台上相对较为高级的动态阴影生成方法

由于目前主流使用Unity3.x在移动平台上并不支持阴影的动态生成技术,所以目前最普遍流行同时性价比也最高的阴影生成方法有以丅两种:

所谓简单贴图法即是直接在角色的角底附加一个阴影半透明贴图并让其跟随角色一起运动,一般是将该阴影Object成为角色模型的子粅体该种阴影生成效果如下:

其中ShadowComponent是控制阴影的一个脚本,与其生成无关故不再这里介绍。影响该应用生成的主要有两个部分一个昰Shadow网格,另外一个则是渲染所需要的材质“No Name”需要注意的是,Shadow网格是一个平面但不建议使用Unity自身生成的Plane,因为Unity生成的面数较多可通過3DMax等建模工具来自行建模,如下所示:

对于材质最重要的则是Shader的书写,我将其列在下方以方便大家使用:

通过以上设置即可生成最简單的阴影效果,大家可以通过自己设定脚本来控制阴影的移动和变化等等

但是,该阴影生成方法有一个明显的“硬伤”即该阴影只能適用于平坦的地面,一旦地面凹凸不平或有遮挡物则会出现“穿帮”的效果,如下图所示该方法生成的阴影对脚下的正方体完全没有影响,所以为了解决这种问题投影生成法应运而生。

该方法本质上来说是一种贴花(Decal)技术即设定一个投影器,然后将阴影贴图投射箌你想展现阴影的地方该方法的优点在于投影效果不取决于被投影区域的几何形状,即被投影区域可以任意凹凸的曲面也可以处理各種障碍物。该方法生成的阴影效果如下:

下面我就具体介绍一下该阴影的生成方法:

我们看到场景中不仅生成了阴影,同时角色的身体吔“变黑”了这是因为投影器的“Ignore Layers”设定为“Nothing”的缘故,我们将可忽略层设为角色的层“Player”则可使角色不再被投影,效果如下:

其中材质所用到的shader为:

通过以上的步骤我们即可实现投影式的阴影生成方法。与第一种方法一样可以设定一些特定脚本来控制该阴影的移動以及变化等等。另外需要注意的一点是“Ignore Layers”选项的设定,原则上是尽量去掉那些不需要被投影的层从而来减少不必要的计算量。

上述两种方法是目前移动平台上的主流阴影生成方法优点是生成简单,使用方便、计算量较小但缺点同样突出,即该阴影是假的并不昰真的物体投射阴影,所以真实感并不强下面我就介绍两种目前可以在移动平台上使用的实时动态阴影生成方法,不过在这篇中我们只介绍阴影效果并不介绍具体的实现技术和生成方法,留待以后高级教程中讲解

虽然Unity目前并不支持在移动设备上生成动态阴影,但同样鈳以通过RenderTexture来生成简单的Shadow Map效果图如下所示:

我们看到所生成的阴影存在锯齿,这是由于Shadow Map分辨率不够所致你可以通过增加RenderTexture的分辨率来减少鋸齿的影响,如下图所示当然这样做的同时也会带来一定的渲染消耗。

该方法取自于游戏《Shadow Gun》通过分析物体的近似环境遮挡信息来实時生成动态阴影,效果如下图所示:

其生成方法大致为如下三步:

首先在角色脚底生成一个显示阴影的网格

其次,根据分别在角色的跨步以及两腿处生成三个圆球通过这三个圆球来计算底面的环境遮挡(Ambient Occlusion)信息。

最后根据计算所得AO信息来动态细分网格,这样就可以生荿最终的AO阴影

综上所述,本文已经给出了移动平台上角色阴影的两种基本渲染方法及其Shader实现在这里我并没有去分析每种渲染效果的原悝,而仅是从实际出发直接给出对应的简单实现方法。如果想要对阴影的生成方法进行深入理解可以Google搜索其原理进行了解。对于后两種真实的动态阴影生成方法我将在后续的blog中进行详细更新。

参考资料

 

随机推荐