unreal 卡牌游戲--camera的移動
前言:無論dota還是星際爭霸2,這類RTS游戲都是以上帝視角管理資源,移動窗口除了按鍵,還有鼠標(biāo),并且主要以鼠標(biāo)靠近邊框為主要移動方式。
當(dāng)然spring arm也不是無限長的,也不會小于0,而且dota在視距非常解決地面的時候會給人物特寫,攝像機(jī)會跟著旋轉(zhuǎn)。
我只需要實現(xiàn)3點。
1、鼠標(biāo)靠近窗口移動
2、滾軸控制spring arm的長度
3、按鍵移動
這些要實現(xiàn)真的超級簡單,重要的是實現(xiàn)思路。我會通過這些基礎(chǔ)操作,解釋unreal引擎的如何看待游戲設(shè)計的,我不負(fù)責(zé)解釋中英文的差異。
在開始前,我們先進(jìn)入gamemodebase修改一下設(shè)定

把default pawn class 搞成none,在屏幕上顯示的球球,并能通過wasd和上下左右移動的球球就不會自動生成了。
一、鼠標(biāo)移動
001、
在functions中興建一個move_left

然后輸入一下藍(lán)圖。

在這里我會們設(shè)計到對viewport的使用,不過我不需要介紹他,

而是介紹platform、viewport。前者基本上就是桌面,或者是當(dāng)前顯示器的坐標(biāo),后者是當(dāng)前程序窗口的坐標(biāo)。
在鼠標(biāo)操作的時候基本就三個:
1、鼠標(biāo)點擊
2、鼠標(biāo)位置
3、鼠標(biāo)發(fā)射射線
002、mapping
然后把這個function接入tick中

按照上面以此類推,準(zhǔn)備好四個方向。但是先不要著急。
會發(fā)現(xiàn)攝像機(jī)的旋轉(zhuǎn)有點問題,這不重要,自己旋轉(zhuǎn)下spring arm就好了。
我一般不會使用unreal中的數(shù)學(xué)運(yùn)算的替代公式。
先整一個看看

切換下xy就可以得到左右了。
這太幾把反人類啊。
還會發(fā)現(xiàn),怎么大小對不上啊,尤其是右邊和下邊,超出了很多才觸發(fā),因為還要用上一個viewport的scale,把我們在屏幕取得的鼠標(biāo)坐標(biāo)成viewport scale就好了。
我就發(fā)一個整理好的結(jié)構(gòu)。




其中movespeed和boderdist(邊框距離),已經(jīng)被我手動設(shè)置了。

二、鼠標(biāo)滾軸控制sprin arm
可以注冊event,但是這些事件僅僅是pawn和character能夠識別,actor不能,我們得回到controller里面才能設(shè)置,因為這種比較特殊的事件在controller里面已經(jīng)設(shè)置了。

因為unreal中所有的內(nèi)存都被他管理起來了,我們只能拿到他的存放數(shù)據(jù)的地質(zhì)用來使用,看起來我掌握了拿到了1m的內(nèi)存,實際上我只有8b的地址長度。
既然這樣,只要我不spawn,就不會產(chǎn)生內(nèi)存分配,這樣就好了。我們spring arm長度會在1000-3000里面徘徊。
clamp是限制數(shù)值在-10-10之間。
因為mouse wheel event 是一直在執(zhí)行的,所以他會自動幫我們初始spingarm的原始長度。
而且滾一下返回的是-1和1。
我們可以這樣測試一下。


會發(fā)現(xiàn)一直在跑數(shù)據(jù)。
三、按鍵移動
進(jìn)入project settings

這里會經(jīng)常進(jìn)來,它就是一個把所有全局變量和重要局部變量都放進(jìn)來的超方便的頭文件。碰撞啊,聲音啊,網(wǎng)絡(luò)啊,鍵盤輸入啊,自動尋址啊,游戲引擎所擁有的大部分重要參數(shù)和分組設(shè)定都在這里面。
我們進(jìn)入engine中的input中的bindings,綁定按鍵,這里被綁定就后,就會被注冊到event中,如果有過c++常識的話,event包括網(wǎng)絡(luò),鍵盤鼠標(biāo),硬盤,系統(tǒng)等返回的信息,我的習(xí)慣是event在每一次while循環(huán)幀結(jié)束的時候統(tǒng)一處理,也就是loop1->event->loop1->event這樣繼續(xù)下去。因為event的再游戲中的延遲也就是1/60s,所以我們可以把event和loop看做是無縫連貫處理的事情。
event單詞的意思就是帶有突然發(fā)生的事件,重要緊急事件,有限度很高。
然而在unreal中的event更加類似c++中的一個線程,一旦開啟一個新的event后,他就會開啟一個新的線程,然后獨立執(zhí)行一些數(shù)據(jù),然后返回一些信息。在如果把一個actor同時傳入多個event,然后最后收集總數(shù)據(jù),unreal會自動插入一個fence(柵欄,必須所有人全部執(zhí)行完成后,才能放行),這很容易導(dǎo)致卡死的情況,不過unreal做了優(yōu)化,只會彈出警告。所以在藍(lán)圖版本的時候,運(yùn)行效率會非常低,在藍(lán)圖版本完成后,把一些需要大量cpu運(yùn)算的藍(lán)圖改成c++就非常nice了。

如果event超過fence,比如1/60s,就會導(dǎo)致游戲卡頓、掉幀,所以不推薦在event中接入大量復(fù)雜程序,這非常不利于面向?qū)ο缶幊?。面向?qū)ο缶幊痰淖谥际且蝗司ㄒ粋€技能就夠了。
001、添加鍵盤控制

這樣就好了,axis是軸映射,他會返回模擬信號,也就是一個小數(shù),而action返回0和1。
但是這些注冊不能拿給actor使用,所以和springarm一樣要在controller里面去設(shè)置,然而controller又不需要注冊。
002、說了太多廢話,突然不想用鍵盤了。就不做了。卡牌游戲用鍵盤移動camera本身就很蠢,甚至可能用不到鼠標(biāo)的移動。那就不要這個了。
總結(jié):
1、event類似c++的獨立線程
2、unreal中的數(shù)學(xué)公式是真的反人類。
3、actor不會接受鍵盤和鼠標(biāo)的指令,但是controller可以不用注冊也能使用。