UE4模拟Unity的CameraLayer

在Unity中我们知道可以通过为物体赋予不同的Layer,然后可以设置相机的CullingMask属性达到“不渲染”某一层物体的结果。(下面第一幅图就是正常的渲染;第二幅图是设置了Camera的CullingMask之后,就不再渲染Cube所在的Layer,这样我们就看不到Cube啦)

UE4模拟Unity的CameraLayer_第1张图片

UE4模拟Unity的CameraLayer_第2张图片

存在的问题:物体只是不渲染了,碰撞什么的还会继续存在。请看下图:Cube虽然看不到,但是Sphere还是会继续与Cube进行碰撞。

UE4模拟Unity的CameraLayer_第3张图片

UE4解决方案:

我们都知道UE4中的Camera默认并没有提供类似的功能,那么我们能不能实现这样的效果呢?当然可以,每一个Actro自带一个OwnerNoSee的属性(在做联网FPS时非常好用),我们可以配合SetOwner节点和这个属性共同作用,将某一个相机设置成当前物体的Owner并设置OwnerNoSee为True即可实现上面的效果。

新建一个Actor蓝图类,定义一个Actor参数(命名为Camera,可以根据你的需要随便命名,但尽量做到见名知义)在ConstuctionScriopt中设置上述属性。这样设置后,从指定的Camera看物体就看不到当前Actor。

UE4模拟Unity的CameraLayer_第4张图片

效果图如下:

UE4模拟Unity的CameraLayer_第5张图片

存在的问题:

1)与Unity中一样,只是不渲染,但碰撞依然存在。所以我们需要继续设置物体的碰撞,具体操作如下:

UE4模拟Unity的CameraLayer_第6张图片

2)按照步骤Ⅰ中的操作,当我们用换成另外一台相机时,虽然能看到Cube,但是并没有碰撞:

UE4模拟Unity的CameraLayer_第7张图片

    我们在改变成另外一个相机后要对物体进行操作(此处需要把物体的碰撞打开),具体操作如下:

UE4模拟Unity的CameraLayer_第8张图片

可以优化的地方:

我们这里只是对物体进行的碰撞的更改,如果后期需要对物体的可见性变化前后进行更多复杂的操作,那么这种方式很明显不适合:所以笔者给大家提供几种方式来解决:

1)使用抽象父类的方式,定义抽象方法:BeforeCameraChange和AfterCameraChange,并在改变相机的时候调用合适的防范,然后在子类中重写;

2)使用接口的方式,定义接口IOwnerSeeChange,并定义BeforeCameraChange和AfterCameraChange两个方法,凡是需要满足OwnerSee变化的则实现这个接口并在合适的时候调用

3)使用委托回调,当Owner发生改变时,执行自定义的回调方法,根据Owner来执行不同的操作即可。



你可能感兴趣的:(UE4,UE4_Blueprint)