UDN
Search public documentation:

MasteringUnrealScriptBaptismByFireKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

제 2 장 : UNREALSCRIPT 에 있어서의 최초의 시련

시작해 프로그램의 작성을 배우거나 좀 더 단순하게 새로운 언어를 배우거나 할 때는, 새로운 여행의 개시라고 하는 것을 의식해, 도저히 기분이 마음이 가라앉음은 끝낼지도 모릅니다. UnrealScript 의 프로그래밍안에는, 수많은 복잡한 많은 개념에 대한 지식이 필요하게 됩니다. UnrealScript 의 깊은 곳에 뛰어들기 전에, 꽤 간단한 스크립트를 작성해, 준비를 해 둡시다. 스크립트의 작성으로 사용되는 개념의 상세한 설명은 실시하지 않습니다. 그 대신에, 본장은, UnrealScript 를 사용해 실제로 어떠한 것이나 아이디어가 떠올라 크루의 것과 동시에, 계획으로부터 실행을 위한 실장까지의 스크립트 작성의 프로세스에 익숙하기 위한 기회를 제공해 줍니다. 이 연습 문제를 완료하려면 UnrealScript 언어의 지식은 불필요합니다만, 시작하는에 접해 두어야 할, 몇개의 장래 이용하는 기본적인 개념이 있습니다.

2. 1 기본 구문

UnrealScript 의 개발자는, C++ 및 Java 프로그래머에게 친숙한 언어를 요구했으므로, 신규의 언어의 설계시에 C 형식의 언어로 했습니다. 이 기본적인 의미는, (기본적으로 1 행의 코드의) 문장은 세미콜론 (;)으로 종료한다, 또, 안이나 개내 ({ })에서 명령의 그룹을 둘러싼다라고 하는 같은 구문을 언어에 대해서 갖는다고 하는 것입니다.

코드를 입력하려면 , 본질적으로, 희망하는 기능을 작성하기 위해서, 식별자, 키워드, 연산자 및 코멘트의 조를 몇번이나 반복합니다. 이러한 개념의 각각 붙어 간단하게 봐 갑시다.

식별자 및 키워드

식별자는, 클래스, 변수 및 함수의 이름과 같은 참조를 실시하고 싶은 항목에 대해서 프로그래머가 주는 이름입니다. UnrealScript 에서는, 모든 식별자는, 대문자와 소문자를 구별하지 않습니다, 즉, RegenPerSecond, REGENperSECOND 및 ReGeNpErSeCoNd 는, 모두 같은 식별자로 간주해집니다.

식별자의 이름의 제공시에는, 식별을 위해 약간의 룰이 있습니다 :

*1. * 모두 식별자는, 문자 또는 밑줄 (_)로 시작되지 않으면 안됩니다

*2. * 그 뒤에는, 문자, 숫자 또는 밑줄의 임의의 편성이 계속됩니다

*3. * 식별자에는, 공백을 포함할 수 없습니다

*4. * 식별자는, 키워드와 같은 것에는 할 수 없습니다.

유효한 식별자의 몇개의 예를 이하에 나타냅니다 :

___ValidIdentifier
Valid_Identifier
Valid123Identifier456

몇개의 무효인 식별자의 예입니다 :

3_Invalid
Inv@lid
Invalid Identifier
class

키워드는, 특정의 기능에 관련해 컴파일러에 의해 예약된 특별한 단어입니다. 샘플 스크립트내에서, 다음과 같은, 몇개의 다른 키워드를 지금까지 봐 왔던 : class function var defaultproperties. 식별자와 같게, 키워드도 대문자와 소문자를 구별하지 않습니다.

식 및 연산자

식은, 값, 연산자의 그룹이며, 평가되었을 때에 보존 가능한 어느 의미가 있는 값을 생성하는 엔티티를 형성하는 그룹화 된 심볼입니다. 이하에 몇개의 식의 예를 듭니다 :

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

연산자는, 오퍼랜드로 불리는 항목의 값을 조작하는 특별한 함수입니다. 모든 흥미로운 식이 이용하는 오퍼랜드는, 식에는 불가결한 부분입니다. 상기의 식의 예에도 다음의 연산자가 사용되고 있었습니다 : + () *

연산자 및 식은, 어느 프로그램에서도 기본적인 부분입니다. 그 때문에, 이것들은, 이후의 장으로 꽤 자세하게 다루어집니다. 지금은, 본장의 남은 진행될 때에, 충분히 이해할 수 있는 범위를 제공합시다.

코멘트

코멘트는 원시 코드에 대한 설명을 제공하기 위해서 사용됩니다만, 컴파일러에서는 완전하게 무시됩니다. 그것들은, 자주, 함수가 무엇을 실시해, 그 인수가 무엇에 사용되는지를 설명하기 위해서 사용됩니다. 코멘트는, 프로젝트로 공동 작업하고 있을 때에 특히 중요해, 다른 프로그래머는 코멘트를 읽어, 간단하게 코드를 이해할 수 있습니다. 코드는, 곧바로, 타인에게, 또, 작성자조차도, 시간이 지나고 나서는, 적절한 문서나 설명서가 없으면 전혀 모르는 것이 되기 쉽습니다.

코멘트부는, 더욱, 테스트 및 디버그 시에 이용됩니다. 코드의 일부분은 "comment out" 할 수 있습니다, 즉, 이미 인식되지 않고 실행되지 않게 됩니다. 이 방법은, 코드의 문제가 있는 부분을 찾아내기 (위해)때문에, 또, 2 개(살)이 닮은 부분의 코드의 차이를 찾아내기 위해서(때문에) 사용할 수 있습니다. 이 용도로, 코멘트를 사용하면(자), 코드의 삭제 및 재입력의 수고가 생략해져 전체의 처리가 보다 간단해 효율적이 됩니다

UnrealScript 는, 2 개의 타입의 코멘트 구조를 서포트하고 있습니다 :

// 라인 코멘트
/* 블록 코멘트 */

라인 코멘트는, slash의 페어 (//)로 시작되어, 행의 끝나에 도달할 때까지의 코멘트입니다. 블록 코멘트는, 컴파일러에, 열림 (/*) 및 닫고 (*/) 코멘트 태그의 사이의 임의의 내용을 무시하도록(듯이) 지시합니다.

이하는, 코멘트를 추가했을 때에 스크립트의 예의 일부가 어떻게 되는지를 나타내고 있습니다.

/* 본클래스는, 라이프를 매초 자동 회복하는 기능을 플레이어에게
   제공하고 있습니다.  */
class UTMutator_SuperRegen extends UTMutator;

// 매초 마다 restore 되는 라이프의 수.
var() float RegenPerSecond;

function InitMutator(string Options, out string ErrorMessage)
{
   SetTimer( 1.0, true /* 본타이머는, 반복해 불려 가야 합니다 */ );
   Super.InitMutator( Options, ErrorMessage );
}

2. 2 REGENERATION(자동 회복) 뮤테이타

코스의 다음의 몇개의 섹션에서는, 신규의 뮤테이타를 작성합시다. Unreal 내의 뮤테이타는, 어느 방법으로 표준의 게임의 기능을 변경하는 스크립트입니다. 이것은, 맵상의 모든 무기를 로켓 발사기로 옮겨놓는 것 같은 간단한 것일지도 모르고, 플레이어의 시점을 자신으로부터 제삼자의 것으로 바꾸는 것 같은 좀 더 복잡한 것일지도 모릅니다. 이 예에서는, 플레이중에 매초 지정한 양만, 플레이어의 라이프를 자동 회복하는 뮤테이타를 이용합시다.

이전의 장으로 말한 것처럼, ConTEXT 는, 본서의 모든 예 및 튜토리얼로 사용되는 텍스트 문자 편집기가 됩니다. ConTEXT 를 사용할 계획이 있다면, 「부록 B : Unreal Engine 3 용으로 ConTEXT 를 설정한다」에 따라 확실히 설정해 주세요. WOTGreal 를 사용할 계획이 있다면, 「부록 C : Unreal Engine 3 용으로 WOTGreal 를 설정한다」를 참조해 주세요.

클래스에 관한 계획

코드를 쓰기 시작하기 전에, 스크립트에 실제로 무엇을 실시하게 해야할 것인가의 개별 계획을 작성하는 것이 중요합니다. 이미 뮤테이타는 플레이어의 라이프를 매초 자동 회복해야 하는 것인 것을 말했습니다. 이것은, 좋은 스타트입니다만, 기능의 충분한 구체화를 돕기 위해, 몇개의 질문이 가능합니다.

  • 어떻게 라이프를 자동 회복하는 것에 임할 생각인가 ?
  • 모든 플레이어의 라이프를 자동 회복해야할 것인가 - 보트는 ?
  • 매초 어느 정도의 라이프를 자동 회복해야할 것인가 ?
  • 시간의 수치는 설정 가능하게 해야 하는가 ?
  • 어느 점까지 라이프는 자동 계속 회복할 필요가 있는지 ?
  • 라이프를 자동 회복 해서는 안된 상황은 있는지?

이 예에서는, 모든 제어된 플레이어 캐릭터의 라이프의 자동 회복은 실시하지만 보트의 자동 회복은 실시하지 않는 뮤테이타를 작성합시다. 이것을 실행하는 가장 간단한 방식은, 게임내의 Pawn 를, 자동 회복을 실시하는 기능을 가지는 Pawn 클래스에서 옮겨놓는 것입니다. 자동 회복의 양은, 1 초 마다 10 단위로서 설정 변경은 할 수 없습니다. 플레이어의 라이프는, 허가된 최대 라이프가 될 때까지 자동 회복을 계속합니다. 자동 회복은, 플레이어가 고통을 일으키도록(듯이) 설정된 볼륨내에 배치되었을 때에는 발생해서는 안되기 때문에, 뮤테이타를 설계할 때에, 이 상황이 설명될 필요가 있습니다.

튜토리얼 2.1 - REGENERATION 뮤테이타의 조사

이 시점에서, 약간의 조사가 도움이 됩니다. 실제의 코딩에 걸리기 전에, 해결해야 하는 몇개의 문제가 있습니다. 처음에, 자동 회복을 취급하는 자기 부담의 클래스에서 게임내의 모든 플레이어를 옮겨놓는 어떠한 방법이 필요합니다. 다음에, 임의의 조건하에서 플레이어에게 허가된 최대의 라이프, 또는, 그 값을 나타내는 변수의 어느 쪽인지를 찾아낼 필요가 있습니다. 마지막으로, 고통을 일으키는 볼륨의 내부에 플레이어가 있을 때를, 식별하기 위한 어떠한 방법이 필요합니다.

특정의 정보를 찾아내고 싶을 때에 어디를 볼까를 아는 것은, 자주 어려운 문제가 될 가능성이 있습니다. Unreal 의 클래스와 좀 더 아주 친숙해지면, 찾고 있는 것이 찾아내기 쉬워지는 것을 알겠지요. *1. * GameInfo 클래스는, 게임 타입에 관한 기능을 조작합니다. 게임에서 사용되는 데포르트폰크라스를, 자기 자신의 것과 옮겨놓는 방법을 찾으려면 , 좋은 개시점이 되겠지요. ../Engine/Classes 디렉토리내에 격납된 GameInfo.uc 스크립트를 찾아내, 오픈해 주세요.

*2. * 어느 키워드의 장소를 나타내기 위해서(때문에), 텍스트 문자 편집기에 짜넣어진 검색 기능을 사용하면, 많은 경우에 찾고 있는 것을 찾아내기 위해서(때문에)는 안성맞춤의 방법이 됩니다. 게임내에서 Pawns 에 사용되는 클래스의 설정을 모두 찾으므로, PawnClass 가, 검색하기 위한 용어에는 좋을 것입니다. 문서의 선두로부터 검색하고 있는 것의 확인은 중요합니다, 그러면, 간과하는 것은 없습니다.


그림 2.1 - “PawnClass”라고 하는 용어로 GameInfo 클래스를 검색중의 Find Text 다이얼로그

*3. * 최초로 Ctrl + F 를 눌러, 키워드 PawnClass 로 Actor 클래스의 검색을 실시해 주세요. 표시된 Find Text 다이얼로그의 Find What 필드에“PawnClass”의 용어를 입력해 주세요. 또, From the top 옵션에의 체크를 확실히 가 주세요. 마지막으로, Find 를 클릭합니다.

최초의 일치는 이하와 같이 될 것입니다 :

var class DefaultPawnClass;

이것은, 찾고 있었지만 같습니다. 뮤테이타내의 이 변수의 값을 오버라이드(override) 하는 것으로, 자동 회복을 실시하는 Pawn 클래스를 게임에서 사용할 수가 있을 것입니다. 이 최초의 문제를 해결하면, 나머지의 정보의 검색에 주의를 돌릴 수가 있습니다.

*4. * 플레이어를 취급할 때, 대답을 찾기 시작하는 최초의 장소는 UTPawn 클래스에 대한 스크립트안입니다. 이것은, Unreal Tournament 3 내에서 플레이어 제어 및 AI 제어의 캐릭터에 대한 클래스입니다. ../UTGame/Classes 디렉토리내에 격납되고 있는 UTPawn.uc 스크립트를 찾아내 오픈해 주세요.

*5. * 초에, 검색을 실행하기 위해서 Ctrl + F 를 눌러 주세요. Find what 필드내에, 용어 "Health" 를 입력해, From the top 옵션을 선택해 주세요. 검색을 개시하기 위해서 Find 를 눌러 주세요.


그림 2.2 - Find Text 다이얼로그는, 용어 "Health" 를 UTPawn 클래스에서 검색합니다

서치가 찾아내야 할 최초의 항목은, 다음의 것입니다 :

var int SuperHealthMax; /** 최대 허용 라이프치 */

이것으로 검색하고 있던 것이 발견되었습니다. 실제로 검색하고 있던 이 정보를 입수해, 스크립트 기술에 필요한 마지막 정보의 부분의 검색으로 옮기는 것이 가능합니다.

*6. * Unreal 에 관한 레벨의 설계 또는 스크립트의 어느 쪽에 대해서도 전혀 경험이 없는 경우는, 이 마지막 검색으로 무엇을 찾으면(자) 좋은가를 모를지도 모릅니다. Volumes(볼륨)는 Unreal 중(안)에서 스페이스의 영역을 정의하기 위해서 사용되는 방식입니다. 이러한 볼륨의 몇개인가, 특히 PhysicsVolunes 는, 그것들을 포함한 스페이스의 물리 프롭퍼티에 영향을 주면(자) 같이 bPainCausing 프롭퍼티를 사용해 그러한 안에 위치하는 임의의 플레이어에게 고통을 주는 것에 영향을 줍니다. 이 약간의 지식으로부터, 키워드 bPainCausing 를 검색하는 것에 깨닫습니다. 시작으로 UTPawn 클래스내를 검색하는 것은, 이치에 필적하고 있습니다만, 이 서치는 어떤 유효한 결과를 낳지 않을지도 모릅니다. 부모의 Pawn 클래스로 옮기는 것이, 다음의 논리적인 선택이 되겠지요.

../Engine/Classes 디렉토리에 위치하고 있는 Pawn.uc 스크립트를 오픈해 주세요.

*7. * 재차, 검색을 실행하기 위해서 Ctrl + F 를 눌러 주세요. Find what 필드내에“bPainCausing”의 용어를 입력해 "From the top" 옵션을 선택해 주세요. 검색을 개시하기 위해서 [Find] 를 눌러 주세요.


그림 2.3 - “PhysicsVolume”의 단어로 Actor 클래스를 검색하고 있는 Find Text 다이얼로그

*8. * 이 검색에 일치하는 최초의 것은, 이하와 같은 것입니다 :

//Pain 타이머는 실효한지 얼마되지 않았습니다.
//
//발생 데미지를 기본으로 해, 자신이 있는 존 ( 및 어느 파트인지)을 확인해
// Breath Time 를 리셋트 한다

function bool IsInPain()
{
   local PhysicsVolume V;

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

한번 더, 찾고 있던 것을 찾아냈습니다.

제대로 한 계획을 세워, 필요한 정보를 모두 입수하면(자), 자동 회복 뮤테이타에 대한 코드를 쓰기 시작하는 것이 가능합니다.

튜토리얼 2.2 - 초기 PAWN 클래스 설정

*1. * 아직, 오픈하고 있지 않으면, ConTEXT 를 오픈해 주세요.

*2. * 커스텀 Pawn 클래스의 코드의 기술을 시작하기 위해서(때문에) 필요한 것은, 신규의 스크립트 파일입니다. "File" 메뉴로부터, "New" 를 선택하는지, 툴바내의 [New File] 버튼을 눌러 주세요.


그림 2.4 - New File 버튼

*3. * 모토신규파일에 대해서 UnrealEd 또는 UnrealScript 하이 라이터를 선택하기 위해서 Select Active Highlighter 드롭 다운을 사용해 주세요. 선택하는 하이 라이터는, 인스톨 한 것이 무엇인가 개인의 좋아해에 의존합니다.


그림 2.5 - Select Active Highlighter 드롭 다운

*4. * 코드의 기술을 개시할 수 있게 되었습니다. 임의의 신규의 스크립트의 최초의 부분은, 클래스 선언이지요. 이것은, 스크립트에 이름을 주어 친클래스가 어떤 것인지를 결정하는 곳(중)입니다. 1행째에, 이하와 같이 입력해 주세요 :

class UTPawn_SuperRegen extends UTPawn;

이 일행의 코드로, 클래스에 UTPawn_SuperRegen 라는 이름을 붙입니다. 또, 이 클래스가 UTPawn 클래스로부터 계승되는 일도 지정했습니다. 이것은, 기본적으로, 추가한 임의의 기능과 같게, 이 클래스에는 UTPawn 클래스의 모든 기능을 포함하는 것을 의미합니다.

*5. * 매초 플레이어의 건강을 자동 회복하는 양을 나타내기 위해서(때문에) 1 개의 변수를 사용합니다. [Enter] 를 2 회 눌러, 3 행 째에 다음의 코드를 입력해 주세요.

var int RegenPerSecond;

본변수에는, 다음의 스텝에 있어서의 초기치가 주어집니다만, 후에 라이프를 수정할 때까지 실제로는 사용되지 않습니다.

*6. * 초기 클래스 설정의 마지막 부분은, defaultproperties 블록의 생성을 포함합니다. 이것은, 작성하는 클래스의 프롭퍼티에 대한 값을 보관 유지합니다. [Enter] 를 몇번인가 눌러, 이하를 입력해 주세요 :

defaultproperties
{
   RegenPerSecond = 10
}

여기에서는, RegenPerSec 변수에 초기치를 주는 것으로 같이 본뮤테이타에 대한 그룹의 이름을 지정합니다.

*7. * 이것으로, 클래스의 초기설정은 종료합니다. 이 시점까지의 코드는 이하와 같이 될 것입니다 :

class UTPawn_SuperRegen extends UTPawn;

var int RegenPerSecond;



defaultproperties
{
   RegenPerSecond=10
}

*8. * 이것은 항상 좋은 생각입니다만, 작업 성과를 잃지 않게, 여기서 스크립트를 보존합시다. "File" 메뉴로부터, "Save as …" 를 선택해 주세요. 오픈한 다이얼로그로, 이러한 디렉토리의 1개로 이동합니다 :

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. * 마지막으로, Save as type 필드내에서 UnrealScript (. uc)가 선택되고 있는 것을 확인해 스크립트의 이름으로서 UTPawn_SuperRegen 를 입력해 주세요.


그림 2.9 - Pawn 스크립트는, 명명되어, 보존할 준비를 할 수 있었습니다.

물론, 이 시점에서, 클래스에 추가한 기능은 전혀 없습니다. 다음의 튜토리얼로 추가해 나갑시다.

튜토리얼 2.3 - 자동 회복 타이머의 설정

신규의 Pawn 클래스를 작성하면(자), 표준의 UTPawn 클래스와는 구별되는 기능을 추가할 때입니다. 그 기능은, 이 Timer 가 매초 실행되는 것을 확실히 하는 방식과 같이, 실행되면(자) 매회 플레이어의 Health 를 늘리는 Timer 함수의 설정도 포함합니다.

*1. * 전회의 튜토리얼에 이어, ConTEXT 내에서 UTPawn_SuperRegen.uc 를 오픈해 주세요.

*2. * RegenPerSecond 변수의 선언의 뒤에, 이하의 입력을 실시해 Timer 함수를 선언해 주세요 :

function Timer()
{
}

Timer 는, 지정한 시간 경과후에 불려 가는 특별한 형태의 함수이며, 반복을 강제할 수도 있습니다. 이 점은, 이 경우의 목적으로는 적합한 이상적인 것이 됩니다.

*3. * 여기에서는, Timer 함수에 대해서 몇개의 기능을 추가해 봅시다. 열림중이나 와 ({)의 뒤로 커서를 두어,[Enter] 를 눌러 주세요. 그리고, 코드의 이 부분을 인덴트 하기 위해서 [Tab] 를 눌러 주세요. 이하의 코드를 입력해 주세요 :

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

이 부분의 코드는, 조금 보면(자) 복잡하게 보일지도 모릅니다만, 실제는 꽤 간단한 것입니다. 부분으로 나누어 보면, 이해하기 쉬울지도 모릅니다.

if ()
{
}

이것은, If 문으로 시작되어 있습니다. 이것은, 기본적으로, 외모내의 식이 true 이면, 안이나 와 ({}) 동안에 놓여진 코드가 실행된다고 하는 것입니다.

Controller.IsA('PlayerController')

이 부분의 코드는, Pawn 가 플레이어 제어인가 어떤가를 확인하고 있습니다. 플레이어 제어이면, 다음의 코드 부분으로 옮깁니다.

! IsInPain()

이 식은, 이 Pawn 가, 고통을 주는 볼륨내에 있을지 어떨지를 확인하고 있습니다. 만약 그렇지 않으면, (! 기호에 주의) 다음의 코드 부분으로 이동합니다.

Health < SuperHealthMax

이 식은, 라이프에 허가된 최대치부터, 이 Pawn 의 Health 가 작은지 어떤지를 조사하고 있습니다. 만약, 작으면, 안이나 와 ({})의 사이의 코드가 실행됩니다.

*4. * If 명령의 열림중이나 와 ({)의 뒤로 커서를 두어 [Enter] 를 눌러 주세요. 그리고, 이 부분의 코드를 인덴트 하기 위해서 [Tab] 를 눌러 주세요. 이하를 입력해 주세요 :

Health = Min(Health+RegenPerSecond, SuperHealthMax);

여기에서는, Health 의 현재의 값을 취득해, 자동 회복의 값을 더합니다. 그리고, 이 값은, 라이프에 용서된 최대치로 비교되어 그 2 개의 값의 작은 (분)편이, Pawn 의 Health 에 대입됩니다. 기본적으로, 이것은, 용서되는 최대치로, 결과의 라이프의 상한을 정하면서, 자동 회복을 실행합니다.

*5. * Timer 함수 자신은, 이것으로 완성해, 이하와 같이 될 것입니다 :

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

*6. * 더욱, 이 Timer 가 매초 실행되는 것을 확실히 할 방법이 필요해, 그 결과, 실제의 자동 회복을 합니다. 이전, 타이머는, 특별한 형태의 함수이라면 설명했습니다. 타이머를 개시하기 위해서, SetTimer 를 호출하는 다른 함수를 실행하지 않으면 안됩니다. 이 SetTimer 함수에의 호출을 어디에 두어, 플레이의 개시시에 실행되도록(듯이) 할지가 유일한 실제의 문제입니다. 우연히, 모든 Actors 에는, 플레이 개시 직후에 실행되어, PostBeginPlay 를 호출하는 충분히 적격인 함수가 있습니다.

RegenPerSecond 변수의 선언아래, Timer 함수 위에 이하의 내용을 입력해 주세요 :

simulated function PostBeginPlay()
{
}

Simulated 라고 하는 새로운 키워드가 사용되고 있는 것에 기분귀댁도 알려지지 않습니다. 지금은, 신경쓰지 말아 주세요. 이것은, 훨씬 먼저 채택할 예정의 복잡한 토픽인 네트워크와 관계해 실행할 필요가 있는 것입니다.

*7. * PostBeginPlay 함수의 열림중이나 이 뒤로 커서를 두어, [Enter] 를 눌러 주세요. 그리고, 이 부분의 코드를 인덴트 하기 위해서 Tab 를 눌러 주세요. 이하의 내용을 입력해 주세요 :

Super.PostBeginPlay();

SetTimer(1.0, true);

본함수의 최초의 행은, PostBeginPlay 함수가 친클래스내에서 실행되어야 할 일을 나타내고 있습니다. 이것은, PostBeginPlay 의 UTPawn 판이 이 시점에서 불려 가는 것을 의미합니다. 그리고, 2 행 째는 타이머를 개시합니다. 이것은, 1.0 초 마다 실행되어, 루프를 설정합니다.

*8. * 이 코드를 다 썼으면 , 커스텀 Pawn 클래스도 완성했을 것입니다. Pawn 클래스 전체는, 이하와 같이 될 것입니다 :

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
}

*9. * 작업 결과를 잃지 않게 ConTEXT 내의 UTPawn_SuperRegen.uc 파일을 보존해 주세요.

커스텀 Pawn 클래스가 완성했으므로, 다음의 스텝은 뮤테이타크라스 자신에 대한 코드의 기술을 개시합니다. 이것에는, 다음의 튜토리얼로 임합시다.

튜토리얼 2.4 - 뮤테이타스크리프트

*1. * 아직, 오픈하고 있지 않으면 ConTEXT 를 오픈해 주세요.

*2. * File 메뉴로부터 New 를 선택하는지, 툴바내의 [New File] 버튼을 눌러 주세요.

*3. * 희망하는 UnrealScript 하이 라이터를 선택하기 위해서, 툴바내의 Select Active Highlighter 드롭 다운을 사용해 주세요.

*4. * 신규 스크립트의 1 행 째에, 이하의 코드를 입력해 주세요 :

class UTMutator_SuperRegen extends UTMutator;

Pawn 클래스와 같게, 이 행은, 이 클래스에 UTMutator_SuperRegen 라는 이름을 붙여, 추가하는 임의의 기능과 함께 UTMutator 클래스에 짜넣어진 기능의 모든 것을 가지는 뮤테이타가 되도록(듯이) 지정합니다.

*5. * [Enter] 를 2 번 눌러, 스크립트에 다음의 코드를 추가해 주세요.

simulated function PostBeginPlay()
{
}

커스텀 Pawn 클래스에서 본 것처럼, PostBeginPlay 함수는, 매우 빠른 시기에 실행될 것입니다. 이 함수내에서, GameInfo 의 DefaultPawnClass 를 자기 자신의 커스텀 Pawn 클래스의 코드를 옮겨놓습니다.

*6. * 여기서, 열림중이나 이 뒤로 커서를 두어, [Enter] 를 눌러 주세요. 그리고, 이 부분의 코드를 인덴트 하기 위해서 [Tab] 를 눌러, 이하를 입력해 주세요 :

Super.PostBeginPlay();

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

이 코드의 1 행 째는, 친클래스의 PostBeginPlay 함수의 실행을 행합니다. 이것은, PostBeginPlay 함수내에 있는 어떠한 기본적인 동작의 실행을 보증합니다. 2 행 째는, 뮤테이타크라스의 본체를 포함하고 있습니다. WorldInfo.Game 는, 단지 현재의 GameInfo 를 참조하고 있습니다. 그 DefaultPawnClass 변수에 액세스 해, 커스텀 Pawn 클래스를 사용하는 설정을 하고 있습니다.

*7. * 뮤테이타크라스의 코딩을 종료하기 위해서 남아 있는 것은, defaultproperties 블록을 추가하는 것입니다. PostBeginPlay 함수의 뒤로 이하의 코드를 추가해 주세요.

defaultproperties
{
   GroupNames[0] = "PLAYERMOD"
}

GroupNames 배열은, 뮤테이타에 단지 라벨을 붙이는 방법으로, 서로 충돌할 가능성이 있는 뮤테이타를 동시에 로드하는 것을 막습니다. 이것은, 다른 뮤테이타가 자기 자신의 커스텀 Pawn 로 Pawn 를 옮겨놓을 가능성이 있으므로 중요합니다. 이것은, 우리의 뮤테이타에서는 쓸데없는 것인 효과를 오버라이드(override) 하겠지요. 동시에 로드 될 가능성이 있는 그룹명에 합치하는 2 개의 뮤테이타는 존재하지 않기 때문에, 이것에 의해, 어느 뮤테이타가 다른 뮤테이타를 오버라이드(override) 하지 않게 합니다. 기본적으로, 이 뮤테이타가 실시하는 것을 나타내기 (위해)때문에 PLAYERMOD 라고 하는 라벨을 선택했습니다.

*8. * 뮤테이타크라스는 완성했을 것입니다. 뮤테이타크라스의 전체는 이하와 같이 될 것입니다 :

class UTMutator_SuperRegen extends UTMutator;

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

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

}

defaultproperties
{
   GroupNames[0] = "PLAYERMOD"
}

*9. * UTPawn_SuperRegen.uc 스크립트와 함께 MasteringUnrealScript/Classes 디렉토리내에 신규 스크립트를 보존해 주세요. 이 스크립트에는, UTMutator_SuperRegen.uc 라는 이름을 붙여 주세요.


그림 2.10 - 뮤테이타스크리프트는 이름을 붙일 수 있어 보존할 준비가 되어 있습니다

튜토리얼 2.5 - 스크립트의 컴파일

뮤테이타의 코딩이 완료하면(자), 처리의 다음의 스텝은, 스크립트를 컴파일 하는 것입니다. 이것은, UTEditor.ini 파일의 설정과 동시에 컴파일러의 실행을 포함합니다. 어떠한 에러가 검출되었을 경우는, 그것들을 수정할 필요가 있어, 컴파일 처리를 재차 실시할 필요가 있습니다.

*1. * 컴파일 처리의 최초의 스텝은, UTEditor.ini 내의 ModPackages 의 리스트에 MasteringUnrealScript 패키지를 추가하는 것입니다. 이 스텝의 실행을 실시하지 않으면 컴파일러는 새로운 스크립트를 검색할 수가 없기 때문에, 컴파일 되지 않습니다.

이하의 디렉토리로 옮겨 주세요 :

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

*2. * UTEditor.ini 파일을 찾아, 편집할 수 있도록(듯이) Notepad , 또는, 그 외의 텍스트 문자 편집기로 오픈해 주세요.

*3. * [ModPackages] 의 표제를 가진다 . ini 파일의 섹션을 검색해 주세요. 이 섹션을 발견하는 간단한 방법은, ModPackages 로 파일내를 검색하는 것입니다.

*4. * 이하의 행의 마지막에 커서를 두어, [Enter] 를 눌러 주세요.

ModOutputDir=..\UTGame\Unpublished\CookedPC\Script

*5. * 컴파일 되는 패키지의 리스트에 MasteringUnrealScript 패키지를 추가하기 위해서 이하의 행을 추가해 주세요.

ModPackages=MasteringUnrealScript

*6. * UTEditor.ini 파일을 보존해, 클로우즈 해 주세요.

*7. * 이전의 장으로 말한 것처럼, 컴파일러, 또는, 엄밀하게는 Make 커멘드 렛을 실행하려면 몇개의 방법이 있습니다. 본서의 나머지의 부분에서는, 스크립트를 컴파일 하면(자) 간단하게 지시받게 되어, 어떻게 실행할까를 결정하는 것은 독자의 책임이 됩니다. 여기에서는, 이하의 1 개를 선택해 주세요 :

  • 부록 B 의 지시에 따라 ConTEXT 를 설정해 있는 경우는, 컴파일 처리를 개시하기 위해서 ConTEXT 내에서 F9 를 누르는 것만으로 좋습니다.
  • make 스윗치 첨부로 UT3.exe 에의 쇼트 컷을 작성한 경우는, 그것을 실행해 주세요.
  • 게임 또는 에디터를 실행해, prompt에 응해 스크립트의 컴파일을 선택해 주세요.
  • UT3 인스톨 디렉토리의 Binaries 에 이동해, 다음의 커멘드를 실행해 주세요 : UT3.exe make

*8. * 에러가 없으면 가정하면, 컴파일 실시 프로세스는 올바르게 종료해, ..\UTGame\Unpulished\CookedPC\Script 디렉토리내에 MasteringUnrealScript.u 파일을 생성할 것입니다.


그림 2.11 - Make 커멘드 렛의 성공시의 출력.

튜토리얼 2.6 - 뮤테이타의 공개 및 테스트

이 시점까지, 확실히 모든 것이 올발라지고 있는지를 확인할 때입니다. 작성한 뮤테이타가 동작할까를 아는 다만 1 개의 방법은, Unreal Tournament 3 의 내부에서 충분히 테스트를 실시하는 것입니다. 전회까지의 튜토리얼로 작성한 스크립트 패키지는 Unpublished 디렉토리내에 있습니다. 게임은, 디폴트에서는, Published 디렉토리내에 있는 컨텐츠만을 인식합니다. 여기에서는, 2 개의 선택사항이 남아 있습니다.

  • MasteringUnrealScript.u 패키지를 Published 디렉토리에 카피한다
  • ? useunpublished 플래그를 사용해, Unreal Tournament 3 을 실행한다

이 예에서는, 최초의 선택사항을 사용해, 스크립트 패키지를 Published 디렉토리에 두기로 하겠습니다. 스크립트는, texture, 메쉬, 사운드등 , Unpublished 디렉토리내에 놓여질지도 모르는 컨텐츠 패키지내에 놓여지는 다른 컨텐츠에는 어떤 의존하고 있었기 때문에, 먼저 진행되어, 스크립트 패키지를 publish(공개) 하지 않는 이유는 없습니다. 이러한 케이스로 없으면, -useunpublished 플래그를 사용한 테스트를 실시해 가는 것도 좋은 생각일지도 모릅니다.

*1. * ..My Games\Unreal Tournament 3\UTGame\ 디렉토리로 이동해 주세요. 이 장소에는 현재는 Published 폴더는 존재하지 않으면 가정해, Published 라는 이름의 신규 폴더를 작성해 주세요.

*2. * Published 디렉토리안에, 다른 신규 폴더를 작성해, CookedPC 라고 이름 붙여 주세요.

*3. * CookedPC 디렉토리를 오픈해, Script 라는 이름의 최종 폴더의 1 개를 작성해 주세요.

*4. * MasteringUnrealScript.u 스크립트 패키지를 ..\Unpublished\CookedPC\Script 폴더로부터 신규에 작성했다 ..\Published\CookedPC\Script 디렉토리에 카피해 주세요.

*5. * Unreal Tournament 3 을 실행해, Instant Action 게임을 선택해 주세요.


그림 2.12 - Unreal Tournament 3 메인 메뉴.

*6. * 다음의 화면에서 Deathmatch 게임 타입을 선택해 주세요.


그림 2.13 - Unreal Tournament 3 의 Gametype 선택 화면.

*7. * 리스트로부터 희망의 맵을 선택하고 나서, 화면의 상부에 있는 메뉴로부터 Settings 를 선택해 주세요.

*8. * Settings 화면의 하부로부터 Mutators 를 선택해, Mutator 선택 화면에 액세스 가능합니다.


그림 2.14 - Mutator 선택 화면은, Gametype Settings 화면으로부터 액세스 됩니다.

*9. * 한번, Mutator 선택 화면을 오픈하면(자), 좌측의 리스트로부터 UTMutator_SuperRegen 뮤테이타를 선택해, 화면의 하부로부터 Add 를 선택해 주세요.


그림 2.15 - Enabled Mutators 리스트에 SuperRegen mutator 를 추가한다.

*10. * 마지막으로, 다음의 화면으로부터 Start Game 의 선택이 잠시 후에 실행되는 Mutator 선택 화면상에서 [Accept ] 를 클릭해 주세요. 게임을 개시하면(자), 199 로 지정된 라이프의 최대치가 될 때까지의 자동 회복이 곧바로 개시되는 것에 눈치채겠지요.


그림 2.16 - 플레이어의 체력이 199 로 재생.

추가 파일