我的作品: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();
配合自定義按鍵,輕而易舉實現本功能。