我的方式很简单:
1.资源管理器 assets 对应目录下面 创建-渲染纹理 RenderTexture
2.创建好的纹理在属性检查器里面设定好对应的尺寸,这个尺寸和缩放参数没有关系,但是它自身的长宽比和之后设定的 sprite 长宽比有关系,我设定为1400x1400(我用于表示影子,这个尺寸足够了,并且是方的,简单),越大越清晰,越小越模糊(最终得到的效果好像图片缩小失真再放大后的那种模糊)
3.主摄像机复制自己,作为影子RT摄像机,放在自己下面当子节点,在场景启动后延迟一点时间设定orthoHeight和主摄像机相同
this.cameraBack.orthoHeight = this.camera.orthoHeight;
4.影子 RT 摄像机的 TargetTexture 拖入第一步建立的 RenderTexture
5.需要出现影子的物体改 layer,比如之前是 UI_2D,就改成别的,比如 default
6.主摄像机Visibility增加default,影子RT摄像机Visibility只有 default
7.所需要显示影子的层级上建立 sprite,(在地板上面,其它所有物件下面),放好位置,SizeMode=CUSTOM,尺寸2048x2048(这个尺寸与 renderTexture 设定的长宽比一致),再次拖入第一步建立的RenderTexture;
以上是我提问前所做的,这里会发现尺寸对不上原图
8.设定该 sprite 的scale:view.getVisibleSize().height / 2048。没错就这一行。我的游戏物体所在的根节点会有个尺寸缩放,为了显示更大或者更小的关卡,所以影子节点需要放在这个根节点内,需要前面的 scale 再除以这个根节点的缩放就能还原为匹配的大小。
其实我没太看懂为什么用visibleSize 的高度去除以sprite 的高度尺寸,完全是试出来的。项目的适配设置为 只适配屏幕宽度,估计和这个有关系
9. 编写effect,制作 material 赋给 sprite。(也就是去非透明采样值进行一个染固定透明度的黑色)
10. sprite 的位置稍微偏移几个像素,因为它是影子嘛。
补充:
这个游戏是有 H5版本的关卡编辑器的,编辑之后可以直接切换到运行模式进行关卡设计,而编辑器模式用的是1080x1920 ResolutionPolicy.SHOW_ALL,(这个模式下,策划可以更好的利用电脑的宽屏进行关卡编辑),在这个模式下,上面的 scale 就不对了。上面的简单计算是在 1080x2400 ResolutionPolicy.FIXED_WIDTH 下做适配的。
那么更通用的计算scale方式我也找到了:
view.getVisibleSize().width * screen.windowSize.height / screen.windowSize.width / 2048
尝试了几种分辨率都没什么问题,另外1080x2400 ResolutionPolicy.FIXED_WIDTH下也能工作正常。
二次补充:
发布 H5之后,在ResolutionPolicy.SHOW_ALL模式下,上面补充的还是有问题,继续做了修改:
let height = Math.max(view.getVisibleSize().width * screen.windowSize.height / screen.windowSize.width, view.getVisibleSize().height);
let blockShadowNodeScale = v3(1, 1, 1).multiplyScalar(height / 2048);
也就是之前计算的如果长宽比比设计长宽比更方,则 scale 结果依然不对,反而是之前直接用 height 没问题。所以用 Math.max 做了判断,如果按 windowSize 比例算出的高度更高,则使用,如果没有设计高度高,则使用设计高度。