问题背景:
最近在写一个仿CSGO的第一人称射击Demo。为了实现第一人称视角下面壁时的手臂不怼到墙里的效果,我使用两个摄像机:FPCamera 和 GunCamera,使用Camera组件的Culling Mask属性让FPCamera拍摄除手臂之外的所有场景,GunCamera只拍摄手臂并且把手臂的图像覆盖在FPCamera画面上层。即:GunCamera的Culling Mask属性只有Arms层,FPCamera的Culling Mask属性是EveryThing除Arms之外。
问题描述:
在我播放手臂的检视动画(道具检视动作)时,模型的手会诡异的消失,只留下胳膊和道具模型,动画结束时又出现,并且只和我准星放置的高度也即摄像机的X轴旋转角度有关。当我把准星抬高到图片上红框内然后播放检视动画,手就会消失。最重要的是,手只在Game窗口消失,在Scene窗口显示正常(具体可以看下面的图片,手消失时Scene窗口显示正常)。
问题的进展:
首先可以确定不是Culling Mask设置不正确,我此前怀疑是某种原因改变了手模型的Layer设置(因为GunCamera看不到其他层),我甚至写了测试代码去验证这个想法,但并没有这回事。整个手臂模型的Layer设置在检视动画播放期间没有任何改变,都是Arms,GunCamera的Culling Mask也没有任何变化。
再后来我怀疑是遮蔽剔除的锅,关闭了GunCamera的遮蔽剔除属性,但是也没有用(实际上Unity的遮蔽剔除需要设置才能生效,我有点气昏了头)。
最后怀疑是Unity引擎的Bug,因此我尝试了另外一个版本的Unity。我的项目原版本是2019.4.19,我尝试了2018.4.32还是一样的结果。
我研究出两个有效的解决方案:
1. 把GunCamera的FOV调大,调高到一定的数值(FOV=70),这个BUG就会消失
2.将手臂模型向前移动一些距离,这个BUG就会消失,播放动画时手显示正常
这两个解决方案的共同点就是让GunCamera更容易拍摄到手臂的模型全貌,也即尽量让手臂模型纳入GunCamera的视锥范围中。但是总归时治标不治本,我完全不明白其中的原理,我也无法接受两种方案的任何一种(会导致手臂看起来很长或者穿帮,也许还会留下一些隐患)
希望各位有经验的前辈可以指点迷津,salute啊