虛幻腳本入門

我的作品:http://v.youku.com/v_show/id_XNTMwMTU0OTIw.html


前邊的話:

 

Unreal Script,即虛幻腳本,後綴名UC,以下用UC代替。

 

寫這篇帖子的目的是爲了讓更多的想學習UC但沒有UC使用經驗的愛好者對UC有個理性認識,不再認爲UC是個門檻


高的東西,如果讀完這篇文章,你有信心和慾望開發自己的UC工程,我的初衷就達到了。

 

事實上,Epic設計UC目的是犧牲遊戲性能,實現程序開發效率。所以,我會從業餘角度出發,以實用性爲主,用最簡


潔、易懂的語言來表達,有些地方肯定不規範,甚至違背了

 

程序開發的擴展性、規範性,請見諒。


本文依個人情況而定:

      

一、無編程經驗,無遊戲編程經驗,本文章最適合你,你將會從這裏學到最多。

 

二|、有編程經驗,無遊戲編程經驗,如果你會點C++、java或任意一種面嚮對象語言,甚至還知道MVC,讀了本文你


將會在UC學習效率上很快,少走彎路。

 

三、有編程經驗,有遊戲編程經驗,甚至懂得設計模式,恭喜你,你可以粗讀本文,看附帶的學習資料,踏上UC之旅


吧,那裏有你熟悉的單例、工廠、代理、原型。


UC學習資料:

 

官方文檔:http://apacudn.epicgames.com/Three/WebHome.html(最權威的技術指引,利用好搜索,你會發現UDN


內涵比門面更精彩,例如,關鍵詞MasteringUnrealScript)

 

官方論壇:http://forums.epicgames.com/forum.php(人氣極旺,技術高,這裏沒有最牛隻有更牛,全英文)

 

UDK中文網 http://www.udkcn.com/forum.php(內容較老,但是技術都很有用,而且是中文)

 

AboutCG社區 http://www.aboutcg.com/(商業UDK教學,質量上乘,但是要米)

 

博客:http://hfun.me/(目測是劍靈開發人員的博客)

 

視頻:

 

YouTube(如果有條件上國外網站、社區,最好不過了)

 

風之神韻視頻教程(推薦免費前兩章)

 

Eat3D – UnrealScrip虛幻腳本應用教程(英文)

 

Eat3DRe-creating Assault in UDK(英文,高難度,開發一個類似CS的局域網對戰遊戲,

 

網絡部分在這裏有重要的應用,雖然我專業是網絡,但是很難懂,看懂3部你就是大神了)

 

GA只推薦那兩本書


一、UC、遊戲編程簡介:

 

UC是一個面向對象編程語言(OOP),對象、繼承、多態是此類語言最大的特點。(百度一下,你就知道)

 

世間的一切東西都可以看成某個對象,只不過是具象與抽象之分,我舉個簡單的例子:

 

汽車是一個類(class),你的汽車就是一個實例,汽車類的每個實例都是一個對象。

 

你的汽車跟別人的汽車肯定不同,顏色、車胎、速度等,這些叫屬性(property)。

 

你還要對汽車進行操作,駕駛、加油、維修,這些叫方法或函數(function)。

 

目前流行的遊戲編程語言都是OOP的,拿虛幻來說,小到相機、燈光、導航點,大到每個角色、武器、遊戲類型,都


是一個Class。事實上,Kismet裏的任何一個東東都是通過UC定義Class實現的。(插個笑話,epic官方論壇上兩個老


外就一個第三方Kismet組件產權吵了快20頁)

 

知道這些已經足夠,或通過自學(任何語言編一個2d小遊戲是推薦的方法),加深OOP的思想,結合虛幻分析一個典


型的遊戲邏輯(如何建立空工程在下文):

 

類UTGame中:

 

PlayerControllerClass=class'UTGame.UTPlayerController'

 

DefaultPawnClass=class'UTPawn'

 

class'UTPawn'定義UTGame裏的機器人,模型、動畫、生命、速度都在裏面,僅僅如此,

 

它是不會聽從玩家指揮來行動的,class'UTGame.UTPlayerController'定義抽象的控制器,負

 

責給UTPawn下達行動命令,自定義AI就在這裏添加。

 

可以看出,兩個類一抽象、一具體,橫版小遊戲大都採用這種設計思路。


二、建立一個UC新工程

 

工具:VS2008或VS2010 nFringe合適版本

 

見風之神韻教程前兩章,直接傳送門:

 

http://v.youku.com/v_show/id_XNTA1OTY0ODky.html

 

http://v.youku.com/v_show/id_XNTA1OTY2NTAw.html


三、UC基礎類、文件系統解析

 

官方文檔說明:http://apacudn.epicgames.com/Three/UnrealScriptFoundationsCH.html

 

現在你已經有了一個新工程,對文件目錄應該還不太清楚,我來說明:

 

E:\UDK\UDK-2012-10是我的UDK目錄

 

E:\UDK\UDK-2012-10\Development\Src是UDK腳本文件夾

 

這裏有好多文件夾,不用擔心我們基本都用不到他們,但我要說明其中一些文件夾,因爲有助於我們理解整個UC架


構。

 

Core中存放了核心類(抽象的),Object是UC一切其他類的超類(父類),這裏你看不到關於遊戲的影子。

 

Engine中存放了繼承自Core的遊戲元素類,如Actor、ActorFactory、Light、Material、Pawn、GameInfo等,理論


上,繼承這個目錄內的類來開發遊戲是可行的,但代價巨大,因爲類還是太抽象。

 

UDKBase中存放了繼承自Engine和其他文件目錄的類,可以理解爲專門爲UDK的開發而建立的工程,UDK的Demo裏


除了射擊遊戲(UTGame)外,還有移動、漫遊等其他項目,都涵蓋在這一目錄下。

 

UTGame中存放了我們最常接觸的射擊遊戲的類繼承自UDKBase工程,作爲新手,我們的工程也將繼承自這裏。重要


的類:UTGame、UTPawn、UTWeapon、UTVehicle、UTProjectile,他們的實際意義跟類名完全一樣,我的遊戲開發


用到的類比這些還少,個人UC開發就是這麼簡單

 

UTGameContent中存放的是UTGame的一種擴展,在不影響UTGame的基礎上開發,這也體現了一種設計思路,事


實上,我們新建工程的目的就在於此,概括一下里面類的作用:定義拾取物、載具、載具彈藥等,儘管我沒用過老版


本,但我猜測老版本的滑板就在這一目錄下,那一直是我認爲很酷的一個東西。

 

總結:UC目錄和類的設計充分體現了OOP的特點,甚至對於豐富編程經驗的人來說,無限實踐了設計模式。但對於


新手來說,理解這些好像意義不大,事實也正是如此,(不要噴,如果將來有一天你轉行或者踏入碼農這一領域,再


來看這一部分你會頂我)下面來看具體類的內容和作用吧。


四、遊戲類型、自定義初始武器


UTGame->ShootGameInfo指出了倆個類,以及繼承關係,UTGame實際就是UDK裏的遊戲類型(本質上是一個


類),並指定一些重要遊戲信息,ShootGameInfo是我的工程的遊戲類型。


code:


class ShootGameInfoextends UTGame;


///方法意義:更改初始武器,替換掉林肯槍,這裏涉及武器庫概念,UDN

simulatedfunction AddDefaultInventory(pawn PlayerPawn )

{

         local int i;

         for(i=0; i<DefaultInventory.Length; i++)

         {

                   if(PlayerPawn.FindInventoryType( DefaultInventory[i] ) ==None)

                   {

                            PlayerPawn.CreateInventory(DefaultInventory[i],(i > 0));

                   }

         }

         PlayerPawn.AddDefaultInventory();

}

 

DefaultProperties

{

         DefaultPawnClass=class'ShootGame.UDNPawn_UpDown'

         PlayerControllerClass=class'ShootGame.UDNPlayerController_UpDown'

         Acronym="IT"

    MapPrefixes[0]="IT"

         DefaultInventory(0)=class'ShootGame.ShootWeap_LinkGun'   

}


DefaultProperties裏是設置本類的默認屬性 

 

DefaultInventory(0)=class'ShootGame.ShootWeap_LinkGun'(ShootGame是我的工程名)


simulatedfunction AddDefaultInventory()是一個方法 ,simulated指出此方法繼承自父類,通過VS的搜索功能,你


能找到這個方法的全貌


ShootGameInfo改變的信息:玩家Pawn類型,玩家PawnController類型,玩家初始武器。


五、玩家角色、自定義視角、自定義角色模型


UTPawn->UDNPawn_UpDown 


UDNPawnUpDown是我的遊戲角色類型


官方相機視角:http://udn.epicgames.com/Three/CameraTechnicalGuideCH.html


關於視角網上教程比較多,我的遊戲視角是融合了第三人稱視角、和自上而下視角,代碼較雜,不發了。


自定義角色模型:


//在你的角色類裏聲明以下變量

var SkeletalMeshdefaultMesh;

var AnimTreedefaultAnimTree;

var array<AnimSet> defaultAnimSet;

var PhysicsAssetdefaultPhysicsAsset;

 

//加入這個方法,這就是設置角色模型、動畫的方法

simulated functionSetCharacterClassFromInfo(class<UTFamilyInfo>Info)

{

         Mesh.SetSkeletalMesh(defaultMesh);

         Mesh.SetPhysicsAsset(defaultPhysicsAsset);

         Mesh.AnimSets=defaultAnimSet;

         Mesh.SetAnimTreeTemplate(defaultAnimTree);

 

}

//默認屬性里加入UDK裏資源文件的路徑

defaultproperties

{

         //這裏是骨架模型文件地址(綁定的骨骼各名稱要和UDK默認的一樣)

         defaultMesh=SkeletalMesh'CH_Man.Mesh.SK_Male'

         defaultAnimTree=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'

         defaultAnimSet(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale'

         defaultPhysicsAsset=PhysicsAsset'CH_AnimCorrupt.mesh.SK_CH_Corrupt_Male_Physics'

}


完成!


六、自定義武器、彈幕遊戲基礎


自定義武器:


官方武器指南:http://udn.epicgames.com/Three/WeaponsTechnicalGuideCH.html


優酷的yellowy-UDK自定義武器


看完這倆個對UTGame的武器就熟悉了:機制、模型、音效、特效。


再通過看UTWeapom的defaultproperties裏的屬性名稱加不斷測試你會更加自由的開發武器。


彈幕遊戲基礎:


UC裏生成Actor的函數是Spawn()


UTWeapom裏生成一個彈丸的語句:


SpawnedProjectile =Spawn(GetProjectileClass(),,, RealStartLoc);


通過重新構造我們的射彈函數,來生成多個子彈,code:


simulated functionProjectileFire(){

                localint n;

                localint range;

                localint i;

            localrotator MyRot;

          localUTProj_LinkPlasma MyShockBall;

                local vector    RealStartLoc;

                   n=3;

                   range=3072;

                   RealStartLoc =GetPhysicalFireStartLoc();

                   MyRot=GetAdjustedAim(RealStartLoc );

                   MyRot.Yaw-=range/2+range/(n-1);   

        for(i=0;i<n; i++)

        {

                            MyRot.Yaw+=range/(n-1);

                            MyShockBall=spawn(class' UTProj_LinkPlasma ',/*self*/,,(RealStartLoc)/*Location*/);

                            MyShockBall.Instigator=UTPawn(Instigator);

                            MyShockBall.Init(Vector(MyRot));

            }

}


以上代碼實現了一槍發出3個彈丸,除了擊發多個彈丸,彈丸本身的屬性也非常重要,通過對自定義武器的學習,你


應該有信心獨自開發自定義彈丸了吧。


七、自定義按鍵、鷹眼功能的實現


自定義按鍵:


http://udn.epicgames.com/Three/KeyBindsCH.html


http://hfun.me/udk-input-custom-keybinds.html


鷹眼功能:


此功能實際就是減緩遊戲速度,核心代碼:


WorldInfo.Game.SetGameSpeed();


配合自定義按鍵,輕而易舉實現本功能。




發佈了25 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章