(轉載)虛幻引擎3--第二章: UNREALSCRIPT的初級學習(UNREALSCRIPT BAPTISM BY FIRE )

 

第二章: UNREALSCRIPT的初級學習

不管您是第一次開始學習編程或者只是簡單地學習一種新的語言,開始一個新的學習旅程的想法均可能有點使人畏懼。使用UnrealScript進行編程須要您具備不少方面的知識,其中有幾個是很是複雜的。在咱們深刻了解UnrealScript以前,咱們將經過建立很是簡單的腳原本對它提有一個初步的認識。這裏咱們將不會深刻地介紹在建立腳本過程當中使用的概念。可是,本章爲您提供了一個機會使您熟悉從計劃到實現以及到實施的過程當中建立腳本的過程,它向您展現了UnrealScript實現您的想法的強大威力。儘管這個練習中沒有必要介紹UnrealScript語言的相關知識,但咱們仍然須要介紹一些基本概念以即可以進一步學習。html

 

2.1基本語法

UnrealScript開發人員想開發一種對於C++和Java程序員來講都熟悉的語言,因此當設計語言時,他們以C語言的風格來建立它。全部這些意味着它和這些語言具備相似的語法,好比使用分號終止一個語句(一行代碼),而且使用花括號({ })來包含一組語句。java

當咱們書寫代碼時,咱們本質上是在不斷地重複幾組標示符、關鍵字、操做符及註釋來建立咱們想要的功能。讓咱們對這些概念中的每個都有一個簡單的認識。程序員

 

標識符和關鍵字

修飾符是程序員爲他們想引用的項所取的名稱,好比類、變量及函數名。在UnrealScript中,全部的修飾符都是大小寫不敏感的,這意味着RegenPerSecond、REGENperSECOND和 ReGeNpErSeCoNd都被認爲是同一個標識符。編程

當提到標示符名稱時,有幾個須要知道的規則:數組

1. 全部的標示符必須以字母或下劃線(_)開始。網絡

2. 後面能夠跟隨任何字母、數字或下劃線的組合物。併發

3. 標識符不能包含空格。編輯器

4. 標示符不能和關鍵字同樣。ide

有效標識符的幾個例子:函數

 

無效標識符的幾個例子:

 

關鍵字是編譯器保留的特殊單詞,它們對應着特定的功能。在咱們的示例腳本中,咱們看到了幾個不一樣的關鍵字:class function var defaultproperties。和標識符同樣,關鍵字也是大小寫不敏感的。

 

表達式和操做符

表達式是一組值、操做符和分組符號構成的一個實體,當計算表達式的結果時將會產生某些能夠存儲的有意義的值。這裏是一個示例表達式列表:

 

操做符是特殊的函數,它能夠操做每項的值,稱爲操做數;操做數是表達式的主要部分,由於全部的重要的表達式都會使用它們。咱們在上面的示例表達式中看到了一些操做符:+ () *。

操做符和表達式是任何程序的必要部分。一樣,在稍後的一章將會對其進行詳細的介紹。目前,這裏爲您提供了是您能夠繼續進行本章剩餘部分所須要的必要的知識。

 

註釋

註釋用於爲您的源代碼提供文檔,編譯器將徹底地忽略它們。一般,有時候它們用於描述函數及它們的參數的做用。當在一個項目上進行合做時,註釋是很是重要的,由於經過註釋其它程序員能夠很容易地閱讀和理解代碼。若是代碼沒有適當的文檔及解釋,那麼從代碼建立後很長時間過去後,那寫代碼對於其餘人甚至它的做者來講都是使人難以理解的。

註釋的另外一個應用是在測試和調試期間。代碼的一部分能夠被「註釋掉」,這意味着這段代碼將不會再被識別及執行。這個方法能夠用於查找代碼中存在問題的部分或者用於查看代碼中相似的兩部分之間的區別。爲這個目的使用註釋時能夠免除刪除及從新書寫代碼帶來的麻煩,從而使得整個過程更加簡單更加有效。

UnrealScript支持兩種類型的註釋結構:

 

行註釋是指以一對正斜槓(//)開始一直到達了行的尾部爲止。塊註釋告訴編譯器忽略在開始(/*)和結束(*/)註釋標記之間的任何內容。

這裏是當添加腳本時,咱們的示例腳本樣子:

 

 

2.2再生MUTATOR(設置方法)

在接下來的幾部分中,您將會建立一個新的MUTATOR(設置方法)。Unreal中的MUTATOR(設置方法)是指以某種方式改變標準的遊戲函數的腳本。這能夠是像把地圖中的全部武器替換爲火箭發射器那樣簡單或者它也能夠涉及到更多的內容,好比該把玩家的視圖從第一人稱改成第三人稱。在咱們的示例中,咱們將使用設置方法來是玩家的生命值在打遊戲過程當中每秒從新生成指定量的生命值。

正如前一章所說的,ConTEXT是這本書中全部實例和指南使用的文本編輯器。若是您打算使用ConTEXT,請確保您已經根據附錄B設置了它:爲虛幻引擎3設置ConTEXT。若是您打算使用WOTGreal,請參照附錄C:爲虛幻引擎3設置WOTGreal。

 

設計類的計劃

在書寫任何代碼以前,咱們爲腳本真正應該作的事情建立一個詳細的計劃是很重要的。咱們已經說過mutator(設置方法)應該在每秒中從新生成玩家的生命值。這是一個好的開始,可是咱們要問一些更多的能夠幫助咱們實現這個功能的問題。

 

  • 咱們怎樣從新生成生命值?
  • 要從新聲稱全部玩家的生命值嗎?包括機器人?
  • 每秒鐘應該從新生成多少生命值?
  • 這個值是能夠配置的嗎?
  • 直到生命值到達哪一個點時才中止從新生成生命值?
  • 有沒有不該該從新生成生命值的狀況?

在這個實例中,咱們將會讓mutator(設置方法)從新生成玩家控制的全部角色的生命值,可是機器人除外。最簡答的實現這個功能的方法是使用具備從新生成功能的Pawn類替換調遊戲中的Pawn。當玩家處於一個用於引起痛苦的體積中時,則不能從新生成生命值,因此在設計mutator(設置方法)時應該考慮到這個情況。

 

指南 2.1 –研究再生Mutaor(設置方法)

這時,咱們須要進行一些研究。在進行實際的編碼以前咱們須要解決幾個問題。第一,咱們須要某種方法來使用咱們的處理再生的類替換遊戲中全部玩家。第二,咱們須要找到任何條件下容許玩家能夠擁有的最大生命值或者表明這個值變量。最後,須要某種用於斷定玩家是否在引發痛苦的體積中的方法。

當嘗試查找特定的信息片斷時知道從哪裏找到一般是很難的。您會發現隨着您對Unreal類的熟悉,您即可以更加容易地查找到您想找到的東西。

1. GameInfo處理關於遊戲類型方面的功能。這裏是開始尋找使用咱們本身的類來代替遊戲中使用的默認pawn類的方法的最好的地方。找到位於../Engine/Classes目錄中的GameInfo.uc腳本並打開它。

2. 大多數狀況下,使用文本編輯器中內置的搜索功能來定位特定關鍵字是一種查找您想要的東西的最好方法。由於咱們正在想設計遊戲中的全部Pawns使用那個類,因此PawnClass將是用於搜索的較好的關鍵字。確保您是從文檔的頂部開始搜索是很重要的,這樣您便不會忽略任何東西。

圖片 2.1 – 搜索GameInfo 類獲取關鍵字「PawnClass」的查找文本對話框

3. 首先經過按下Ctrl + F鍵,執行一次針對關鍵字PawnClass的Actor類搜索。在Find Text (查找文本)對話框的Find What(查找)文本域中輸入關鍵字「PawnClass」。同時請確保選擇了From the top(從頂部開始)選項。

第一個匹配值是:

var class DefaultPawnClass;

這看上去正好是咱們正在查找的東西。經過在mutator(設置方法)中覆蓋這個變量的值,咱們將可使遊戲使用咱們從新生成的Pawn類。如今咱們已經解決了第一個問題,接下來咱們須要關注其它的信息。

4. 當處理玩家時,開始查找答案的第一個位置是UTPawn類的腳本。這個虛幻競技場3中的玩家-和AI-控制的人物的類。在../UTGame/Classes目錄中找到UTPawn.uc腳本並打開它。

5. 開始經過按下Ctrl + F來執行搜索。在Find what(查找內容)文本域中輸入關鍵字「Health」並選擇From the top(從頂部開始)選項。按下Find(查找)來開始搜索。

圖片 2.2 –搜索UTPawn 類來查找關鍵字「Health」的Find Text (查找文本)對話框

搜索到的第一項應該是:

var int SuperHealthMax; /** Maximum allowable boosted health (容許的增長的最大生命值)*/

這正是咱們要找的。經過掌握這些信息,咱們如今能夠繼續搜索咱們書寫腳本所須要的最後一條信息。

6. 若是您沒有任何Unreal經驗,不管是關卡設計或腳本編寫經驗,那麼知道這最後的搜索要查找的東西多是都困難的。體積是Unreal中使用的一種用於定義一塊空間區域的方法。某些體積,尤爲是PhysicsVolumes能夠影響它們包圍的控件的物理屬性而且能夠經過使用bPainCausing屬性使得在它內部的任何玩家遭受痛苦。知道了這點知識後,咱們能夠設計一個使用關鍵字bPainCausing的搜索。從UTPawn類中開始搜索是有意義的,可是咱們的搜索卻沒有得到任何有用的東西。因而咱們開始移動到下一個選擇Pawn類的父類進行搜索。

打開位於../Engine/Classes目錄中的Pawn.uc腳本。

7. 再次,按下Ctrl + F來執行搜索。在Find what(查找內容)中輸入「bPainCausing」關鍵字,並選擇From the top(從頂部開始)選項。而後按下Find(查找)開始搜索。

圖片 2.3 –搜索Actor類來查找關鍵字「PhysicsVolume」的Find Text (查找文本)對話框

8. 此次搜索的第一個匹配項顯示瞭如下信息:

 

再次,咱們又找到了咱們要找的東西。

當咱們具備了適當的可靠計劃和必要信息後,咱們能夠開始書寫咱們的再生mutator(設置方法)的代碼了。

 

指南 2.2 –初始化PAWN類設置

1. 若是ConTEXT尚未打開,打開ConTEXT。

2. 爲了開始書寫自定義的Pawn類的代碼,咱們須要作的第一件事情是新建一個腳本文件。從File(文件)菜單中選擇New(新建)或按下工具條上的New File(新建文件)按鈕。

圖片2.4 –New File(新建文件)按鈕

3. 使用Select Active Highlighter(選擇激活的文件輪廓)下拉列表中爲這個文件選擇UnrealEd 或 UnrealScript輪廓。您能夠根據您安裝的輪廓和您的我的喜愛來選擇輪廓。

圖片 2.5 – Select Active Highlighter(選擇激活的文件輪廓)下拉列表

4. 如今咱們開始書寫代碼。任何新的腳本的第一部分都是類的聲明。這裏咱們爲腳本取一個名稱,並決定它的父類是什麼。在第一行,輸入如下信息:

class UTPawn_SuperRegen extends UTPawn;

在這行代碼中,咱們命名了咱們的類UTPawn_SuperRegen。咱們也指出了它是從UTPawn類繼承而來的。這從本質上意味着咱們的類將會包含了UTPawn類中的全部功能和咱們本身添加的任何功能。

5. 咱們將會使用一個變量來表明每秒鐘要從新生成的玩家的生命值的量。按下回車鍵兩次後在第三行輸入如下代碼:

var int RegenPerSecond;

在下一步中,將那個會給予這個變量一個初始值,可是當修改生命值時這個值實際上不會被進一步的使用。

6. 初始化類設置的最後部分設計了建立defaultproperties(默認屬性)塊。這將會用於放置咱們的類得屬性的值。按下回車鍵幾回後輸入如下代碼:

 

這裏,咱們已經指定了這個mutator(設置方法)的組的名稱以及RegenPerSec變量的初始值。

7. 那將會終止類的初始化設置。這是,代碼應該以下所示是:

 

8. 如今咱們保存腳本以便咱們的進展不會丟失。從File(文件)菜單中,選擇Save as(另存爲)…。在對話框中,您能夠打開到如下目錄之一的導航:

對於Windows XP來講:

C:/Documents and Settings/[User Name]/My Documents/My Games/Unreal Tournament 3/UTGame/Src

對於 Windows Vista來講:

C:/Users/[User Name]/Documents/My Games/Unreal Tournament 3/UTGame/Src

9. 在Src目錄中建立新的Folder(文件夾)

圖片 2.6 –Save As (另存爲)對話框中的Create New Folder (建立新文件夾)按鈕

將這個新文件夾命名爲MasteringUnrealScript。

圖片 2.7 –已經建立了一個名稱爲MasteringUnrealScript 的新文件夾

10. 打開這個目錄並建立另外一個新文件夾。命名這個文件夾爲Classes並打開它。

圖片 2.8 –已經建立了一個命名爲Classes 的新文件夾

11. 最後,輸入UTPawn_SuperRegen做爲腳本的名稱,請確保在Save as(另存爲)對話框的type(類型)文本域中選擇了UnrealScript (*.uc),而後點擊Save(保存)。

圖片 2.9 – The Pawn script has been named and is ready to be saved. 已經命名了Pawn腳本並準備保存。

固然,這是類沒有新添加的功能。咱們將會在下個指南中添加這個功能。

 

指南 2.3 –設置再生計時器

建立了咱們的新的Pawn類後,咱們須要在它內部添加功能,以便使它和標準的UTPawn類區分開來。這將包括設立Timer函數,每次執行這個函數時都會增長玩家的Health(生命值),同時也包含一個用於確保每秒執行這個Timer的方法。

1. 繼續前一個指南,在ConTEXT中打開UTPawn_SuperRegen.uc文件。

2. 在RegenPerSecond變量聲明後,經過輸入如下信息來聲明Timer函數:

 

Timers是一種特殊類型的函數,它將會在特定的時間量過去後被調用,而且能夠強制不斷地執行它。這使得它們是適合咱們的目的的理想函數。

3. 如今,咱們開始爲咱們的Timer函數添加新的功能。把鼠標光標放在開始花括號({)的後面,並按下回車鍵。而後按Table鍵來縮進這個代碼端。輸入如下代碼:

 

這段代碼乍一看可能有點複雜,可是實際上它是很是簡單的。當把它分爲幾部分時或許會更加容易理解。

 

開始是一個IF語句。它實質上是說若是圓括號內的表達式爲真,那麼將會執行放在花括號({})中的代碼。

Controller.IsA('PlayerController')

這段代碼檢測這個Pawn是不是由玩家控制的。若是是,那麼咱們將會繼續執行下一段代碼。

IsInPain()

這個表達式是檢測這個Pawn是否在引起痛苦的體積中。若是他不在(注意!標記),咱們將會繼續執行下一段代碼。

Health < SuperHealthMax

這個表達式用於檢測這個Pawn的Health(生命值)是否小於容許的最大生命值的絕對值。若是是,那麼將會執行花括號 ({})間的代碼

4. 把光標放在If語句的開始的花括號({)的後面並按下回車鍵。而後按下Tab鍵縮放這段代碼。輸入如下代碼:

Health = Min(Health+RegenPerSecond, SuperHealthMax);

這裏咱們取入了Health(生命值)的當前值和添加到它上的從新生成的量。而後把這個值和容許的最大生命值相比較,把兩個之中較小的值分配給Pawn的Health(生命值)。從本質上講,相對於容許的最大生命值,當它超過結果計算獲得的生命值時,執行再生功能。

5. 如今已經完成了Timer函數自己,以下所示:

 

6. 咱們須要一種方法來確保這個Timer在每秒都會執行,以即可以真正地執行生命值再生。先前咱們討論了計時器是一種特殊類型的函數。爲了啓動一個計時器,則必須執行另外一個稱爲SetTimer的函數。惟一須要考慮的問題是咱們在哪裏放置到這個SetTimer函數的調用,以便當遊戲開始時能夠執行這個函數?就是這樣巧合,在全部的Actors中有一個稱爲PostBeginPlay的函數,它基本會在遊戲啓動後當即執行。

如下是RegenPerSecond變量的聲明,在Timer函數的上面輸入如下代碼:

 

您或許會注意到使用了新的關鍵字Simulated。暫時請不要擔憂這個問題。它是一個必須網絡交互的關鍵字,這是一個複雜的主題,咱們將在稍後的部分對其進行詳細解釋。

7. 把光標放在PostBeginPlay函數的開始花括號({)後面並按下回車鍵。而後按下Tab鍵來縮放這部分代碼。並輸入如下代碼:

 

這個函數中的第一行說明了應該在父類中執行PostBeginPlay函數。這意味着這時將會調用PostBeginPlay的UTPawn版本。而後,第二行啓動了Timer,它將會每秒鐘執行一次,而且把它設置爲循環狀態。

8. 隨着那段代碼的完成,自定義的Pawn類應該也接近完成了。整個Pawn類以下所示:

 

9. 在ConTEXT中保存UTPawn_SuperRegen.uc文件,以便保存您的進展。

如今,已經完成了自定義的Pawn類,下一步是開始書寫mutator(設置方法)自己的代碼。咱們將會在下個指南中解決這個問題。

 

指南 2.4 –mutator(設置方法)的腳本

1. 若是尚未準備好,那麼打開ConTEXT。

2. 從File (文件)菜單中選擇New(新建)或者按下工具條上的New File(新建文件)按鈕。

3. 使用工具條中的Select Active Highlighter(選擇激活的輪廓)下拉列表選擇UnrealScript。

4. 在新腳本的第一行輸入如下代碼:

class UTMutator_SuperRegen extends UTMutator;

和Pawn類同樣,這行命名了這個類UTMutator_SuperRegen並指出了它是一個具備UTMutator類內置的全部功能而且也具備咱們添加的功能的mutator(設置方法)。

5. 按下回車鍵兩次並輸入如下腳本代碼:

 

正如您在自定義的Pawn類中所看到的,PostBeginPlay將會在早期執行。這個函數內是使用咱們的自定義Pawn類替換GameInfo的DefaultPawnClass的地方。

6. 如今,把光標放置在開始花括號({)的後面並按下回車鍵。而後按下Tab鍵來縮放這部分代碼並輸入如下信息:

 

這段代碼的第一行將會致使執行父類的PostBeginPlay函數。這確保了將會執行位於PostBeginPlay函數中的全部潛在的類。第二行包含了咱們的mutator(設置方法)的主要信息。WorldInfo.Game是到當前的GameInfo的簡單引用。咱們正在訪問它的DefaultPawnClass變量並設置它使用咱們的自定義的Pawn類。

7. 完成mutator編碼所剩餘的部分即是添加defaultproperties(默認屬性)代碼塊。在PostBeginPlay函數後,添加如下代碼:

 

GroupNames數組是一個標記mutators(設置方法)的簡單方法,它能夠並放置同時加載可能相互衝突的兩個mutators。這是很重要的,由於另外一個mutator使用它本身的Pawn替換掉Pawns也是極可能的。這將會覆蓋咱們的mutator的功效,從而使它無用。由於不會同時加載具備相同組名稱的兩個mutators,因此這能夠保證一個mutator不會被另外一個所覆蓋。咱們已經選擇了標籤PLAYERMOD,由於那是mutator實際作的內容。

8. 如今已經完成了mutator類。整個mutator類以下所示:

 

9. 使用名稱UTPawn_SuperRegen.uc把這個新的腳本保存在MasteringUnrealScript/Classes目錄中。把這個腳本命名爲UTMutator_SuperRegen.uc。

圖片 2.10 –已經重命名了Mutator腳本並準備好保存它。

 

指南 2.5 -編譯腳本

當完成了mutator的編碼後,下一步是編譯腳本。這將涉及到設立UTEditor.ini文件及運行編譯器。若是有任何錯誤,那麼這些錯誤都須要被修正而且須要從新執行編譯。

1. 編譯過程的第一步是把MasteringUnrealScript包添加到UTEditor.ini文件中的ModPackages列表中。若是沒有執行這步,編譯器將不知道查找咱們的新的腳本,從而不能編譯它們。

導航到如下目錄:

../My Games/Unreal Tournament 3/UTGame/Config

2. 定位UTEditor.ini文件並在Notepad或其它文本編輯器中打開它,以便對其進行編輯。

3. 找到具備[ModPackages]頭的.ini文件。找到這部分的簡單方法是在文件搜索ModPackages。

4. 把光標放置在如下行的尾部並按下回車鍵。

ModOutputDir=../UTGame/Unpublished/CookedPC/Script

5. 添加這行,來把MasteringUnrealScript包添加到要編譯的包列表中。

ModPackages=MasteringUnrealScript

6. 保存UTEditor.ini文件並關閉它。

7. 正如在前一章所提到的,有不少方法來運行編譯器,或者Make命令行開關更加精確。在本書的接下來的部分,將會簡單地爲您介紹編譯腳本,置於您選擇哪一種方法由您本身決定。如今,請選擇如下方法之一:

 

  • 若是您根據Appendix B中的指令創建了ConTEXT,那麼您能夠簡單地在ConTEXT中按下F9來開始編譯過程。
  • 若是您已經建立了具備make開關的UT3.exe的快捷方式,那麼您如今就能夠運行它。
  • 運行遊戲或編輯器,當提示時選擇編譯腳本。
  • 導航到您的UT3安裝目錄的Binaries目錄,並運行如下命令:

8. 假設沒有錯誤,那麼編譯過程應該能夠成功而且將會在 ../UTGame/Unpulished/CookedPC/Script目錄中建立MasteringUnrealScript.u文件。

圖片 2.11 –Make 命令開關的成功的輸出。

 

指南 2.6 –發佈及測試mutator(設置方法)

到目前爲止,咱們須要檢查是否每一個事情都是真正地成功的。惟一的方法是在虛幻競技場3的外面測試mutator是否工做。在先前指南中建立的腳本包位於Unpublished目錄中。默認狀況下,遊戲僅認可Published目錄中的內容。這給咱們提供了兩個選擇。

 

  • 把MasteringUnrealScript.u包複製到Published目錄。
  • 使用–useunpublished標誌來運行虛幻競技場3。

在這個實例中,咱們將使用第一個選項,把腳本包放到Published目錄中。由於腳本不依賴於可能放置在Unpublished目錄中的內容包中的其它的內容,好比貼圖、網格物體、聲音等,因此咱們能夠繼續前行併發布腳本包。若是不是這種狀況,那麼最好使用–useunpublished標誌來繼續前行並測試。

1. 導航到..My Games/Unreal Tournament 3/UTGame/目錄。假設當前在這個位置不存在Published文件夾,建立名稱爲Published的新文件夾。

2. 在Published目錄的內部,建立另外一個名稱爲CookedPC的文件夾。

3. 打開CookedPC目錄並建立一個名稱爲Script的最後一個文件夾。

4. 從../Unpublished/CookedPC/Script文件夾中把MasteringUnrealScript.u腳本包複製到新建立的../Published/CookedPC/Script目錄中。

5. 運行虛幻競技場3並選擇一個Instant Action(即時做戰)遊戲。

圖片 2.12 –虛幻競技場3的主菜單。

6. 在下一個屏幕上選擇Deathmatch(死亡競技)遊戲類型。

圖片 2.13 –虛幻競技場3的Gametype (遊戲類型)選擇頁面。

7. 從列表中選擇任何您但願玩的地圖,而後從屏幕頂部的菜單中選擇Settings(設置)。

8. 能夠經過從Settings頁面的底部選擇Mutators來訪問Mutator選擇頁面。

圖片 2.14 –經過Gametype Settings (遊戲類型設置)頁面訪問Mutator 選擇頁面

9. 一旦您已經打開了Mutator選擇屏幕,從左側的列表中選擇UTMutator_SuperRegen mutator,而後從屏幕底部選擇Add(添加)。

圖片2.15 –把SuperRegen mutator添加到 Enabled Mutators (啓動的Muators)類表中

10. 最後,點擊Mutator選擇屏幕上的Accept(接受)按鈕,而後從接下來的屏幕上選擇Start Game(啓動遊戲)。一旦遊戲啓動,您將會注意到您的生命值將會當即開始再生,直到它的值到達容許的最大值199爲止。

圖片 2.16 –玩家的生命值已經再生到199。

 

附加文件

 

 

class UTMutator_SuperRegen extends UTMutator;

simulated function PostBeginPlay()
{
   Super.PostBeginPlay();

   WorldInfo.Game.DefaultPawnClass = class'MasteringUnrealScript.UTPawn_SuperRegen';

}

defaultproperties
{
   GroupNames[0] = "PLAYERMOD"
}

 

defaultproperties
{
   GroupNames[0] = "PLAYERMOD"
}

 

Super.PostBeginPlay();

WorldInfo.Game.DefaultPawnClass = class'MasteringUnrealScript.UTPawn_SuperRegen';

 

simulated function PostBeginPlay()
{
}

 

class UTPawn_SuperRegen extends UTPawn;

var Int RegenPerSecond;

simulated function PostBeginPlay()
{
   Super.PostBeginPlay();

   SetTimer(1.0,true);
}

function Timer()
{
   if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
   {
      Health = Min(Health+RegenPerSecond, SuperHealthMax);
   }
}

defaultproperties
{
   RegenPerSecond=10
}

 

Super.PostBeginPlay();
 
SetTimer(1.0,true);

 

simulated function PostBeginPlay()
{
}

 

function Timer()
{
   if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
   {
      Health = Min(Health+RegenPerSecond, SuperHealthMax);
   }
}

 

if ()
{
}

 

if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
{
}

 

function Timer()
{
}

 

class UTPawn_SuperRegen extends UTPawn;

var int RegenPerSecond;



defaultproperties
{
   RegenPerSecond=10
}

 

defaultproperties
{
   RegenPerSecond = 10
}

 

//Pain timer just expired. (Pain計時器已通過期。)
//Check what zone I'm in (and which parts are)(檢查我再區域(以及是哪一個部分))。
//based on that cause damage, and reset BreathTime(根據它來產生傷害並充值BreathTime(呼吸時間))

function bool IsInPain()
{
   local PhysicsVolume V;

   ForEach TouchingActors(class'PhysicsVolume',V)
      if ( V.bPainCausing && (V.DamagePerSec > 0) )
         return true;
   return false;
}

 

/* This class provides the ability for the player to regenerate his
   health every second. (這個類提供了使玩家在每秒鐘從新生成它的健康值的能力。) */
class UTMutator_SuperRegen extends UTMutator;

// The number of hit points that should be restored every second.(每秒鐘要存儲的碰撞點的數量)
var() float RegenPerSecond;

function InitMutator(string Options, out string ErrorMessage)
{
   SetTimer( 1.0, true /* This timer should be called repeatedly */ );
   Super.InitMutator( Options, ErrorMessage );
}

 

// A line comment(行註釋)
/* A block comment(塊註釋) */

 

100
8 + (3 – 2) * 7
2 * PI

 

3_Invalid
Inv@lid
Invalid Identifier
class

 

___ValidIdentifier
Valid_Identifier
Valid123Identifier456
相關文章
相關標籤/搜索