從Unity到UE4的快速上手與遷移_第1頁
從Unity到UE4的快速上手與遷移_第2頁
從Unity到UE4的快速上手與遷移_第3頁
從Unity到UE4的快速上手與遷移_第4頁
從Unity到UE4的快速上手與遷移_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本頁面的內(nèi)容:編輯器快速詞匯查找表項目文件和文件從GameObjects到Actors如何在虛幻4中編寫代碼在虛幻4中編寫游戲邏輯代碼常見問題然后呢?本指南從一個Unity的用戶視角來整體看待虛幻4,并幫助將Unity的開發(fā)經(jīng)驗應(yīng)用到虛幻4的世界中。編輯器下面是Unity編輯器和虛幻編輯器的圖片,用顏色標(biāo)識了同類的區(qū)塊。每個區(qū)塊也添加了標(biāo)簽,對應(yīng)于虛幻術(shù)語表。虛幻編輯器完全可以通過對各個區(qū)塊的拖拽做到窗口布局的自定義。編輯資源素材在Unity中,Inspector分頁時用來編輯當(dāng)前項目中選中的素材。在虛幻4中,細(xì)節(jié)面板則用來展示并修改當(dāng)前選中物體的屬性,然后大量的編輯修改則需要專用的窗口或分頁。編輯每種類型的資源時都會打開分頁窗口,類似于網(wǎng)頁瀏覽器。當(dāng)然這些分頁窗口也可以任意拖拽,并懸浮在其他窗口之上作為獨立窗口顯示。快速詞匯查找表下表左側(cè)包含了常見的Unity術(shù)語,右側(cè)是對應(yīng)的(或差不多的)虛幻4術(shù)語。虛幻4的關(guān)鍵詞直接鏈接到更進(jìn)一步的虛幻在線文檔中。分類Unity虛幻4游戲內(nèi)容類型Component組件GameObjectActor,PawnPrefab藍(lán)圖類編輯器界面HierarchyPanel世界大綱Inspector細(xì)節(jié)面板ProjectBrowser內(nèi)容瀏覽器SceneView視口網(wǎng)格物體Mesh靜態(tài)網(wǎng)格物體SkinnedMesh骨骼網(wǎng)格物體材質(zhì)Shader材質(zhì),材質(zhì)編輯器Material材質(zhì)實例特效ParticleEffect特效,粒子,級聯(lián)Shuriken級聯(lián)游戲界面UIUMG(虛幻示意圖行UnrealMotionGraphics)動1E|Animatio圖2DSpriteEditorPaper2D編程C#C++Script藍(lán)圖物理RaycastLineTrace,ShapeTraceRigidBody碰撞,物理運行平臺iOSPlayer,WebPlayer支持的平臺項目文件和文件那么目錄和文件時怎么回事和Unity的項目一樣,虛幻的項目也存在于自有的目錄,并有自己的項目文件。可以通過雙擊一個.uproject文件打開虛幻編輯器并加載該項目,或者右鍵來查看更多選項。項目目錄中包含不同的子目錄,保存了游戲的資源內(nèi)容和源代碼,以及各種配置文件和二進(jìn)制文件。最重要的就是Content子目錄和Source子目錄。我的資源素材應(yīng)該放在哪里?在虛幻4中,每個項目都有一個Content文件夾。類似于Unity項目的Asset目錄,這里就是游戲資源素材保存的地方。要向游戲中導(dǎo)入素材的話,只需要將素材文件拷貝到Content目錄,它們便會自動導(dǎo)入并出現(xiàn)在內(nèi)容瀏覽器中。當(dāng)使用外部程序修改這些資源時,編輯器中的資源也會自動的被更新。支持哪些通用資源文件格式?Unity支持很多文件格式。虛幻4也支持最通用的文件格式,如下表:資源類型支持的格式3D.fbx,.obj貝占圖.png,dds,.exr,.psd,.hdr聲音.wav字體.ttf,.otf視頻.mov,.mp4,.wmv場景是如何保存的?在Unity有一個地圖文件,對應(yīng)于Unity場景。地圖文件保存了關(guān)卡的數(shù)據(jù)以及其中的物件,以及光照數(shù)據(jù)和某些關(guān)卡特定的設(shè)置。如果修改項目的設(shè)置?所有的項目設(shè)置都可以在主菜單的Edit/ProjectSettings中找到。類似于Unity的設(shè)置,能夠?qū)椖吭O(shè)定所需要的信息(比如項目的名稱和圖標(biāo)),配置游戲輸入的綁定,并定義運行項目時為“玩家設(shè)置”的部分,在虛幻中,我們叫“平臺設(shè)置”,并且可以在項目設(shè)置的“平臺”分類里找到。源文件在哪里?在Unity中,人們習(xí)慣于將C#的源文件放在資源目錄中。虛幻4工作機(jī)制有點不同。對那些擁有C++代碼的項目,可以在項目目錄中找到一個Source的子目錄包含多種文件,包括C卄源文件(.cpp)和頭文件(.h),以及編譯鏈接的腳本(.Build,cs,.Target,cs)然后,只有藍(lán)圖的o項目則不會有Source目錄。在虛幻4中開始使用C++最方便的做法是用編輯器的菜單項來AddCodeToProject(在主菜單的文件菜單中),或應(yīng)用某個模板來新建一個C++的項目。可以直接在內(nèi)容瀏覽器中直接看到C++類,并通過雙擊它們便能直接在VisualStudio或Xcode中打開該文件。從GameObjects到ActorsGameObject去哪里在Unity中,一個GameObject是可以被放置在世界中的一個'‘東西”。在虛幻4中對應(yīng)的是一個Actoro在虛幻編輯器中,可以從物體面板中直接拖一個空的Actor放置到場景中:Youtube視頻雖然可以通過搭建并擴(kuò)展空的Actor來制作游戲,但虛幻4提供了各種特殊類型的Actor并預(yù)制了它們的特性,比如Pawn(用于作為玩家或者AI的角),樣,可以直接將它們拖拽至場景中,并給它們添加組件,或自定義屬性。之后可以學(xué)習(xí)到更多相關(guān)內(nèi)容,這里只需要了解虛幻4有個(Gameplay框架Gameplay/Framework來協(xié)同各種特殊的Actor一起工作。虛幻4中的Actor還是和Unity中的GameObjects有不同之處。在Unity中,GameObject是C#的類并且無法直接擴(kuò)展。在虛幻4中,Actor是C++類,可以很容易的被繼承或擴(kuò)展來自定義。我們之后將會談?wù)摳啵〗M件在哪里?在Unity中,可以通過為一個GameObject添加組件來達(dá)到給予一定的功能。在虛幻4中,也可以為Actor添加組件。在向關(guān)卡中放置了一個空的Actor后,點擊添加組件按鈕(在細(xì)節(jié)面板中并選擇一個組件來添加。這里我們通過放置一個空的Actor來創(chuàng)建一個火炬,并為它添加一個網(wǎng)格物體組件面的例子中看到,光源和粒子是連接到網(wǎng)格模型的。之后在復(fù)合Actor和復(fù)合GameObject中會有重要的描述討論。從Unity的prefabs到虛幻4的藍(lán)圖類Unity的工作流程是基于prefabs的。在Unity中,倉建一系列GameObjects以及它們的組件,并為它們創(chuàng)建prefabo然后便可以在世界屮放置prefab的實組件,并為它們創(chuàng)建prefabo然后便可以在世界屮放置prefab的實在虛幻4中,創(chuàng)建一個Actor以及它的組件,選擇它并點擊藍(lán)圖/添加腳本按鈕(在細(xì)節(jié)面板中)。然后選擇保存藍(lán)圖類的地方,并點擊創(chuàng)建藍(lán)圖來保存新建的藍(lán)圖!Youtube視頻新建的藍(lán)圖類可以在內(nèi)容瀏覽器中找到。可以直接雙擊打開編輯它們,也可以將它們拖拽到任意場景關(guān)卡中。腳本組件和MonoBehaviour在哪里?在Unity中,GameObject有腳本組件,并可以添加C#腳本。可以創(chuàng)建MonoBehavior子類并定義那個組件做什么。虛幻4也有類似的內(nèi)容。可以自由創(chuàng)建全新的組件類并將它應(yīng)用于任意Actoro組件類可以使用藍(lán)圖腳本創(chuàng)在細(xì)節(jié)面板中,添加組件(AddComponent)的下拉框中,可以看到創(chuàng)建新組件,或者選擇已經(jīng)存在的組件:在Unity中,當(dāng)創(chuàng)建新的MonoBahaviour時,將會有一個框架類文件,并有Start()函數(shù)和Update()函數(shù)。在虛幻4中,也會有一個框架類,有~個InitializeCo()函數(shù)和一個TickComponent()函數(shù),它們和Start>Update具有類似的行為。如果創(chuàng)建一個藍(lán)圖腳本組件,則會有可視化節(jié)點來表示函數(shù):可編輯腳本Actor藍(lán)圖類這是個很酷的虛幻4功能:新建的Actor藍(lán)圖類可以擁有自己的可視化藍(lán)圖腳本編輯!這樣能夠為整個物體添加邏輯,而不僅僅是每個組件。結(jié)合繼承結(jié)構(gòu)關(guān)系(稍后下Classessupportingvisualscriptin旦UE4alsosupportsC++Classesimplementedwithcode化腳本編輯,虛幻4還支持通過代碼C++類來實現(xiàn)。這里是雙方的System.Collections;publicclassMyComponent:MonoBehaviour//UsethisforinitializationvoidStart()))#pragmaonce#include^GameFramework/Actor.h〃#include〃MyActor.generatedclassAMyActor:publicGENERATED_BODY()intCount;//SetsdefauItvaluesforthisactor5sproperties.AMyActor()//AllowsTick()tobecalledPrimaryActorTickbCanEverTick=true;//CalledwhenthegamestartsorwhenspawnedvoidTick(floatDeltaSeconds)Super::Tick(DeltaSeconds);GLog->Log(FString::FromInt(Count));};虛幻4藍(lán)圖虛幻4藍(lán)圖類的擴(kuò)展性Unity的prefabs和虛幻4的藍(lán)圖類在游戲中類似的實例化。然后的藍(lán)圖類在游戲中類似的實例化。然后Unity在prefabs之間的關(guān)系上有并發(fā)的問題,這限制了創(chuàng)作的擴(kuò)展性。在虛幻4中,可以通過擴(kuò)展已有的藍(lán)圖類來創(chuàng)建新的藍(lán)圖類,并定義新的屬性,組件功能及可視化腳本功能。比如,在虛幻4中,可以創(chuàng)建一個藍(lán)圖類叫做Monster,實現(xiàn)基本的怪物功能,比如追擊人類。然后可以創(chuàng)建一個叫做Dragon的藍(lán)圖類來擴(kuò)展它(某種特定的怪物,添加了火焰吐息的功能),再有一個Grue(一種當(dāng)它變黑是就有可能吃人的怪物),以及其他8種類型。這樣一些Monster的子類都繼承了基礎(chǔ)的Monster類的功能,并在此基礎(chǔ)上添加新的能力。在Unity中,則需要創(chuàng)建很多不同的GameObject的prefabs:為Dragon創(chuàng)建一個,為Grue創(chuàng)建一個,等等。假設(shè)這時希望為所有的怪物添加某個功能,比如使用一個Speak組件來說話,在Unity中則需要更新所有的10個prefabs,拷貝粘貼到每個中。在虛幻4中,只需簡單的修改Monster的藍(lán)圖類,并為它添加新的Speak的能力,便做完了!Dragon,Grue以及其他8種Monster的子類都會自動的繼承這個說話的新功能,并不需要去修改這些子類。但還有更多!我們關(guān)于藍(lán)圖類所說的一切,都同樣適用于C++的類,也同樣對Actors和組件適用。我們的體系設(shè)計時考慮支持各種不同程度的開發(fā)形式,具有功能上的可擴(kuò)展性,可以為10個開發(fā)人員的項目服務(wù),也可以為100個人的項目人員服務(wù)。那么應(yīng)該用藍(lán)圖腳本還是C++代碼呢?或者同時使用?可視化系統(tǒng)對策劃、美術(shù)以及面向可視化編程的程序員是非常好用的,它能夠可視化的管理游戲內(nèi)的物體,并且容易訪問。完全可以通過藍(lán)圖就完成一個游戲的制作。請參考TappyChicken示例,它是一個完整戲體系,制作復(fù)雜的AI行為,或者新增引擎功能。對于已有C++技能的開發(fā)人員而言,可以翻閱一下在虛幻4中的C++編程簡述頁面。大部分的項目都將是混合使用藍(lán)圖和C++。很多開發(fā)者使用藍(lán)圖來創(chuàng)作程容易且有趣,但會在之后的性能調(diào)整和更嚴(yán)格的引擎使用時將部分藍(lán)圖或全部藍(lán)圖腳本轉(zhuǎn)移至C++0藍(lán)圖類也能擴(kuò)展C++類虛幻4的游戲開發(fā)中很多令人著迷的過程來存在于程序員用C++實現(xiàn)新的功能,而策劃和美術(shù)在藍(lán)圖中使用這些功能,并提出更多要求!下圖是針對一個虛幻4的射擊游戲項目中實現(xiàn)拾取物品過程時,團(tuán)隊的一種形式,混合了C++類的編程實現(xiàn),以及藍(lán)圖類用于處轉(zhuǎn)換組件在Unity中,每個GameObject都有一個轉(zhuǎn)換組件(TransformComponent),賦予該GameObject在世界中的位置、角度以及縮放比例。在虛幻4中類似,Actor有一個RootComponent,能夠作為場景組件的任意子類,場景組件賦予Actor在世界中的位置、角度及縮放比例,這些參數(shù)會費賦予該Actor的組件關(guān)系結(jié)構(gòu)中在它之下的所有組件。很多有用的組件都是場景組件的子類,因此讓它們具有位置信息是非常有用的!即便只放置一個空的Actor,虛幻4也會為它創(chuàng)建一個"默認(rèn)場景Root組件”,這是一個最簡單的場景組件。當(dāng)放置一個新的場景組件時,默認(rèn)場景Root則會被替換掉。復(fù)合物體在Unity中,可以構(gòu)建GameObject之間的關(guān)系并將他們的轉(zhuǎn)換組件綁定,來創(chuàng)建復(fù)合物體。在虛幻4中,通過整潔的組件繼承便能創(chuàng)建復(fù)合游戲物體。從來得到,由于他們有轉(zhuǎn)換功能,類似于Unity中的轉(zhuǎn)換的綁定。Actor的各個組件(所有組件的基類)只能直接依附到Actor自己身上。我是否應(yīng)該用組件來創(chuàng)造其他一切?其實這完全取決于你自己,大部虛幻4中已經(jīng)提供了一些特殊類型的Actor用于某種能力并總是附帶某些組件。比如一個Character總是會包含一個CharacterMovement組件。有一些在引擎中常見的Actor類型,并且大部分種類的游戲都會Actor的一種類型,用于表現(xiàn)一個可供控制的游戲物體,比如是玩家的角色。Pawn通常都是被玩家或者AI通過Controller控制并移動。通過將Pawn和Controller的分離,我們可以編寫AIController,用于控Controller-一個更為特殊的Controller,用于從玩家的手柄中獲得輸入信息,或者鼠標(biāo)鍵盤中獲得殊瑞星納西,并將這些信息驅(qū)動它所控制的Pawn或者Character的行為。那么所有的東西都是Actor咯?并不是所有的。Actor是虛幻4中最常見的用于游戲的類,并是唯一能夠在世界中被創(chuàng)建生成Spawn的類。因此任何被放置在關(guān)卡中的東西都將是一個Actor另外一個需要知道的重要類型是ObjectoObject實際0上是所有虛幻引擎的類的基類,包括Actor以及一些其他的類。這是一個比Actor更加底層的類,具備一些作為虛幻引擎類的可預(yù)料的功能,比如反射和序列化。Object是一個非常基礎(chǔ)的類,當(dāng)我們需要定義一個新的類但又并非Actor的時候會使用它。比如ActorComponent是Gameplay框架是什么東西?好吧,這里開始事情變得一點點瘋狂也做了同樣的事情。在Unity中可以基于GameObjects和組件來創(chuàng)建所頂層提供了叫做Gameplay框架的部分,而Unity中并沒有這塊內(nèi)容。雖然做一款游戲并不是一定要用到它,但如果用的話會非常酷!基本上來說,它提供了一些基礎(chǔ)功能,如果遵循它的邏輯,您將能夠很容易的獲得一些很贊的功能,否則可能花費很多時間,并且實現(xiàn)也很困難,或者很難改造。(比如完整的多人游戲支持!)已有大量的酷炫游戲基于虛幻的Gameplay框架之上制作,花點時間來了解該框架的機(jī)制是很值得的。沒錯,最終您將具有您自己的框架形式,如果想要這么做當(dāng)然完全沒問題!但虛幻4當(dāng)前已有數(shù)以百計的炫酷開發(fā)者在使用它,因此我們花點時間來了解一下。要使用Gameplay框架,只需要了解一些預(yù)制的Actor類,比如Pawn,Character,和PlayerController,并逐步了解虛幻的網(wǎng)絡(luò)復(fù)制和網(wǎng)絡(luò)其他功能。現(xiàn)在我們先回到最基本的部分。如何在虛幻4中編寫代碼我曾習(xí)慣于在MonoDevelop中寫代碼對于藍(lán)圖腳本,只需要虛幻編輯器——所有的東西都已經(jīng)包括了!要編寫C++代碼,在Windows平臺下載VisualStudio的免費版本,如果是Mac的話則需要安裝Xcode當(dāng)?shù)谝淮蝿?chuàng)建一個新0項目(或者為已有項目添加代碼)時,虛幻4將會自動的創(chuàng)建VisualStudio的項目文件。您只需要在內(nèi)容瀏覽器中雙擊一個C++的類便能在VisualStudio中打開它,或者在主菜單的文件菜單中點擊OpenVisualStudio在虛幻4中有個重要的不同:有時必須要手動的更新oVisualStudio的項目文件(比如,下載了UE4的新版本,或者對源代碼文件的磁盤存放位置做了人為改變)。可以通過在主菜單中點擊RefreshVisualStudioProject或者在項目目錄中右鍵點擊.uproject文件并選擇GenerateVisualStudioprojectfi.les便可。編寫事件函數(shù)(Start,Update等)如果您曾用MonoBehaviors工作,那一定熟悉諸如Start,Update和OnDestroy等方法。以下是對Unity的行為和對應(yīng)的虛幻4的Actor和組件的比較。在Unity中,我們可能有一個簡單的組MonoBehaviour<請記住,在虛幻4中,您可以直接為Actor寫代碼而無需創(chuàng)建新的組件來添加代碼。這其實是很常見并有意義的。類似于Unity的Start,OnDestroy和Update函數(shù),虛幻4在Actor中有類似的方法:C++:UCLASS()classAMyActor:publicAActor{GENERATED_BODY()voidBeginPlay();//Calledwhendestroyed?voidEndPlay(constEEndPlayReason::TypeEndPlayReason);//Calledeveryframetoupdatethisactor.voidTick(floatDeltaSeconds);};藍(lán)圖:在虛幻4中,組件具有不同的函數(shù)。以下是示例:C++:UCLASS()classUMyComponent:publicUActorComponent(GENERATED_BODY()//CalledaftertheowningActorwascreatedvoidInitializeComponent();//CalledwhenthecomponentortheowningActorisbeingdestroyedvoidUninitializeComponent();//ComponentversionofTickvoidTickComponent(floatDeltaTime,enumELevelTickTickType,FActorComponentTickFunction*ThisTickFunction);};藍(lán)圖:請記住,在虛幻4中調(diào)用基類的方法很重要。比如,在UnityC#中可能是調(diào)用base.UpdaUMyComponent::TickComponent(floatDeltaTime,enumELevelTickTickType,FActorComponentTickFunction*ThisTickFunction)(//CustomtickstuffhereSuper::TickComponent(DeItaTime,TickType,ThisTickFunction);YoumayhavenoticedsomethingsbeginwithandotherswithprefixindicatesanObjectsub-classforexampleisusedformostplaindatastructuresornon-UObjectclasses.您也許已經(jīng)注意到C++中有些以“A”開頭,而其他一些以“U”開頭。前綴“A”代表它是一個Actor的子類,而前綴“U”代表它是一個Object的子類。還有其他一些前綴,比如“F”用于代表一個平鋪的數(shù)據(jù)結(jié)構(gòu)體,或者其他非Uboject的類。在虛幻4中編寫游戲邏輯代碼好了,現(xiàn)在開始稍微深入一些。我們將談?wù)撘幌聞?chuàng)建游戲所需要的編程話題。因為您了解Unity,我們來面向C#的用戶解釋C++的功能,當(dāng)然您也可以使用藍(lán)圖來完成幾乎所有的事情!我們盡可能的為范例提供C++的同時也提供藍(lán)圖。先說一下一些通用的游戲邏輯編程模式,以及如何在虛幻中實現(xiàn)。許多在Unity中的函數(shù)在虛幻中都有類似的函數(shù)。我們先從最常見的開始。InstantiatingGameObject/SpawningActor在Unity中,我們使用Instantiate函數(shù)來新建物體的實例。該函數(shù)使用任意的UnityEngine.GameObjectEnemyPrefab;publicVector3SpawnPosition;publicQuaternionSpawnRotation;GameObjectNewGO=(GameObject)Instantiate(EnemyPrefab,SpawnPosition,SpawnRotation);NewG0name="MyNewGameObject〃;在虛幻4中,根據(jù)不同的需要,有一些不同的函數(shù)用于創(chuàng)建物體。NewObject用于創(chuàng)建新的UObject類型實例,而SpawnActor用于創(chuàng)建新的AActor類型實例。首先我們總體說一下UObject和NewObject。在虛幻中UObject的子類很像Unity中ScriptableObject的子類。對于游戲過程中,它們是那些不需要在游戲世界中創(chuàng)建并看見的存在。在Unity中,如果要創(chuàng)建自己的ScriptableObject子類,可能會像下面這樣的初MyScriptableObjectNewSO=ScriptableObject中,如果要創(chuàng)建UObject的繼承類,是像下面這樣的初始化:UMyObject*NewObj=NewObject();那么Actor呢?Actor的在世界(C++中的UWorld)中生成是通過SpawnActor方法。如何獲取World對象?有些UObject會提供一個GetWorld的方法,所有的Actor則都具有這個方法。您可能已經(jīng)注意到,并沒有傳遞一個Actor,我們傳遞了一個Actor的“class”來作為生成Actor的參數(shù)。在我們的范例中,是一個AMyEnemy類的任意子類。但如果想要創(chuàng)建某個東西的"拷貝",就像Unity的Instantiate函數(shù)那樣,該怎么做呢?NewObject和SpawnActor函數(shù)也能通過給一個"模板”對象來工作。虛幻引擎會創(chuàng)建該一個對象的拷貝,而不是從零創(chuàng)建一個新的對象。這將會拷貝該CreateCloneOfMyActor(AMyActor*ExistingActor,FVectorSpawnLocation,FRotatorSpawnRotation){UWorld*World=ExistingActor->GetWorld();FActorSpawnParametersSpawnParams;World->SpawnActor(ExistingActor->GetClass(),SpawnLocation,SpawnRotation,SpawnParams);您也許想知道“從零開始創(chuàng)建”在這里具體是什么意思。每個對象類在創(chuàng)建時都有一個默認(rèn)模板,包含了它的默認(rèn)屬性和組件。在創(chuàng)建時如果您并不像修改這些默認(rèn)屬性,并沒有提供你自己的模板,虛幻將使用這些默認(rèn)值來創(chuàng)建該對象。為了更好的說明這個,我們MonoBehaviour(publicintMylntProp=42;publicSphereColliderMyCollisionComp=null;//Createthecollisioncomponentifwedor?talreadyMyCollisionComp=gameObjectAddComponent();MyCollisionCompMyCollisionComp.radius=在上面這個例子中,有一個int屬性,默認(rèn)是42,并有一個SphereCollider組件默認(rèn)半徑是20。在虛幻4中,利用對象的構(gòu)造函GENERATED_BODY()int32MylntProp;USphereComponent*MyCollisionComp;MylntPropMylntProp=42;MyCollisionComp=MyCo11isionComp->RelativeLocation=FVector::ZeroVector;MyCollisionComp->SphereRadius=20.Of;}在AMyActor的構(gòu)造函數(shù)中,我們?yōu)檫@個類設(shè)置了屬性的默認(rèn)值。請注意CreateDefaultSubobject函數(shù)。我們可以用它來創(chuàng)建組件并賦予組件默認(rèn)值。所有子對象都將使用這個函數(shù)作為默認(rèn)模板來創(chuàng)建,也可以在子類或者藍(lán)圖中對它進(jìn)行修改。類型轉(zhuǎn)換在這個例子中,獲取了一個己知的組件,并將它轉(zhuǎn)C#:Collidercollider=gameObject.GetComponent;SphereCollidersphereCollider=colliderasSphereCollider;if(//...虛幻4C++:UPrimitiveComponent*Primitive=MyActor->GetComponentByClass(UPrimitiveComponent::StatieClass());USphereComponent*SphereCollider=Cast(Primitive);if(SphereCollider!=nullptr){//...銷毀GameObject/ActorUnityC++藍(lán)圖Destroy(MyGameObject);UnityC++藍(lán)圖Destroy(MyGameObject,1);MyActor->SetLifeSpan(l);禁用GameObjects/ActorsUnityC++BlueprintMyGameObjectSetActive(false);//HidesvisiblecomponentsMyActor->SetActorHiddenlnGame(true);////DisablescollisioncomponentsMyActor->SetActorEnab1eCo11ision(false);//StopstheActorfromtiekingMyActor->SetActorTickEnabled(false);通過組件訪問GameObject/ActorUnityC++藍(lán)圖GameObjectParentGO=MyComponentAActor*ParentActor=MyComponent->GetOwner();點擊查看大圖通過GameObject/Actor訪問組件UnityMyComponentMyCompMyActor->FindComponentByClass();藍(lán)圖查找GameObjects/Actors//FindGameObjectbynameGameObjectMyGO=//FindObjectsbytypeMyComponent[]Components=FindObjectsOfType(typeof(MyComponent))asMyComponent[];foreachforeach(MyComponentComponentinComponents)//FindGameObjectsbytagGameObject[]GameObjects=GameObjectFindGameObjectsWithTag(/zMyTagz,);foreach(GameObjectGOinGameObjects)(//...//FindActorbyname(alsoworksonUObjects)AActor*MyActor=FindObject(nullptr,TEXT(〃MyNamedActor〃));//FindActorsbytype(needsaUWorldobjecAMyActor*MyActor=*It;//...//FindUObjectsbytype{UMyObject*MyObject=*It;//…////FindActorsbytag(alsoworksonActorComponents,useTObjectlteratorinstead)for(TActorlteratorIt(GetWorldO);It;++It)(AActor*Actor=*It;//...)為GameObjects/Actors添加標(biāo)簽MyGameObject.tag=〃MyTag〃;//ActorscanhavemultipletagsMyActor.Tags.AddUnique(TEXT(〃MyTag〃));為MonoBehaviours/ActorComponents添加標(biāo)簽//ThischangesthetagontheGameObjectitisattach//ComponentshavetheirownarrayoftagsMyComponent.ComponentTagsGameObjects/Actors和MonoBehaviours/ActorComponents的標(biāo)簽MyTag//...)//ChecksifanActorComponenthasthistag辻物理:剛體vs.兀組件在Unity中藥給一個GameObject物理特性,需要給它一個剛體組件。在虛幻中,任何元組件(C++中為盒形),StaticMeshComponent,以及SkeletalMeshComponent和Unity不同,oUnity將碰撞體和可視物體分列到不同的組件中。而虛幻則將潛在的物理碰撞和潛在的可視效果組合到了Primitivecomponent中。任何在世界中具有形狀的物體,要么就是能夠被渲染顯示,要么就是能作物理交互,它們都繼承于Primitivecomponent。層vs通道在Unity中,它們被稱為"層(Layer)"。虛幻使用碰撞通道(CollisionChannel)來描RayTraceUnityC#:GameObjectFindGOCameralsLookingAt()Vector3Start=Cameratransfonn.position;Vector3Direction=CameraDistance=100.Of;RaycastHitHit;XHlinseyiiHdeoejleuieq;Aqpejeindodste6^OuMedjegJjopvpejouBippvsujejeciu/v\eds,jeAe|deq;ejou6|//IsitiejedsuuejedAjenouoisinoojeoejleq;tnoqeseipedojdsnoueAOjvBui^oonsiejeujeouMecipuij::」o||o」iuoo_oAe||A|/\|\/八c//Raycastoutfromthecamera,onlycollidewithpawnsFVectorStart=P1ayerCameraManager->GetCameraLocation();FVectorEnd=Start+boolbHit=GetWorld()->LineTraceSingle(Hit,Start,End,ECC_Pawn,Params);//Hit.ActorcontainsaweakpointertotheActorthatthetracehit)returnnullptr;)虛幻4藍(lán)圖:點擊查看大圖。觸發(fā)器UnityC#:publicclassMyComponent:MonoBehaviour)voidOnTriggerEnter(ColliderOther)//..?voidOnTriggerExit(ColliderOther)classAMyActor:publicGENERATED_BODY()//MytriggercomponentUPROPERTY()UPrimitiveComponent*Trigger;Trigger=CreateDefaultSubobject(TE//Bothcollidersneedtohavethi//Setthecollisionmodeforthecollider//Thismodewillonlyenablethecolliderforraycasts,sweeps,andoverlapsSetCo11isionEnabled(ECo11isionEnabled::QueryOnly);voidBeginPlay()//RegistertofindoutwhenanoverlapoccursOnActorBeginOverlapAddDynamic(this,&AMyActor::OnTriggerEnter);OnActorEndOverlapAddDynamic(this,&AMyActor::OnTriggerExit);Super::BeginPlay();)voidEndPlay(constEEndPlayReason::TypeEndPlayReason)OnActorBeginOverlapRemoveDynamic(this,&AMyActor::OnTriggerEnter);OnActorEndOverlapRemoveDynamic(this,&AMyActor::OnTriggerExit);Super:EndPlay(EndPlayReason);UFUNCTIONOvoidOnTriggerEnter(AActor*Other);UFUNCTIONOvoidOnTriggerExit(AActor*Other);虛幻4藍(lán)圖:還可以在這里讀到更多關(guān)于設(shè)置碰撞的響應(yīng)。岡I」體運動UnityC#:publicclassMyComponent:MonoBehaviourrigidbody.isKinimatic=true;rigidbody.velocity=transformforward*10.Of;)在虛幻4中,碰撞組件和剛體組件是同一個組件,它的基類是UPrimitiveComponent,它也有不同的子類(USphereComponent,UCapsuleComponent等)來配合不同的需求。classAMyActor:publicUPrimitiveComponent*PhysicalComp;PhysicalComp=CreateDefaultSubobject(TEXT(//CollisionAndPhysPhysicalComp->SetSimulatePhysics(false);PhysicalComp->SetPhysicsLinearVelocity(GetActorRotation())輸入事件UnityC#:publicclassMyPlayerController:MonoBehaviour(//..?GetAxis("Horizontal〃);//…classAMyPlayerController:publicAPlayerControllerGENERATED_BODY()voidSetuplnputComponent()Super::SetupInputComponent();&AMyPlayerController::HandleFirelnputEvent);InputComponent->BindAxis("Horizontal",this,&AMyPlayerController::HandleHorizontalAxisInputEvent);InputComponent-〉BindAxis("

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論