前言
写这篇文章是因为之前在做背包系统时,在实时显示角色这一部分的时候一直有些问题,B站和优快云都没有找到很好的方法,刚好最近把问题都解决了,接下来就分享一下我的方法。
一、方法一
1.过程
首先打开角色蓝图,给角色的碰撞体添加SpringArm,并在SpringArm下面挂一个SceneCaptureComponent2D,调整SpringArm的Transform
接着在SceneCaptureComponent2D的Detail面板里找到SceneCapture,在TextureTarget里创建RenderTarget
接着从RenderTarget创建材质,把MaterialDomain改为UI,BlendMode改为Masked,把RenderTarget的Alpha通道用1-X使得只显示物体
UI部分不再赘述,把材质赋给Brush的Image即可
蓝图部分:
创建UI并显示后,用以下节点使得背包页面只显示角色
2.问题
此时便出现了一个问题,便是在摄像机旋转的时候,如果角色蓝图关闭了UseControllerRotationYaw的话,角色虽然不跟着摄像机旋转,但角色的碰撞体会,因此,如果玩家在角色的不同角度打开背包的话,背包显示的角色也会显示不同的角度,不能固定在正面,因此,我们需要在角色的动画蓝图中获取根节点的旋转,同时获得控制器的旋转,获取他们的差异,并在打开背包的时候设给角色,让角色保持在正面
3.解决方案
在项目GameAnimationSample里有详细的获取RootTransform的流程,参考下图(不同项目原理相同)
在角色蓝图里获取动画的实例(GetAnimInstance),Cast成我们自己的动画蓝图,并获取Root的Rotation信息,接着获取控制器,接着获取控制器的旋转(GetControlRotation),分割结构体引脚,只提取Yaw的信息,接着Delta,(Z轴加180度只是为了让角色保持在正面),把旋转信息设给角色
同时,在关闭背包的时候需要把旋转信息设回给角色
此方法缺点明显,一方面受到角色所处环境光照的影响,另一方面很难进行自定义化控制等等,所以游戏一般都会在地图的其他地方创建一个专门实时显示角色UI的场景,就是方法二。
二、方法二
此方法与方法一大同小异,且自由度较高,原理过程比较简单,我大致讲一下大体过程就好,不再赘述。
1.过程
同样创建场景捕获组件,但重新创建在Actor里或者在后面的角色蓝图里创建都行,同样创建RenderTarget,同样创建材质。在地图里摆放一个场景,给上光照,创建一个角色(子蓝图等),把角色放进场景里,并把角色的信息同步给这个UI角色。同样把材质赋给UI,(想显示或者不想显示这个场景都行,不想显示就像方法一一样提取Alpha信息),记得不要让玩家控制器影响到这个UI角色就行,这样玩家打开背包就能固定看见角色的正面(想看别的地方也行)。
三、总结
以上就是背包页面实时显示角色的两种方法,如果有其他的方法也可以评论告诉我。