基本介紹
基本特性,設計目標,類,概述,類關鍵字,變數,變數類型,可編輯性,數組,動態數組,
基本特性
Unreal Script是由Epic Games為了適應遊戲編程的自然需要和細微差別而為虛幻系列引擎創建的一種的類C/JAVA語言.
設計目標
UnrealScript的主要設計目標是:
支持傳統程式語言沒有解決的時間,狀態,屬性的網路化。這大大簡化了UnrealScript的代碼。編寫基於人工智慧和遊戲邏輯的程式,主要運用事件互動技術,這些事件採取一定的遊戲時間完成,並且事件非常依賴對象狀態,這讓網路化問題極度複雜化。在c/c++中書寫、理解、維護和調試這樣的代碼是非常困難的。UnrealScript天生支持時間、狀態、網路複製大大簡化了遊戲編程。
提供Java編程風格,簡單、基於對象的、編譯時錯誤檢查的特性。就象Java為Web程式設計師帶來了清晰、簡潔的編程平台一樣,UnrealScript為3D遊戲程式設計師提供了一個同樣清晰、簡潔、可靠的程式語言。從Java繼承的主要編程概念如下:
具有自動垃圾收集的無指針環境;
一個簡單的類單一繼承機制;
強壯的編譯時類型檢查;
安全客戶端執行的“沙盒”;
熟悉的c/c++/java代碼外觀和感受;
提供遊戲對象豐富的高層互動,而不是底層的位和像素。在設計權衡時,由於UnrealScript工作在對象互動層,而不是底層的位和像素,因此在UnrealScript中,犧牲了性能選擇了簡單性和功能。而在底層和性能的關鍵代碼是用c/c++寫的,在這些地方增加性能獲得的好處超過了增加複雜性得到的壞處,選擇了性能犧牲了簡單性和功能。
類
概述
每個腳本檔案對應一個類,以class聲明為開頭,後面是類的父類和類的相關信息。簡單的例子如下:
class MyClass extends MyParentClass;
這裡聲明了一個名稱為“MyClass”的新類,這個類繼承了“MyParentClass“的所有功能。此外類駐留在名為”MyPackage“的包中。
在UnrealScript中設計一個新類(例如一個牛頭人怪物)的典型的做法是,從具備你需要的功能的已有類(例如,Pawn類,所有怪物的基類)繼承。
通過這樣的做法,你永遠都不用重新發明輪子--可以簡單的添加新功能,你可以在自定義的同時保持不需要定製的現有功能。這種做法特別適合從虛幻中繼承AI,內置的AI系統提供了大量的基本功能,同時你還可以建立自己的生物。
類關鍵字
Native(包名稱)(本機類)
NativeReplication
表示這個類的變數複製處理在c++中實現。只能用於native類。
DependsOn(ClassName[,ClassName,....])(依賴於)
表示ClassName是在這個類前編譯。ClassName必須和這個類處於同一個包或者前一個包。可以用一個DependsOn指定多個依賴類,他們用逗號隔開。也可以使用多個DependsOn指定。
Abstract
Deprecated(過時的)
類的所有對象被載入但不保存。當關卡設計師在關卡設計器中載入包含過時活動對象被的地圖時,他們會收到編輯器的警告信息。這個關鍵字會對其子類產生作用。
Transient(瞬態)
表示該類的對象不應該被保存在磁碟上,這和一些非持久性的本機類自然結合是有用的。比如播放器和視窗。這個關鍵字會對其子類起作用;子類能使用NotTransient關鍵字重寫它。
NotTransient(非瞬態)
表示不從基類繼承Transient關鍵字標註的瞬態特性。
Config(IniName)(配置)
表明這個類允許訪問ini檔案中的數據。如果在類中有可配置變數(使用config和globalconfig申明),這可以讓類訪問那些保存在指定的配置檔案的變數。這個標誌將被傳播到所有子類並且不能被否定,但是子類可以通過config關鍵字指定不同的配置檔案。通常IniName指定ini檔案的名稱去存儲數據,但有些名字具有特殊意義:
Config(Engine):用於引擎配置檔案,通過你的遊戲名稱追加"Engine.ini"。例如,ExampleGame遊戲的引擎配置檔案名稱稱是"ExampleEngine.ini"。
Config(Editor):用於編輯器配置檔案。通過你的遊戲名稱追加“Editor.ini"。例如,ExampleGame遊戲的編輯器配置檔案名稱稱是"ExampleEditor.ini"。
Config(Game): 用於遊戲配置檔案。通過你的遊戲名稱追加"Game.ini"。例如,ExampleGame遊戲的配置檔案名稱稱是 ExampleGame.ini。
Config(Input):用於輸入配置檔案。通過你的遊戲名稱追加“Input.ini“。例如,ExampleGame遊戲的輸入配置檔案名稱稱是ExampleInput.ini。
PerObjectConfig:類的每個對象的配置信息都會被保存在配置檔案中。每個對象在配置檔案中都有一個如下格式的配置節[ObjectName ClassName]。這個關鍵字會對其子類起作用。
PerObjectLocalized
類得本地化數據將被定義在每對象得基礎上。每個對象在已命名得本地化檔案中有個如下格式得節[ObjectName ClassName]。這個關鍵字會對其子類起作用。
EditInlineNew
編輯器,表示這個類的對象能從虛幻便捷器的屬性視窗創建(默認行為是可以通過關聯的屬性視窗引用已經存在的對象)。這個關鍵字會對其子類起作用。子類可以使用NotEditInlineNew關鍵字重寫它。
NotEditInlineNew
Placeable(可放置)
編輯器。表示這個類可以通過虛幻編輯器放到關卡,UI場景,或者kismet視窗(由類的類型定)。這個標誌將被傳播到其所有子類中;子類能通過NotPlaceable關鍵字重寫它。
NotPlaceable
編輯器。不從基類繼承NotPlaceable關鍵字。表示這個類不能在虛幻編輯器中放入關卡。
HideDropDown
編輯器。防止這個類在虛幻編輯器的屬性視窗的組合框中顯示。
HideCategories(Category[,Gategory,......])
編輯器。表示這個類的對象在虛幻編輯器的屬性視窗中隱藏一個或多個類別。使用無類別聲明可以隱藏變數,使用類名稱聲明變數的名稱。
ShowCategories(Category[,Category,......])
編輯器。不從基類繼承ShowCategories關鍵字。
AutoExpandCategories(Category[,Category,......])
編輯器。指示一個或多個類別在編輯器的屬性視窗中自動展開。使用無類別聲明可以自動展開變數,使用類名稱聲明變數的名稱。
Collapsecategories
編輯器。表示類的屬性不應該在虛幻編輯器的屬性視窗類別中被分組。這個關鍵字會對其子類起作用;子類可以用DontCollapsecategories關鍵字重寫它。
DontCollapsecategories
編輯器。表示不從基類繼承Collapsecategories。
Within ClassName
高級。表示類的對象離不開ClassName的實例。為了建立這個類的對象,您必須指定作為外部對象ClassName的實例。這個關鍵字必須作為class申明的後的第一關鍵字。
Inherits(ClassName[,ClassName,......])
高級,使用多繼承。只是適用於native類。不支持從多個UObject類繼承。
Implements(ClassName[,ClassName,......])(實現)
高級。指示類實現的多個接口。只有nataive類可以實現native接口。
NoExport
變數
變數類型
內置類型 (Built-in types)
這裡有一些在 UnrealScript 中宣告變數的例子:
var int a; // 宣告一個名稱為"A"的整數變數。
var byte Table[64]; // 宣告一個長度64的靜態 1-byte 陣列。
var string PlayerName; // 宣告一個名稱為"PlayerName"的字串變數。
var actor Other; // 實體化 Actor 類別,並命名為"Other"。
var() float MaxTargetDist; // 宣告一個名稱為"MaxTargetDist"的浮點數變數,並且它的值可以從 UnrealEd 的屬性視窗中修改。
變數在 UnrealScript 能出現在兩種地方:實體變數,它可以在整個類別內使用,在宣告完類別或 struct 後立即出現。局部變數,出現在函式中,只有在函式執行時有效。實體變數使用關鍵字var 宣告。局部變數用關鍵字 local 宣告,例如:
function int Foo()
{
Count = 1;
return Count;
}
但在聲明局部變數的時候,必須在聲明全部局部後,才能編寫功能函式.
以下是 UnrealScript 中支持的內置變數類型:
byte: 1-byte 值,範圍從 0 到 255。
int: 32-bit 整數值。
bool: 布林運算值: 不是 true 就是 false。
float: 32-bit 浮點數值。
string: 一個字串(see Unreal Strings)。
constant: 不能修改的變數。
enumeration: 一個能夠代表多個預先設定的整數值中的其中一個值。例如:在 Actor 內定義為 enumeration 的變數ELightType 描述了一個動態光源,它的值可以像 LT_None、LT_Pulse、LT_Strobe,等等...。
可編輯性
在UnrealScript中,你可以使一個實例變數變得可編輯,以便用戶可以在UnrealEd中編輯變數的值。這個機制負責了UnrealEd 的"Actor Properties(Actor屬性)"對話框的全部內容: 您在那裡所看到的全部內容僅是UnrealScript中的一個聲明為可以編輯的變數。
聲明一個可以編輯的變數的語法如下所示:
var() int MyInteger;
var(MyCategory) bool MyBool;
您也可以聲明一個變數為 editconst ,這意味著這個變數將可以在UnrealEd中看見但 不 可以編輯。注意這僅僅是為了防止變數在編輯器中被改變而不是在腳本中。如果您想使一個變數為真正的 const 但是仍然可以在編輯器中可見,您必須聲明它為 const editconst :
var(MyCategory) editconst bool MyBool;
var(MyCategory) const editconst bool MyBool;
var(MyCategory) const bool MyBool;
數組
數組使用以下語法聲明:
var int MyArray[20];
UnrealScript僅支持一維數組,但你可以通過自己來設定 行/列 的數學處理來模擬多維數組。
動態數組
為了適應數組元素變化的需要,動態數組提供了一種使靜態數組具有在運行時改變元素數量的功能的方法。如果想使用動態數組,我們需要知道幾件事情。
首先是變數的聲明。聲明一個動態數組和聲明其它的unrealscript變數是非常相似的(也就是var/local 類型 變數名 )。 對於動態數組,類型可以使用關鍵字 array 來指定,後面跟著由尖括弧括起的數組類型。 如果數組類型也包含尖括弧(比如 class<Actor> ),你必須在類型的結束括弧和數組的結束括弧之間加入空格,否則編譯器會把這兩個結束括弧作為 >> 操作符來處理。比如:
var array<int> IntList;
聲明一個類型為 class<PlayerController> 、名稱為Players的動態數組:
var array<class<PlayerController> > Players;
當腳本開始運行時,IntList將從0元素開始。動態數組所支持的方法允許我們向數組中添加元素、取出元素及任意地增加或降低數組的長度。調用這些方法的語法是(使用我們的IntList為例子): IntList.MethodName() 。以下是動態數組提供的方法:
◆Add(int Count): 通過使用 Count 來擴展數組的長度,和FArray::AddZeroed()一樣。
◆Insert(int Index, int Count): Index_是插入元素的索引位置, _Count 是插入的元素數量。任何在那個位置存在的元素將會被上移,將會創建新的元素並把它們插入到指定的位置。在索引為3的位置插入5個元素將會使數組中從索引3 開始的所有元素都會被上移5位。現在放在索引3出的元素將會被放置到索引8,元素4將是元素9等等。* Remove(int Index, int Count):_Index_ 是指從何處開始移除元素的索引, Count 是要移除的元素的數量。 新增加的元素都被初始化為默認值(除了structs包含structdefaultproperties外,其它所有元素將被初始化為 0/空)。
◆Remove(int Index, int Count): 這裡 Index 是從其開始刪除元素的數組索引, Count 是要刪除的元素的數量。
這允許我們從數組中任何有效的索引開始來移除數組中的一組元素。注意任何高於將被刪除的範圍的索引將會改變它們的索引值,如果您存儲索引值到一個動態數組中時請記住這一點。
◆AddItem(Item): 在數組的末尾增加一個元素 Item ,從而是數組的長度加1。
◆RemoveItem(Item): 使用線性搜尋來刪除任何元素實例 Item 。
◆InsertItem(int Index, Item): 將元素 Item 插入到數組中的索引 Index 處,從而是數組的長度加1。
◆Find(...) - 查找一個元素在數組中的索引。有兩個Find函式版本: 標準的查找函式是匹配所有的元素值,另一個專用版本的查找函式是基於struct的一個單獨屬性值來匹配一個struct。
-Find(PropertyName, Value): PropertyName 是在struct中用於搜尋的屬性名稱(必須是'Name'類型), Value 是要搜尋的值。 返回在數組中第一個匹配指定的屬性名 PropertyName 的值的struct的索引,如果沒有找到,返回-1。 Value 可以是任何有效的表達式。
◆Sort(SortDelegate): 使用 SortDelegate 來適當地對數組的內容排序。 SortDelegate 的簽名應該和以下顯示的一樣:
-delegate int ExampleSort(ArrayType A, ArrayType B) { return A < B ? -1 : 0; } // 一個負數返回值預示著應該交換這些項。