Unity程序員的Unreal 簡明教程(一、旋轉的BOX)
注意,Unreal的版本號
寫下這行字的時候Unreal發布的最新版本是4.25,4.25版本是比4.5 和 4.8更新的版本。
一、下載安裝unreal
略,去epic 官網看看,需要注冊賬號。
安裝好之后你可以看到一個帥氣的圖標,比U3D的好看多了
二、創建項目
Unreal帶了很豐富的模板
但是我們只想要創建一個Game\Black
這些選項都保持默認就好。不用被第一個選項 藍圖 和 c++ 迷惑,他只是模板的一部分,不影響我們在項目里使用藍圖和c++
注意:UnrealEditor 磁盤訪問非常零碎,一定要把項目建在SSD盤上,如果你用機械盤,升級吧。
注意:UnrealEditor 對中文路徑支持有bug,別用中文,否則c++編譯各種奇怪問題
項目創建后你應該能見到這樣一個界面
第一件事是切成英文
點擊菜單 編輯\編輯器偏好設置
將編輯器語言改為英文。
因為你能找到的資料基本都是基於英文界面的,不要自找麻煩。
三、基本界面
Unreal Editor 和 Unity Editor 一樣都提供了基於docking的IDE界面,自己拖拖拽拽就是個人習慣了,
1.視口
我們都知道Unity 提供了 Scene 和 Game 兩個視口
而Unreal 的視口沒有區分功能,可以打開最多四個視口,每個視口都是獨立觀察,也支持線框啥的。
Unreal沒有專門的Game視口,在點擊Play進入運行狀態后,當前選中的視口自動切換為游戲相機。
2. 場景結構
Unity中場景結構相關的兩個視圖是
Hierarchy 視圖 和 Inspector 視圖
其中Hierarchy視圖就是場景的樹狀結構,而Inspector 就是選中場景中的一個節點后,對應該節點的GameObject的各種選項
Unity如其名,他結構設計上非常的統一,場景圖,每個節點對應一個GameObject,所有的組件都掛在GameObject上,Transform既是節點,也是每個GameObject都有的一個位置組件。Transform和GameObject 是一對一關系,多數情況下,並不需要區分Transform和GameObject。
可以說Unity的場景里面只有一種東西,GameObject,所有的功能都掛在GameObject上。
而Unreal這邊就要復雜的多了
雖然有看起來相似的Outline視圖,但這東西不是場景圖,一般翻譯作大綱
大綱視圖里面你可以看到花花綠綠有很多種不同的東西,Unreal把能夠放進場景里的東西稱為Actor,一個Actor不對應一個場景節點,他更像Unity的一個預設,一個Actor下面可以放一堆東西,而且這些東西不會顯示在大綱視圖里
如圖,在detail視圖中給這把椅子添加一個球組件,一個盒子組件,從大綱視圖中選擇chair,則椅子球盒子被作為一個整體選中。
這時候就發現另一個區別了,Unity中的Component組件是純粹的邏輯和數據,除renderer組件之外他不能直接顯示內容,而Unreal將Component組件作為實體。Component在Actor之內構成一棵樹,有一個組件作為根。
Unreal中最常用的組件是StaticMeshComponent,他表示一個靜態物體。一個Actor中可以有任意多個同類組件。
而Unity中把組件作為GameObject的一個屬性,組件之間沒有層次關系,且每種組件只允許掛在GameObject上一次。Unity種最常用的組件是meshrenderer 和 meshfilter
3. 資源視圖
Unreal的資源視圖和Unity的Project視圖功能含義都差不多,不用多說
注意綠色部分是個獨立的按鈕,當你開始寫c++代碼的時候,可以通過這里進行切換,c++Actor 是單獨放置的。
四、編程
Unreal的編程和Unity有相似的地方,需要在場景里組織各種組件
Unreal的場景稱為 Level,概念和Unity差不多。
此處又得講一下,Unity的結構非常簡單,除了掛在場景里的組件,就只有
[InitializeOnLoad]屬性修飾的函數。一共就兩處
而Unreal這里埋藏的設置就比較多
1. 場景里Actor上可以有邏輯
2. Actor下掛的ActorComponent可以有邏輯
3. 每個level有一個LevelBluePrint可以有邏輯
4. Unreal還有一種腳本叫Gamemode,也有邏輯
Unity的編程全部用c#寫腳本
而
Unreal的編程是用藍圖驅動,c++作為藍圖的補充。
1. 旋轉的椅子
選中椅子,從detail視圖點藍色按鈕,把他轉換成一個藍圖actor
前面說過 Actor概念相對Unity 更接近預設
雙擊它就可以進行編程了,如果打開的界面是數據視圖,點擊下圖藍色文字,就可以變成全功能編輯器
全功能視圖老復雜了,讓我們一點點來
從Event Graph 視圖 找到 Event Tick,他就相當於Unity 腳本的Update()
只不過這里我們不寫代碼,改拖流程圖了
右鍵,找到這個函數
連一根線,改一個值
好了,我們第一個程序寫好了
等等,本來這沙發是個staticMesh 組件,他不會跟着邏輯運動,先如圖把他改成可動的。
現在可以運行了,椅子轉起來了。
因為Actor和預設差不多,在場景里多擺幾個Actor,我們就得到了好幾把旋轉的椅子
2.可視化編程
椅子的旋轉量現在是不可控的,我們把他變成從編輯器里面可以直接修改的。
還是這個視圖,加一個變量
主要是這三項,第一個name,第二個type,Rotator 就是一個struct{float yaw pitch roll},一個有特殊變量名的vector3,描述旋轉的三個軸。
第三個Instance Editable,表示這個變量可以在UnrealEditor里面編輯
將這個變量拖拽進來,就會問你,你要get 還是 set,我們要get這個變量用
這種只讀取數據的函數都是沒有進入流程的,他會根據被使用的數據自動調用。如上圖連接就好了
如果你改完之后在detail面板里看不到這個屬性,重啟unreal editor^_^,沒錯,Unreal bug也不少
正常情況下,你就可以在UnrealEditor里面直接編輯他了
3.用組件來實現這個功能
畢竟給每個Actor寫邏輯這太不科學了,我們改為寫一個ActorComponent來完成自轉,這樣所有的Actor都可以套用他了
在content 視圖 右鍵 新建藍圖
選Actor Component
還是一樣的套路,加變量,拖流程,這次你需要去掉Context Sensitive 勾選,因為他會幫你判斷哪些接口你應該不會調用。而我們偏偏要在ActorComponent里面調用Actor的方法
最終如圖,這次多了個GetOwner() 傳給了target
上次是在Actor里面調用,target自動為this。這次不在Actor里調用,需要傳遞target
如果你熟悉面向對象的套路,你會發現,這不就是面向對象?是的。
然后打開椅子藍圖actor
先把他還原(刪除之前的tick事件)按住alt鍵點擊刪除流程線,其它東西可以選中按del
然后把自轉組件拖上去
點上面的Add Component按鈕自己選也行
椅子就又可以轉了,這次我們就得從detail視圖里先選中自轉組件,再改他的值
4. 用C++來編程
Content視圖,右鍵新建c++class ,基於ActorComponent
順利應該自動打開vs,找到我們的class
頭文件修改如下
加了兩行,和上面藍圖里面自己加的變量等價,Unreal c++用UPROPERTY宏來標記下面的變量是一個特殊的變量
實現里加了一行,和上面藍圖里面拖得流程塊等價
這個c++寫的組件,可以替代上面藍圖拖的那個。如果你在編輯器里找不到公開的變量,重啟UnrealEditor
五、總結
這里通過實現一個簡單的功能,來了解一下Unreal,可以發現Unreal比Unity的設計復雜的多。
1. Unreal的基本組織概念和Unity無法對應,不要去套Unity的經驗2
2. Unreal的基本編程思路是粘合靠藍圖,c++來擴充組件。
3. UnrealEditor仍然有不少bug,經常需要重啟大法。
未完持續