Unity3D游戏开发之Unity3D中的动态阴影

来源:互联网 发布:天谕炎天女捏脸数据图 编辑:程序博客网 时间:2024/05/29 19:36

http://blog.csdn.net/qinyuanpei/article/details/32355267

    博主今天想和大家分享的是Unity3D中的动态阴影,昨天博主重温了一下自己喜欢的游戏《古剑奇谭2》,发现更新后游戏增加了三个免费的DLC。这三个DLC主要是对主线剧情的一个扩展,博主这里最喜欢的是可控角色初七。从这一点可以看出,烛龙在某种程度上已经默许了以沈夜、谢衣等人为代表的全新主角群。记得当初《古剑奇谭2》刚刚发布的时候,外界对于这款的游戏的评价可谓是褒贬不一。有人认为它是近年来国产单机游戏中异军突起的后起之秀,其大刀阔斧地革新让传统的国产RPG焕发出新的生命力。而有的人则认为它在战斗模式上不伦不类,上手缺乏打击感,剧情冗长拖沓。关于外界对这款游戏评价,我们这里不去探讨孰是孰非,我们只是来探讨这款游戏中值得我们去研究的东西。博主在玩了这个DLC以后,明显感觉到烛龙这次在战斗模式上可谓下足了功夫,角色初七是博主十分喜欢的一个角色,这个角色的招式带给人的感觉是有一种ACT游戏的感觉,似乎是烛龙在设计这个DLC的时候在刻意将玩家引导到这个方向上去,总之博主在控制这个角色的时候,找到了很多年前玩《流星蝴蝶剑》的感觉。好了,我们的游戏先聊到这里,希望对国产RPG游戏感兴趣的朋友可以和我交流啊。我们来一起看下面的这幅图:


       我们注意到在主角初七的脚下有一个绿色的光环,在游戏中这是由于主角收集了一个木属性的灵力。我们这里不关注金、木、水、火、土、五行的属性,我们真正要关注的是这个绿色的光环。在游戏中,当玩家行动时,这个绿色的光环可以跟随玩家一起移动,而这就是我们今天要重点讲解的内容啦,那么在Unity3D中如何实现这种效果呢,我们一起来看今天的内容吧!

       一、简单贴图法

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

      

      关于这个阴影半透明贴图的做法呢,大家可以参考这篇文章:Unity3D游戏制作(三)——移动平台上的角色阴影制作。不过这种方法存在一个严重的问题,即这种阴影只能应用于平坦的地面上,如果地面凹突不平或者地面上有遮挡物体,则很容易出现穿帮效果。由于之前博主已经读过这篇文章,所以在玩这个DLC的时候特意关注了这个问题,结果博主发现《古剑奇谭》使用的就是这种方式,由于无厌伽蓝中的地面较为平坦,因此选用这种方式可以实现这种效果,只是在经过两个房间中间的台阶时,由于地面时凹突不平的,因此玩家脚下的阴影会被遮住一部分。所以,作为一个技术人员,我们一定要善于从平时的生活中发现问题,所谓处处留心皆学问啊。


     二、投影生成法

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

     (1)通过GameObject->Create Empty来创建一个空的物体,并取名为“Shadow Projector”。

     (2) 通过Component->Effects->Projector在该空物体上加入Projector组件,并通过平移、旋转和调整参数达到如下效果:

      

     (3)然后在Material选项中拖入已经准备好的材质,即可投影出阴影。

     我们很快可以发现这种方法同样存在问题,即场景中不仅生成了阴影,同时角色的身体也变黑了,这是因为投影器的Ignore Layers设定为Nothing的缘故,我们将可忽略层设为角色的层Player,则可使角色不再被投影。

      上述两种方法是目前移动平台上的主流阴影生成方法,优点是生成简单,使用方便、计算量较小,但缺点同样突出,即该阴影是假的,并不是真的物体投射阴影,所以真实感并不强。不过作为初学者,我们还是应该踏踏实实地来掌握这种基础的方法,因为只有在掌握了基础的前提下,我们才能尝试去突破自我把知识内化为自己的东西。好了,下面我们一起来利用今天的方法来实现一个简单的例子吧。首先我们创建一个简单的场景,如下图所示:


      为了让我们更专注于动态阴影的制作,我们这里使用的时官方提供的人物模型,为了使用投影器,我们将Projectors包导入到项目中来:


     接下来我们创建一个空物体,命名为Projector,然后为其添加投影器组件,接下来我们调整投影器的位置和角度使其垂直于角色向下投影。为角色创建一个单独的层Player,将Projector组件的Ignore Layers设置为Player,这样可以使我们角色不变黑,材质选择Shadow Material。此时,场景中的效果如下:


可以注意到我们的角色脚底下已经有了阴影的效果。好了,在确定Projector和角色的x与z坐标一致后,我们将其拖入模型下方,使其成为模型的子物体。这样阴影将和模型保持一致,好了,我们运行程序:


       我们可以看到程序运行很完美,请大家无视角色脚下黑乎乎的那团影子啊,哈哈。

       好了,下面我们再来一起实现基于绘制贴图的方式来实现阴影效果啊。首先我们准备一张图片,这是博主自己找的一张图片:


       下面我们在场景中添加一个Plane命名为TextureProjector,将这张图片拖入到TextureProjector中,调整到合适的大小。如图:


       类似地,我们在确定这张贴图和角色的x与z坐标一致后,将其拖入我们将其拖入模型下方,使其成为模型的子物体。运行程序:


      在实际应用中可能要解决贴图平滑旋转的问题,这里只是为了演示基于贴图实现阴影的方法而已,当然我们不建议使用Unity自身生成的Plane,因为Unity生成的面数较多,可通过3DMax等建模工具来自行建模,这样可以优化我们的项目。


0 0