前往
大廳
主題

[UE5 基本] C++ 角色操作與互動

%%鼠 拒收病婿 | 2023-04-27 23:59:30 | 巴幣 2642 | 人氣 1273

前言

關於Unreal C++環境建置與基本語法可以參考前一篇文章:UE4 C++基本教學。

主要內容取自"Unreal Engine 5 – Full Course for Beginners" 教學,本篇主要紀錄學習過程與部分程式改用C++寫。

程式碼在個人網站閱讀效果比較好~



UObject關係層級 [1]

在Unreal,UObject是所有物件的基本,從Character、Acotr、Pawn、Component到Garbeage Collectable Object,使用UObject其中的好處也是Unreal背景會幫我們處理GC。
  • Actor類別可以擁有Transform。
  • Controller可以分很多種,如PlayerController、AIController、GameMode等等,以PlayerController來說,負責玩家input , camera, 連線玩家等功能。類似我們常在Unity自己定義的Manager物件,只是Unity需要拉到場景上。
  • Pawn是可以被放在場景上的物件類別,例如場景上花、草、牆壁、怪物,Controller通常會搭配Pawn出現在場上(例如玩家由PlayerController控制、敵人由AI Controller控制)。


玩家輸入操作

在Project setting > Input 頁面可以新增Axis Mapping,
PlayerController中的藍圖擺設,如此就能前後移動。
 

C++撰寫

在header中定義水平、垂直移動的方法。


在cpp中實作方法


Bind Input
SetupPlayerInputComponent是Character類別提供的一個方法,會傳入Controller的Input binding元件。

在.cpp中實作,若是按鍵觸發型的(如Jump)可以使用BindAction,並指定觸發的EInputEvent

Animator 設定
在Animator blueprint中設定變數來裝操作資訊。

我原本以為會像Unity一樣要在玩家腳本中去設定這些參數,但其實可以在Animation Blueprint中做到:
 
(套上animation後的效果。)
 
 

Raycast

raycast是常見的玩家與場景物件互動的方式。
[範例] 當玩家看著球物件,並按下滑鼠左鍵時,可以吃掉道具(道具消失)。


GetPlayerCameraManager

回傳player的camera物件,0代表 index = 0的玩家。
(藍圖版)

LineTraceSingle
類似於Unity的Physics.Raycast。參數EDrawDebugTrace設定為ForDuration效果類似於Unity Gizemos畫出線條:

放在藍圖
在.h宣告方法的地方加上UFUNCTION(BlueprintCallable)標記,就可以在藍圖呼叫。


傷害
通常怪物不會一下就死,UE很貼心地已經有預設幾種傷害方式:Damage | Unreal Engine Documentation
Apply Point Damage比Apply Damage還多考慮了hit info與 hit direction,我們可以修改一下方法使其回傳hit target與hitinfo。

注意FHitResult是sturct,而Unreal的藍圖只適用於展示UObject物件,因此sturct傳址就好。[4]



Interface

以上我們做了與ACPP_Pickup 類別互動的腳本,但若今天有好幾種物件可互動,一個一個Cast顯然不切實際。
一種做法是建立繼承ACPP_Pickup 的子類別,但如此可能會讓繼承關係越來越深;另一種做法是創interface。
 

(藍圖作法)創建interface

在class setting選擇剛剛創建的interface。
 

C++作法

選擇創建Unreal Interface,會預設幫我們打好基本snapshot。


Interface不用改甚麼,讓ACPP_Pickup 繼承,並將cast改成interface類別。




引用或建議閱讀

  1. UObject繼承階級
  2. c++ - What's the difference between UClass and UObject? - Game Development Stack Exchange
  3. ACharacter::SetupPlayerInputComponent | Unreal Engine Documentation
  4. UE4 Inappropriate '*' on variable of type 'F..truct', cannot have an exposed pointer to this type'问题_繁弱的博客-CSDN博客
 


心得


前期遇到各種困難,Live coding每次編譯跟筊杯一樣失敗、成功、成功但沒效果;重開專案c++的ref都會不見等等 。我還在想是不是因為Unreal安裝在外接硬碟的關係,後來找到的解法是用c++創個GameModeOverride物件,並指定給world setting就好了。編譯的部分則是先在VS build完後再呼叫live codeing才能把更新寫進UE。

在Unity打轉多年,加上最近跟有用UE的同事交流後,大概懂了一點Unreal設計上的思路了。
如果今天Unreal的教學資源跟Unity一樣多,我敢說大家一定都推新手先入坑UE,不是因為他性能多好,而是UE打從骨子就是"Production Ready"的狀態了。

最簡單的例子就是UE預設藍圖方法包山包海,連傷害計算都有分point damage , radiant damage....,當初我一個不懂數學的小毛頭,在Unity瘋狂碰壁才搞出來個遭東西, UE連邏輯都給省了,直接一個方塊就能做完。

Unreal教學資源的缺口就讓我來補上吧!! (x


送禮物贊助創作者 !
0
留言

創作回應

永永
%%鼠我的超人>< 好強!看不懂QQ
2023-04-28 00:16:55
%%鼠 拒收病婿
還,還沒,我才剛入門QQ
2023-04-28 00:30:56
永永
難到我可能上課就會掉眼淚的程度了QwQ
2023-04-28 00:18:02
在意你就輸了
該...該學Unreal了嗎 (聽說錢錢會比較多)
2023-04-28 04:53:12
%%鼠 拒收病婿
跳船跳起來(x
2023-04-30 20:39:13
御安鴨·摸頭害鴨哭
ref竟然要掛在world 才能避免遺失?!竟然不能掛在local來突破系統的限制了!難道這就是封弊者的末路!!
2023-04-28 09:55:10
%%鼠 拒收病婿
令人晶彥
2023-04-30 20:39:54
魔心 • ̀ω•́
請問你有涉獵Godot嗎?
2023-04-28 15:41:09
%%鼠 拒收病婿
沒有~
2023-04-30 20:39:59
追蹤 創作集

作者相關創作

更多創作