UE4 射击游戏项目实战开发 002 − − 开 发 笔 记 \textcolor{red}{--开发笔记} −−开发笔记
本 文 档 我 们 开 始 记 录 如 何 控 制 光 标 跟 着 鼠 标 转 的 操 作 。 蓝 图 操 作 \textcolor{blue}{本文档我们开始记录如何控制光标跟着鼠标转的操作。蓝图操作} 本文档我们开始记录如何控制光标跟着鼠标转的操作。蓝图操作
上个文档记录到十字准星制作完成,如下图:
此时移动鼠标,会出现一个现象就是十字准星在跟着鼠标转,人物不转,我们要调节一下。
- 打开蓝图myFpsCharacter,进入蓝图编辑页面,选择myFpsCharacter(self),找到右侧的Pawn卷帘选项打开,找到Use Controller Rotation XX(三个选项),勾选Use Controller Rotation Yaw。
这样任务就在左右方向跟着鼠标移动了(注意:Yaw是摇头方向,Pitch是点头方向,Roll是侧头方向,想象一下侧翻转)
但是,这个控制并不自然,太僵硬了,或者说不是我们想要的结果。
我们取消勾选Use Controller Rotation Yaw,选中CharacterMovement(Inherited,在面板中找到Character Movement:(Rotation Settings)
勾选User Controller Desired Rotation ,取消勾选Orient Rotation to Movement,并将Rotation Rate 的Z设置成300.0,保存运行。
这样人体就会随着鼠标移动的同时感觉延迟一些,符合自然状态。
但是,我们发现,此时不论鼠标移动多大角度,人体也跟着移动,不符合我们想要的自然结果,我们想让人体在鼠标移动小于80度角度的时候不跟着动,超过80度才进行转动。
- 接下来,我们制作蓝图节点来实现这个操作。
打开蓝图myFpsCharacter,进入蓝图编辑页面
显示Event Graph 页面,我们会看到有几个模块的蓝图,红框的是鼠标的操作。
==注意:==蓝图结点都是由事件Event驱动的,因此所有的事件都是红色标签。
接下来,我们开始实现我们想要的功能蓝图节点。
我们要实现过程的几何解释如下:
如上图,红线为摄像机原来的指向,也是人物面朝的方向,我们当旋转摄像机的到黑线的指向时候,和原来的方向会有Detla的角度,想右侧旋转到蓝线的时候会有-Detla的角度。我们可以定义这两个角度值来约束旋转。
思考完成之后,我们开始创建节点,首先我们要获取人物面朝的方向对象。
1.我们拖拽CapsuleComponent(Inherited)胶囊体组件,以期获取它的正前方角度,也叫向量,上图中红色箭头
为啥要获取胶囊体的呢?其实也可以获取人物组件的,只不过胶囊体包裹着人物模型的,所以是一样的
2.获取移动鼠标的角度操作,要获取的是Pawn的控制,再获取Rotation
这个角度就是鼠标移动时候的角度向量,黑色和蓝色箭头的方向。
这两个角度设置好之后,我们要进行求角度差,然后将角度差和80度进行比较,大于80度的说明鼠标移动幅度大,人物跟着移动,小于80度的,就不移动了。
Delta的值就是两个角度的差,如图A-B.
由于旋转有三个方向,我们只选择Yaw方向,所以我们把旋转拆分一下,选择Break Rotator。
选择Yaw方向的值和80进行对比。输入>符号,选择float > float,创建>比较的节点,输入80。
但是要考虑左右移动,左侧为80,右侧为-80,所以对移动的值取绝对值ABS,如图:
符号>节点返回的是Boolean类型的节点,如果大于80,就是True,因此我们可以根据这个修改跟随旋转的设置按钮。
跟随的按钮还是前面提到的那个Use Controller Desire Rotation
由于旋转是连续的,我们要设置一个持续的时间Event Tick。
然后创建条件判断节点来判断事件发生与否。(也就是说Tick和Branch两个节点一起创建了一个判断真假的功能)。
将前面创建的判断大于80的结果连接到Branch的Condition节点上进行判断。如果是True我们进行设置。拖拽CharacterMovement(Inherited)到蓝图编辑面板,找到它的Set Use Controller Desire Rotation。
将Branch的True连接到Set上,并将Set的勾勾上。代表执行了Use Controller Desire Rotation操作。
但是如果旋转角度很小的话,我们就不让其跟随鼠标移动了,就要设置接近于0的值,我们设置阈值为0.001。
由于其输出是Boobean类型,所以我们要添加一个判断Branch分支。
如果满足接近于0的值,为True设置,复制CharacterMovement(Inherited)和Set节点,设置取消勾选。
另外,值在0-80之间的值也是不跟着鼠标移动,所以我们将最先的条件判断小于80的False连接到取消勾选的部分(建议设置成60度,后面会更好)。
编译运行,就可以去游戏中查看结果了。
真实场景中,我们的人物和十字准星的位置是这样的:
然而我们的是这样的:
所以我们进行调节一下,将人物位置朝下,摄像头偏移一些。
选中CameraBoom向上移动摄像机。
选择FollowCamera调节摄像机位置,使得人物向左偏移。
结果展示:
优化部分,完全可以将Get Control Rotation替换掉上述节点:
然而,当我们移动鼠标的时候,行走状态很怪异,就是会侧滑。
为了解决这个问题,我们定义鼠标左右移动和前后移动时候人物跟着方向转动的操作。
首先创建向前后节点和向左右节点,向前为1向后为-1,向右为1向左为-1,因此每一个值都不为0,为0的时候idle。
不论是向前后还是向左右,他们是或事件,因此,我们需要对这两个做or操作。
接着输出boolean值,True则打开Use Controller Desired Rotation,否则关闭。
连接到每一帧的事件监测器上。
保存,最终结果展示。
整理一下节点。
选中需要坍塌的节点右键鼠标选择Collapse Nodes,进行坍塌处理。
处理结果并C键整合。
完成工作,爽歪歪!!
∣
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
俺
是
分
割
线
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
∣
\textcolor{red}{∣−−−−−−−−−−−−−−−−−−俺是分割线−−−−−−−−−−−−−−−−−−−−−∣}
∣−−−−−−−−−−−−−−−−−−俺是分割线−−−−−−−−−−−−−−−−−−−−−∣
自己创建的两个群,一个是做3D方面的(包括算法图像处理,以及三维模型生成等),另一个是代码编程群,两个群都是为了交流技术的,禁止发广告。