unity3d放大物体阴影消失_Unity3D中实现全屏大招表现


项目是3D的,需要在某个英雄在放大招的时候,所有人都静止,整个屏幕都交给他来表(zhuang)演(bi),以此来提升表现力。

要好的表现力就需要好的定制,动作特效镜头等都需要弄上,甚至有的技能要把人降维到漫画里……这样就没办法直接用战场里现有的资源了,由此提出了本文课题:

       如何让我的英雄自由装逼

447f50b34d38d10353edf5f6988c14fe.gif

对就像这样

2D动画

美术同学直接做2D动画,挂在UI上播放,这是接到需求后最先想到的方案(~~大概是因为不需要程序做什么功能~~)。

该方案的优点:

  • 全程美术工作,效果可控

  • 开销极小

缺点:

  • 全程美术工作,工作量大,沟通成本高,迭代压力大

  • 适配做起来非常麻烦

我们是小团队,无法支持”做出精美的表现“的动画,并且想直接复用英雄的3D模型,所以这个方案尝试了一下就放弃了。

脚本录制视频

策划需要英雄的3D模型参演,那首先想到的是录制脚本动画。但是与其他游戏做剧情的脚本动画不太一样,大招的表现要加上很多场景中本没有的夸张元素,比如场景切换到外太空,把人打入漫画里等等,更甚的是美术还提出在动画里要用精致的高模……实时播放脚本的话,既要管理这些元素的创建和回收,又要做环境的切换,性能问题可能成为制作的瓶颈,且复杂度略高。

所以我理解策划和美术需要的其实是拍一个几秒的电影,而这个电影到底是实时算的还是离线录制的不重要,只要不要限制住他们蓬勃的想象力就好(微笑)。

于是给策划折腾出来一套脚本录制的工作流,具体流程是:

  1. 策划搭建场景,使用PlayableDirector + timeline描述脚本

  2. 美术根据脚本内容逐一制作模型、特效等元素

  3. 过程中遇到需要timeline控制的效果元素,由我来提供Playable Track

  4. Unity Recorder挂在timeline上进行录制,录视频、图片、序列帧随心所欲

  5. 录制好后这个场景不需要打到包里,只留录制好的视频就好

1a5d44df87ee9fccb904597f75c14903.png
PlayableDirector+Timeline工作流

整个流程里的插件都可以从Unity的官方Package里面找到,且资料齐全上手快。特别是Timeline+Unity Recorder我逢人就推荐,录制效果好的一比,没有卡顿掉帧等问题,输出的webm视频可以带alpha通道。但是貌似只有2018版本才支持,之前的版本貌似只能使用“脚本抓帧+FFmpeg转成视频"这样曲折的方法来录制。

至于播放,用了Unity最新的VideoPlayer,一开始是直接糊在屏幕上播放的(播放模式选camera的nearplane),后面UI大佬要控制层级,就改成播放到RawImage里(播放模式选择RenderTexture,再每帧把RT画到RawImage里面),这样同时也可以实现在技能介绍界面上播放视频了。

后面策划又要不同阵营的英雄大招进行镜像,即左边的人发波往右打,那右边的人发波就要往左打。这个时候只要RawImage的scale.x设为-1就好了。

该方案的优点:

  • 策划美术一起折腾,不考虑运行时性能,什么超高模、抗锯齿、延迟渲染全给加上,做个CG都行。

  • VideoPlayer在运行时可以先预热(prepare),预热好了再播放,做到无感知加载。

此方案的缺点:

  • 视频毕竟比较占用包体,1080P、3秒左右的webm大概有7M。

  • 受击方没办法出现在视频里,跟当前场景无法互动。

  • 同上,表演的主角如果换过时装,也不行。

特别是第三条缺点,在拿到课题的时候千叮咛万嘱咐、再三确认我们游戏有没有做时装系统的计划,得到的答案是斩钉截铁的没有。上面这个方案拿出来用了快一个月,策划某次开完会后跑过来说要有,还tm要做前期主推内容……

如果只是时装的话,出个时装就多录个视频,听起来也没啥成本,毕竟特效什么的也都要重做嘛。可是我们还要做个时装染色功能,意思是玩家可以给模型随意染颜色……

至此,只能换实时播放的方案了。

实时表演

我称这个播放模式为RealTimeStage,具体的做法是:

  1. 原始场景(策划和美术制作的大招表现场景,下同)跟上面脚本录制的123步一样的制作方式,但是需要开始权衡各项性能指标了,最痛苦的过程。

  2. 这一步有两个选择,一个是在运行时直接加载1做出来的原始场景进行表演;一个是把场景内容打包成prefab,运行时加载prefab来表演。对于前者,加载场景要使用Additive的方式,并且涉及到每个英雄一个场景这样量级的场景管理、打包、Lighting数据保存,实在是有点重度,所以我最开始的时候就选择后后者。至于两者的区别还未进行详尽的测试,欢迎评论区探讨。

  3. prefab中的相机把RT渲染到UI上,这样就可以在战斗中看到实时的大招表现了。

看起来步骤简单,可是过程中遇到了一些”使用prefab作为场景“所必须要踩的坑。

prefab是直接从原始场景生成的,毕竟不是一个真正的场景,如果要做到”美术制作好后是什么样子,在游戏里看起来就是什么样子“,问题有:

  1. prefab不能受到主场景(游戏运行时的战斗场景,下同)的实时光照和阴影的影响。这个可以给prefab单独设置一层,双方的光照各自避开。

  2. prefab的相机和主场景的相机不能拍到对方。跟问题1的解决方法一样。

  3. 同一时刻只有一套环境参数会生效,如果未做任何处理的话prefab是会受到主场景环境参数影响的,包括Environment里面的环境光参数、LightProbe、ReflectionProbe等。

  4. 主场景的静态物体有烘焙过后的Lightmap和LightProbe,prefab的场景中也有,如果不做处理的话prefab中的静态物体没有办法索引到正确的Lightmap。

为了解决问题3,才引入了问题4,两者放到一起来讲。给prefab罩上一个ReflectionProbe,则GI的高光部分就不受主场景影响了。对prefab场景进行烘焙,静态物体使用Lightmap,动态物体使用LightProbe,则GI的diffuse部分不受环境光影响了,问题3得以解决。

接下来的问题就是在prefab来自原始场景,而原始场景的这些信息要如何带入到运行时。

  • 生成的反射球可以直接附在prefab中,所以并不需要过多处理。

  • 原始场景的LightProbe可以直接通过访问当前的LightmapSettings来获取到:

 LightProbes ProbeData = LightmapSettings.lightProbes;

运行时直接赋值给当前LightmapSettings就可以了。但是同一时刻只能有一个LightProbe生效,所以表演prefab中的LightProbe生效了则主场景的LightProbe就失效了。这个暂时没有去解决,但是实际上LightProbe数据是可以解析的,推测可以在运行时把储存的ProbeData”加“到当前主场景的LightProbe后面,这样当两者距离足够远的时候,就可以分别对各自对范围内的物体进行影响而不互相影响了。只是推测,有实现过的大手子可以分享一下。

这种直接取数据赋值的方法,实际存储的是原始场景目录下LightingData的引用,美术想做一个prefab中有两套烘焙数据来回切换的功能(类似于开关灯),这样就没办法了,因为场景烘焙一次之前的数据就丢掉了。所以后面使用AssetDataBase.CopyAsset的方式把LightingData.asset备份到打包目录,然后再引用过去。

  • 原始场景的lightmap,也CopyAsset一份到打包目录,同样在脚本中引用,在运行时附加到当前场景的LightSettings.lightmaps后面。需要注意的是,prefab中每一个静态物体都需要记录自己使用的lightmap的index,这样才能在运行时获取到正确的lightmap。比如主场景有1张lightmap,prefab引用了1张lightmap,则运行时的LightmapSettings里面就有两张贴图了,此时prefab中静态物体的lightmap index需要在原来的值(0)上加上一个偏移(1),才能索引到正确的贴图。

至此,策划和美术编辑好的RealTimeStage,就可以在游戏中完全复现了。

总结一下

以上几个解决方案里,我个人最喜欢脚本录制视频的方式,自由度高且性能压力小。如果以后做项目不用考虑时装和染色的话,那首推这个方案。制作的关键词就是Playable Director + TimeLine + PlayableTrack(自己定制)+ Unity Recorder + VideoPlayer。

RealTimeStage的方案其实适用性比较广,不仅能制作大招,还能制作“在UI上显示一个场景”这样的需求。用prefab代替场景有诸多好处,走通了prefab的烘焙流程对其他功能需求也是有帮助的。

很多想法都是没有经过对比验证,可能有不合理或者走弯路的情况,望有疑问的朋友提出来一起讨论讨论。

另外,项目使用的是标准PBR流程。

声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

作者:王宇

来源:https://zhuanlan.zhihu.com/p/71626465

More:【微信公众号】 u3dnotes

035bb64bc020853ebc8f0e6c3357da26.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值