Monday, September 24, 2012

UDK-Toturial-CH2.UnrealScriptBasic

1.How to Print a log
2.Script Usage
3.Unreal Game Flow

A. Print a Log on Screen
新增一個Script: GameActor.uc

Class GameActor extends Actor placeable;

Function PostBeginPlay()
{
super.PostBeginPlay();
`log("************************Hello World ******************");
}

DefaultProperties
{
Begine Object Class=SpriteComponent Name=Sprite
Sprite=Texture2D’EditorResources.S_NavP’
End Object
Components.Add(Sprite)
}














UnrealScript是一個Actor Based Programming,其中所有在Unreal Engine最基本是Actor,因此必須繼承Actor,在extends Actor 之後,有個Keyword:placeable,當這關鍵出現之後,它會出現在Editor 裡面的Actor Classes裡面會出現GameActor

Placeable:才能直接被拖拉,若沒有時,只能用Script之間自己溝通,無法在Actor Classes看到和拖拉使用,程式當有必須要給Level Designer 做修改參數與位子時使用Placeable方便許多。
PostBeginPlay:當繼承過Actor後,有一些可以Overriding Function可以使用,PostBeginPlay是當Actor出現後,會去執行一次的Function(在Untiy3D 的Script,功能就跟Start Function 是一樣)。
Script Unity3D UDK
Overriding function
Initialize Awake() PreBeginPlay()
Start Start() PostBeginPlay()
Update Update
FixedUpdate
Tick(float DeltaTime)
PlayerTick(float DeltaTime)
PS:one parameters

Overloading function
Same as C# Keyword: Optional
Function Do(int a,Optional bool b)
{
…….
}
Call:
Do(1);
Do(1,true);







其中super.PostBeginPlay(); ,是呼叫上層Actor所做的事情,`log()在程式上追蹤參數的變化和執行結果,其結果都會顯示在UDK Editor裡的Log,方便做程式碼檢測。
DefaultProperties{}:在UDK如果要新增Component則必須寫在DefaultProperties,同時數值初始化也必須要在這裡設定,這裡Component的概念跟Unity3D是一樣的,當一個Actor沒有任何Component在顯示上是一個空的Actor(在Unity3D裡如同Empty 的GameObject),只有座標,因此為了那Actor能夠視覺化被看到,因此使用SpriteComponent,如果要顯示3D物件可能需要StaticMeshComponent、DynamicLightEnvironmentComponent增加光影效果等。在這裡先以SpriteCompoent,Name則是可以自己定義命名,Sprite=Texture2D’ EditorResources.S_NavP’圖片位置,UDK都是以Package為單位,可以打開Content Brower 去尋找這圖片位置。在End Object 之後要把Components新增上去Components.Add(name)。
接著Compiler後開啟Editor。
開啟Content Browser->Actor Classes,Show Categories取消打勾。
 
 

 
 
 
將GameActor放入場景中
 

 
按下Play後再Esc取消,接著看Editor 的log,看ScriptLog那一行
 

 
出現了PostBeginPlay裡的log字,以上驗證了Script有被執行且把一張2D貼圖顯示在遊戲上,確保順利Complier成功。
B. Script Usage:
Enum:用來列舉物體所以狀態,在程式碼辨識上相對容易且易整理。
class GameActor extends Actor
placeable;
enum ObjectState
{
Attack,
Idle,
Chase
};
var ObjectState enemyState;
function PostBeginPlay()
{
enemyState=Idle;
super.PostBeginPlay();
`log("EnemyState:" @enemyState);
}
DefaultProperties
{
Begin Object Class=SpriteComponent Name=Sprite
Sprite=Texture2D'EditorResources.S_NavP'
End Object
Components.Add(Sprite)
}





















Result:
[ScriptLog]: EnemyState: Idle
Array:
UnrealScript的Array是從0開始因此當設定為4時,總長度是0、1、2、3。
var int testArray[4];
testArray[0]=1;
testArray[1]=2;
testArray[2]=3;
testArray[3]=4;
testArray[4]=5; Error
印出log方式可用 `log(“TestArray:” @ testArray[0] @ testArray[1]…);
DynamicArray:
動態陣列在遊戲中常常使用的東西,可以根據你的需要改變陣列長度,當不確定陣列大小時使用動態陣列是最好的時機。
var array<int> dynArray;
dynArray[3]=3;
`log(“DynamicArrayLength:” @dynArray.length);
[ScriptLog] DynamicArrayLength:4
即使直接給予dynArray[3]值,長度仍然為4,其[0],[1],[2]值皆為0。
Var:
如果要在Editor上進行數值的修改,不想透過程式去改變。
var() int PlayerHP;
`log(“Player’s HP:” @PlayerHP)
DefaultProperties
{
PlayerHP=100
}
[ScriptLog] PlayerHP:100

 
在Editor裡,打開Properties 可以看到Script設定的PlayerHP。
C. UnrealScript Game Flow
+The engine is initialized
|--+The engine loads a map
|--The GameType is Set
|--+GamePlay is initialized
| |---GameInfo:InitGame() is called to initialize the gametype.
| |---Actor::PreBeginPlay() is called to Initialize all Actors.
| |---Actor::PostBeginePlay() us called to Initialize all Actors.
|---+ A Player joins
|---GameInfo::Login() is called on the gametype to handle spawning the player
|---GameInfo::PostLogin() us called on the gametype to handle the new player


1.Startup Movies
當遊戲開始時,會載入一小段影片,像是Powered By Unreal ,當然可以新增加影片到遊戲Title,修改DefaultEngine.ini裡的[FullScreenMovie] +StartupMovies=UDKFrontEnd.udk_loading
2.Map Load
3.Entry Map
如果有執行過範例,一開始都會讀取選單,這選單也是一個UDK Scene檔,可以在DefaultEngine.ini裡的[URL] Map=UDKFrontMap.udk 修改選單。
4.Loading Screen
在讀取關卡時,會產生Loading Screen會被顯示,這也可以放入自行的影片[FullScreenMovie] +LoadMapMovies=UDKFrontEnd.udk_loading
5.Game StartUp
開始遊戲場景
6.Script Process
GameInfo:GameInfo Function InitGame()比其他Script執行順序最為優先
event InitGame(string Options,out string ErrorMessage),同時遊戲的GameType也在這裡被定義。
PreBeginPlay:所以ActorsPreBeginPlay() function皆被執行,而且是在gameplay剛開始前執行。
PostBeginPlay:可以在這尋找場景上其他的Actors,在PreBeginePlay 被執行後才會執行。

7.Player Creation
PlayerCreation是在GameType裡被執行的(GameInfo clss),處理loggin in 的流程,像是多人連線所,線上多人連線、單人連線,其中login process被分坐數個階段,PreLogin、Login、PostLogin
PreLogin:允許玩家進入遊戲。
Event PreLogin(string Options,string Address,out string ErrorMessage)
Login:決定被需要被玩家控制的腳色和功能。
Event PlayerController Login(string Portal,string Options,const UniqueNetID UniqueID,out string ErrorMessage)
PostLogin:當玩家成功進入遊戲,可以在這裡做人物初始化。
Event PostBegin(PlayerController NewPlayer)
8.Match Start
9.End Game













Reference
GameType Technical Guide:這裡可以知道那些GameInfo 可以被設定使用,其中使用UnCodeX compiler出來的HTML也可以進行查詢。

No comments:

Post a Comment