Unity程序員的Unreal 簡明教程(一、旋轉的BOX)


Unity程序員的Unreal 簡明教程(一、旋轉的BOX)

注意,Unreal的版本號

寫下這行字的時候Unreal發布的最新版本是4.25,4.25版本是比4.5 和 4.8更新的版本。

一、下載安裝unreal

略,去epic 官網看看,需要注冊賬號。

wps1

安裝好之后你可以看到一個帥氣的圖標,比U3D的好看多了

二、創建項目

Unreal帶了很豐富的模板

wps2

wps3

wps4

但是我們只想要創建一個Game\Black

這些選項都保持默認就好。不用被第一個選項 藍圖 和 c++ 迷惑,他只是模板的一部分,不影響我們在項目里使用藍圖和c++

注意:UnrealEditor 磁盤訪問非常零碎,一定要把項目建在SSD盤上,如果你用機械盤,升級吧。

注意:UnrealEditor 對中文路徑支持有bug,別用中文,否則c++編譯各種奇怪問題

項目創建后你應該能見到這樣一個界面

wps5

第一件事是切成英文

點擊菜單 編輯\編輯器偏好設置

wps6

將編輯器語言改為英文。

因為你能找到的資料基本都是基於英文界面的,不要自找麻煩。

三、基本界面

Unreal Editor 和 Unity Editor 一樣都提供了基於docking的IDE界面,自己拖拖拽拽就是個人習慣了,

1.視口

我們都知道Unity 提供了 Scene 和 Game 兩個視口

wps7

wps8

而Unreal 的視口沒有區分功能,可以打開最多四個視口,每個視口都是獨立觀察,也支持線框啥的。

Unreal沒有專門的Game視口,在點擊Play進入運行狀態后,當前選中的視口自動切換為游戲相機。

2. 場景結構

Unity中場景結構相關的兩個視圖是

wps9

Hierarchy 視圖 和 Inspector 視圖

其中Hierarchy視圖就是場景的樹狀結構,而Inspector 就是選中場景中的一個節點后,對應該節點的GameObject的各種選項

Unity如其名,他結構設計上非常的統一,場景圖,每個節點對應一個GameObject,所有的組件都掛在GameObject上,Transform既是節點,也是每個GameObject都有的一個位置組件。Transform和GameObject 是一對一關系,多數情況下,並不需要區分Transform和GameObject。

可以說Unity的場景里面只有一種東西,GameObject,所有的功能都掛在GameObject上。

而Unreal這邊就要復雜的多了

wps10

雖然有看起來相似的Outline視圖,但這東西不是場景圖,一般翻譯作大綱

wps11

大綱視圖里面你可以看到花花綠綠有很多種不同的東西,Unreal把能夠放進場景里的東西稱為Actor,一個Actor不對應一個場景節點,他更像Unity的一個預設,一個Actor下面可以放一堆東西,而且這些東西不會顯示在大綱視圖里

wps12

如圖,在detail視圖中給這把椅子添加一個球組件,一個盒子組件,從大綱視圖中選擇chair,則椅子球盒子被作為一個整體選中。

這時候就發現另一個區別了,Unity中的Component組件是純粹的邏輯和數據,除renderer組件之外他不能直接顯示內容,而Unreal將Component組件作為實體。Component在Actor之內構成一棵樹,有一個組件作為根。

Unreal中最常用的組件是StaticMeshComponent,他表示一個靜態物體。一個Actor中可以有任意多個同類組件。

而Unity中把組件作為GameObject的一個屬性,組件之間沒有層次關系,且每種組件只允許掛在GameObject上一次。Unity種最常用的組件是meshrenderer 和 meshfilter

3. 資源視圖

Unreal的資源視圖和Unity的Project視圖功能含義都差不多,不用多說

wps13

注意綠色部分是個獨立的按鈕,當你開始寫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

wps14

前面說過 Actor概念相對Unity 更接近預設

wps15你會在Content視圖看到這個Actor

雙擊它就可以進行編程了,如果打開的界面是數據視圖,點擊下圖藍色文字,就可以變成全功能編輯器

wps16

wps17

全功能視圖老復雜了,讓我們一點點來

從Event Graph 視圖 找到 Event Tick,他就相當於Unity 腳本的Update()

只不過這里我們不寫代碼,改拖流程圖了

wps18

右鍵,找到這個函數

wps19

連一根線,改一個值

好了,我們第一個程序寫好了

wps20

等等,本來這沙發是個staticMesh 組件,他不會跟着邏輯運動,先如圖把他改成可動的。

現在可以運行了,椅子轉起來了。

wps21

因為Actor和預設差不多,在場景里多擺幾個Actor,我們就得到了好幾把旋轉的椅子

2.可視化編程

椅子的旋轉量現在是不可控的,我們把他變成從編輯器里面可以直接修改的。

wps22

還是這個視圖,加一個變量

wps23

主要是這三項,第一個name,第二個type,Rotator 就是一個struct{float yaw pitch roll},一個有特殊變量名的vector3,描述旋轉的三個軸。

第三個Instance Editable,表示這個變量可以在UnrealEditor里面編輯

wps24

將這個變量拖拽進來,就會問你,你要get 還是 set,我們要get這個變量用

wps25

這種只讀取數據的函數都是沒有進入流程的,他會根據被使用的數據自動調用。如上圖連接就好了

如果你改完之后在detail面板里看不到這個屬性,重啟unreal editor^_^,沒錯,Unreal bug也不少

正常情況下,你就可以在UnrealEditor里面直接編輯他了

wps26

3.用組件來實現這個功能

畢竟給每個Actor寫邏輯這太不科學了,我們改為寫一個ActorComponent來完成自轉,這樣所有的Actor都可以套用他了

wps27

在content 視圖 右鍵 新建藍圖

選Actor Component

還是一樣的套路,加變量,拖流程,這次你需要去掉Context Sensitive 勾選,因為他會幫你判斷哪些接口你應該不會調用。而我們偏偏要在ActorComponent里面調用Actor的方法

wps28

wps29

最終如圖,這次多了個GetOwner() 傳給了target

上次是在Actor里面調用,target自動為this。這次不在Actor里調用,需要傳遞target

如果你熟悉面向對象的套路,你會發現,這不就是面向對象?是的。

然后打開椅子藍圖actor

先把他還原(刪除之前的tick事件)按住alt鍵點擊刪除流程線,其它東西可以選中按del

wps30

然后把自轉組件拖上去

wps31

點上面的Add Component按鈕自己選也行

椅子就又可以轉了,這次我們就得從detail視圖里先選中自轉組件,再改他的值

wps32

4. 用C++來編程

Content視圖,右鍵新建c++class ,基於ActorComponent

順利應該自動打開vs,找到我們的class

頭文件修改如下

wps33

加了兩行,和上面藍圖里面自己加的變量等價,Unreal c++用UPROPERTY宏來標記下面的變量是一個特殊的變量

wps34

實現里加了一行,和上面藍圖里面拖得流程塊等價

這個c++寫的組件,可以替代上面藍圖拖的那個。如果你在編輯器里找不到公開的變量,重啟UnrealEditor

五、總結

這里通過實現一個簡單的功能,來了解一下Unreal,可以發現Unreal比Unity的設計復雜的多。

1. Unreal的基本組織概念和Unity無法對應,不要去套Unity的經驗2

2. Unreal的基本編程思路是粘合靠藍圖,c++來擴充組件。

3. UnrealEditor仍然有不少bug,經常需要重啟大法。


未完持續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM