unreal 卡牌游戏--camera的移动
前言:无论dota还是星际争霸2,这类RTS游戏都是以上帝视角管理资源,移动窗口除了按键,还有鼠标,并且主要以鼠标靠近边框为主要移动方式。
当然spring arm也不是无限长的,也不会小于0,而且dota在视距非常解决地面的时候会给人物特写,摄像机会跟着旋转。
我只需要实现3点。
1、鼠标靠近窗口移动
2、滚轴控制spring arm的长度
3、按键移动
这些要实现真的超级简单,重要的是实现思路。我会通过这些基础操作,解释unreal引擎的如何看待游戏设计的,我不负责解释中英文的差异。
在开始前,我们先进入gamemodebase修改一下设定

把default pawn class 搞成none,在屏幕上显示的球球,并能通过wasd和上下左右移动的球球就不会自动生成了。
一、鼠标移动
001、
在functions中兴建一个move_left

然后输入一下蓝图。

在这里我会们设计到对viewport的使用,不过我不需要介绍他,

而是介绍platform、viewport。前者基本上就是桌面,或者是当前显示器的坐标,后者是当前程序窗口的坐标。
在鼠标操作的时候基本就三个:
1、鼠标点击
2、鼠标位置
3、鼠标发射射线
002、mapping
然后把这个function接入tick中

按照上面以此类推,准备好四个方向。但是先不要着急。
会发现摄像机的旋转有点问题,这不重要,自己旋转下spring arm就好了。
我一般不会使用unreal中的数学运算的替代公式。
先整一个看看

切换下xy就可以得到左右了。
这太几把反人类啊。
还会发现,怎么大小对不上啊,尤其是右边和下边,超出了很多才触发,因为还要用上一个viewport的scale,把我们在屏幕取得的鼠标坐标成viewport scale就好了。
我就发一个整理好的结构。




其中movespeed和boderdist(边框距离),已经被我手动设置了。

二、鼠标滚轴控制sprin arm
可以注册event,但是这些事件仅仅是pawn和character能够识别,actor不能,我们得回到controller里面才能设置,因为这种比较特殊的事件在controller里面已经设置了。

因为unreal中所有的内存都被他管理起来了,我们只能拿到他的存放数据的地质用来使用,看起来我掌握了拿到了1m的内存,实际上我只有8b的地址长度。
既然这样,只要我不spawn,就不会产生内存分配,这样就好了。我们spring arm长度会在1000-3000里面徘徊。
clamp是限制数值在-10-10之间。
因为mouse wheel event 是一直在执行的,所以他会自动帮我们初始spingarm的原始长度。
而且滚一下返回的是-1和1。
我们可以这样测试一下。


会发现一直在跑数据。
三、按键移动
进入project settings

这里会经常进来,它就是一个把所有全局变量和重要局部变量都放进来的超方便的头文件。碰撞啊,声音啊,网络啊,键盘输入啊,自动寻址啊,游戏引擎所拥有的大部分重要参数和分组设定都在这里面。
我们进入engine中的input中的bindings,绑定按键,这里被绑定就后,就会被注册到event中,如果有过c++常识的话,event包括网络,键盘鼠标,硬盘,系统等返回的信息,我的习惯是event在每一次while循环帧结束的时候统一处理,也就是loop1->event->loop1->event这样继续下去。因为event的再游戏中的延迟也就是1/60s,所以我们可以把event和loop看做是无缝连贯处理的事情。
event单词的意思就是带有突然发生的事件,重要紧急事件,有限度很高。
然而在unreal中的event更加类似c++中的一个线程,一旦开启一个新的event后,他就会开启一个新的线程,然后独立执行一些数据,然后返回一些信息。在如果把一个actor同时传入多个event,然后最后收集总数据,unreal会自动插入一个fence(栅栏,必须所有人全部执行完成后,才能放行),这很容易导致卡死的情况,不过unreal做了优化,只会弹出警告。所以在蓝图版本的时候,运行效率会非常低,在蓝图版本完成后,把一些需要大量cpu运算的蓝图改成c++就非常nice了。

如果event超过fence,比如1/60s,就会导致游戏卡顿、掉帧,所以不推荐在event中接入大量复杂程序,这非常不利于面向对象编程。面向对象编程的宗旨是一人精通一个技能就够了。
001、添加键盘控制

这样就好了,axis是轴映射,他会返回模拟信号,也就是一个小数,而action返回0和1。
但是这些注册不能拿给actor使用,所以和springarm一样要在controller里面去设置,然而controller又不需要注册。
002、说了太多废话,突然不想用键盘了。就不做了。卡牌游戏用键盘移动camera本身就很蠢,甚至可能用不到鼠标的移动。那就不要这个了。
总结:
1、event类似c++的独立线程
2、unreal中的数学公式是真的反人类。
3、actor不会接受键盘和鼠标的指令,但是controller可以不用注册也能使用。