\

In the cone of light, all is fate

学习UE4 - 相机视角跟随鼠标转动

之前讲了将视角设置到相机的方法,但是我们发现虽然视角到相机上了,但只能保持在当前视角,无法转向,这次我们就实现这个。

由于之后几篇的功能也是关于相机控制的,所以这次要创建一个游戏模式和控制器,游戏模式先不管,说一下控制器是干什么的,控制器就是响应我们键盘鼠标手柄操作的东西,比如说你不喜欢默认控制方式,想脸滚键盘去控制一些东西,那就用控制器。

仍然用上次的项目,新建游戏模式和控制器:

 

 

 

 

双击MyGameMode,进入蓝图,在Details中找到这个:

 

 

 选择你刚刚建立的控制器,也就是说,这个游戏模式使用的控制器是你自己的定义的,找不到的话是你没编译。

关卡的World Setting中找到Game Mode,选择你自己建立的游戏模式。

 

 

 我把上次的节点都移动到控制器中,发现相机的引用变成了这个

 

 

说明在这里无法直接获得相机,但我们可以通过Get Acotr Of Class来获得,顺便把这个相机提升为变量

 

接下来我们进入相机的蓝图,把具体逻辑写在里面,虽然写在哪儿都行,但我们要养成好的习惯,这样方便后期的查找和维护。

我打算写成一个事件,当鼠标移动时,或者直接每一帧都触发这个事件。

我这里新建一个事件,并给它加3个引脚,我希望鼠标的X、Y值从外界传进来,没有为什么,就是觉得这样规范些。

事件就相当于一个函数,引脚就是参数,事件后面的节点都是函数内的代码,这样理解会轻松很多。

三个引脚分别代表鼠标的X、Y值、系数(速度),都是float。

系数的作用是调节镜头响应鼠标的速度比,如果我讲的不明白,可以在最后完成时修改这个值看看效果。

也就是说无论X还是Y,都是要乘上这个系数再使用的,如果系数为2,那么镜头移动的速度是鼠标移动速度的2倍,我们先只做水平旋转。

 

 一个浮点数无法直接变成旋转值,需要用Make Rotator转换一下,这里注意,乘出来的数连上Z,因为Z轴才能水平方向旋转。

 

现在有了旋转值,那么就剩最后一步了,我们猜一下,想让镜头旋转的话,无非就是Rotation,Rotate之类的单词

 

 有好多,有Set,也有Add,那么按我的第一感觉 ,应该是Set,我选了SetActorRotation,在控制器里记得把事件连上

 

 

 

运行后发现视角不受控制,总是回到起点,然后又换了个SetActorRelativeRotation,还是这样,好吧那试试Add

 

Add是可以的, 之后我还试了AddActorWorldRotation,发现效果一样,那水平旋转就做好了,接下来是垂直方向。

我稍一思考,就把节点连成这样:

 

 运行之后,哟西,可以转,诶等等,为什么镜头会歪?

虽然想不能为什么镜头会歪,反正这样肯定是不对的,这时就要分析一波。

我将水平的线断开,测试后发现Y轴能正常转动。

 

 但连上就不行,就算这样也不行,都会歪。

 

 既然这样,我又考虑到Set了,并且想到为什么Set会将镜头重置到起点,是不是一种修正功能,最后我还是没想明白。。。

不过既然使用一个Add至少能实现一个方向上的正常转动,那就先留着,Y轴另想办法。

如果我们获得当前相机的转角,然后再Set,是不是就正常了?然后就有了如下节点:

 

 水平方向正常,垂直方向鬼畜,那么就明白了,方法是可行的,要把垂直方向也改成先获取当前值,最后一起Set。

 

 将节点改成这样后,测试的效果就正常了,不过这节点我越看越奇怪,既然Y值只要和鼠标的值加一下就可以Set,那X肯定也可以呀!试了下,果然可以。

 

 不过现在还有一个小问题,就是当鼠标向天上或者地下看时,镜头容易打转,这种情况是在镜头和水平的角度达到90度时,分不清方向了,所以只要限制相机垂直方向的角度,就可以避免这种情况。

还有获取当前角度时,不能用Camera,而是要获得Camera的父级,在这里是Default Scene Root

 

 好了,这篇就到这儿。

posted @ 2020-12-03 16:31  Ymrt  阅读(5815)  评论(0编辑  收藏  举报