之前講了將視角設置到相機的方法,但是我們發現雖然視角到相機上了,但只能保持在當前視角,無法轉向,這次我們就實現這個。
由於之后幾篇的功能也是關於相機控制的,所以這次要創建一個游戲模式和控制器,游戲模式先不管,說一下控制器是干什么的,控制器就是響應我們鍵盤鼠標手柄操作的東西,比如說你不喜歡默認控制方式,想臉滾鍵盤去控制一些東西,那就用控制器。
仍然用上次的項目,新建游戲模式和控制器:
雙擊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
好了,這篇就到這兒。