Unity 中指定不渲染特定层
在 Unity 中我们知道可以通过为物体赋予不同的 Layer ,然后可以设置相机的 CullingMask 属性达到 “不渲染” 某一层物体 的结果。(下面第一幅图就是正常的渲染;第二幅图是设置了 Camera 的 CullingMask 之后,就不再渲染 Cube 所在的 Layer,这样我们就看不到 Cube 啦)
存在的问题
物体只是不渲染了,碰撞什么的还会 继续存在 。
请看下图:Cube 虽然看不到,但是 Sphere 还是会继续与 Cube 进行碰撞。
UE4 解决方案
我们都知道 UE4 中的 Camera 默认并没有提供类似的功能,那么我们能不能实现这样的效果呢?当然可以,每一个 Actor 自带一个 OwnerNoSee 的属性(在做联网 FPS 时非常好用),我们可以配合 SetOwner 节点和这个属性共同作用,将某一个相机设置成当前物体的 Owner 并设置 OwnerNoSee 为True 即可实现上面的效果。
新建一个 Actor 蓝图类,定义一个 Actor 参数(命名为 Camera ,可以根据你的需要随便命名,但尽量做到见名知义)在 ConstuctionScriopt 中设置上述属性。这样设置后,从指定的 Camera 看物体就看不到当前 Actor 。
效果图如下:
存在的问题
- 与 Unity 中一样,只是不渲染,但碰撞依然存在。所以我们需要继续设置物体的碰撞,具体操作如下:
- 按照步骤 Ⅰ 中的操作,当我们用换成另外一台相机时,虽然能看到 Cube ,但是并没有碰撞:
我们在改变成另外一个相机后,要对物体进行操作(此处需要把物体的碰撞打开),具体操作如下:
可以优化的地方
我们这里只是对物体进行的碰撞的更改,如果后期需要对物体的可见性变化前后进行更多复杂的操作,那么这种方式很明显不适合:所以笔者给大家提供几种方式来解决:
-
使用抽象父类的方式,定义抽象方法:
BeforeCameraChange和AfterCameraChange,并在改变相机的时候调用合适的防范,然后在子类中重写; -
使用接口的方式,定义接口
IOwnerSeeChange,并定义BeforeCameraChange和AfterCameraChange两个方法,凡是需要满足OwnerSee变化的则实现这个接口并在合适的时候调用 -
使用委托回调,当 Owner 发生改变时,执行自定义的回调方法,根据Owner 来执行不同的操作即可。