概要

このチュートリアルでは1からある程度動くゲームを作成します。2011年11月の更新です。

1.UDKの入手

上記のページ右上のDawnLoad UDKからUDKをダウンロードする事が出来ます。

2.各種ツールの入手&インストール

コーディング関係

必ずしもVisual Studioでコーディングをする必要はありませんが、メモ帳などでするよりかは効率的です。

3DCG関係

ActorXのインストール

ActorXはUDKの開発に必須です。

C:\UDK\UDK-2011-05\Binaries\ActorX に色々入っていますのでお使いの3DCGソフトに合ったものインストールしてください。

その他のツール

Umodelツールを使用する事によってUDKに含まれるファイルを観覧出来るようになります。

有用な記事

以下のページは特に重要です。UDK開発を始める前に一読をおすすめします。

UDK Tips内のページ

UDN内のページ

上記のページは非常に長いですが、非常に重要な事が書いてあります。

以上で前振りは終わりです。以下本編になります。

ステップ1:コンパイル環境のセットアップ

1.まず、UDKをインストールした状態で、 C:\UDK\UDK-2011-05\UDKGame\Config\DefaultEngine.ini をテキストエディタで開きます。

2.次に17行あたりに +NonNativePackages=MyMod 、28行あたりに +EditPackages=MyMod と書いてファイルを保存します。

(MyModはコンパイルするフォルダの名前です。MyMod以外の名前を付けることもできます)

3.次に C:\UDK\UDK-2011-05\Development\Src\MyMod\Classes に行き、MyGame.ucを作成します。

4. MyGame.uc をVisual Studio等で開き、以下の内容を書きます。

class MyGame extends UTGame; defaultproperties { }

5.最後にUDKエディタを起動する為のショートカットを作成します。

C:\UDK\UDK-2011-05\Binariesに行き、UDKLift.exeのショートカットを作成し、ショートカットのプロパティを開き、 editor を付け加えます。

以上で必要最低限のコンパイル環境の作成は終わりです。

ショートカットからUDKエディタを起動してみてください。

ステップ2:ゲーム内容の作成

ステップ1を終えた状態ではコンパイルは出来ましたが、ゲーム内容はデフォルトのゲームであるUTGameのままです。

ステップ2ではオリジナルのゲーム内容を作成し、適用します。

1.MyGame.ucを開き、以下の内容を記述します。

function PostBeginPlay() { SetTimer(5, true, 'HelloWorld'); super.PostBeginPlay(); } function HelloWorld() { WorldInfo.Game.Broadcast(self, 'HelloWorld'); }

上記のコードはUTGameのゲーム内容を継承しつつ、ゲームが始まってから5秒ごとにHelloWorldと表示を繰り返すという内容です。

2.そして更にデフォルトプロパティに MapPrefixes[0]="MY" を加えます。

これは MY- XXXXと名前の付いたマップのゲームモードはMyGameであるという事を指定します。

最終的にMyGame.ucは以下の様になります。

class MyGame extends UTGame; function PostBeginPlay() { SetTimer(5, true, 'HelloWorld'); super.PostBeginPlay(); } function HelloWorld() { WorldInfo.Game.Broadcast(self, 'HelloWorld'); } defaultproperties { MapPrefixes[0]="MY" }

3.最後にC:\UDK\UDK-2011-05\UDKGame\Config\UDKGame.iniを開き、

DefaultGameとDefaultServerGameを以下の様に置き換えます。

DefaultGame=MyMOD.MyGame DefaultServerGame=MyMOD.MyGame

そして更に21行目付近に

DefaultMapPrefixes=(Prefix="MY",bUsesCommonPackage=FALSE,GameType="MyMOD.MyGame") を追加します。

これでUDKで先ほど作成したゲームが起動する準備が整いました。

エディタのショートカットからエディタを起動するとスクリプトがコンパイルされます。

赤字が表示される場合は、スクリプトに問題があるので表示内容に従い編集しなおす必要があります。

緑字の場合はOKという事です。

ステップ3:マップ編

ではマップ編に移ります。

今回はゲームモードのテストなので必要最低限の事だけします。

1.まずエディタ左にあるBoxアイコンを 右クリック してウィンドウを出し、Boxのサイズを適宜変更します。

2.次にCSGエリアにある Add をクリックしてブラシを作成します。

3.最後にマップに必須である Player Startアクター と DominantDirectionalLightアクター を設置します。

4.そして仕上げにマップをMY-XXXと言う名前で保存します。

以上でテストマップの作成は終了です。

ステップ4:マップテスト

F8キーかエディタ上部にある再生アイコンを押してインゲームテストをします。

5秒毎にHelloWorldが表示されれば成功です。

ステップ5:ゴールフラッグ形式ゲームの作成

今回はマリオブラザーズの様なプレイヤーがフラッグにタッチする事でゲームエンドになるゲームを作成してみます。

1.まず、ゴールのアクターを作成します。MyGoal.ucを作成し、以下のコードを記述します。

class MyGoal extends SkeletalMeshActorSpawnable placeable; var() bool bGoal; simulated event PostBeginPlay() { GotoState('Active'); super.PostBeginPlay(); } auto state Active { event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal) { GotoState('Complete'); //タッチされたらCompleteステートに移行 } } state Complete { event BeginState(Name PreviousStateName) { bGoal=true; //bGoalをTrueに変更 } } DefaultProperties { //フラッグのスケルトンメッシュ Begin Object Name=SkeletalMeshComponent0 SkeletalMesh=SkeletalMesh'CTF_Flag_IronGuard.Mesh.S_CTF_Flag_IronGuard' End Object Components.Add(SkeletalMeshComponent0) //当たり判定のコリジョン Begin Object Class=CylinderComponent NAME=CollisionCylinder CollideActors=true CollisionRadius=+0005.000000 CollisionHeight=+0005.000000 End Object CollisionComponent=CollisionCylinder Components.Add(CollisionCylinder) bCollideActors=true bGoal=false }

上記のコードの内容はゴールアクターに他のアクターがタッチする事で bGoal がfalseから true に変わるという内容です。

2.次にMyGame.ucを開き、 foreach 関数を使ってマップの上に bGoal=false の MyGoal が存在しない場合、5秒後にゲームエンドになるというコードを書きます。

class MyGame extends UTGame; function PostBeginPlay() { SetTimer(0.1, true, 'CheckGoal');//ゲーム開始から0.1秒毎にCheckGoal()を実行 super.PostBeginPlay(); } function CheckGoal() { local int i; i=bGoal(); if( i<=0 ) //bGoal()に問い合せて答えが0以下の場合ゲームエンド開始 { WorldInfo.Game.Broadcast(self, 'EndStart'); //エンドが始まった事をアナウンス SetTimer(5, false, 'Ending'); //5秒後にEnding()を実行 ClearTimer('CheckGoal'); //CheckGoalはもう使わないのでタイマーをクリア } } function int bGoal() //ワールド内のbGoalがfalseのフラッグ数を計算するファンクション { local int i; local MyGoal MG; foreach WorldInfo.AllActors(class'MyGoal', MG) { if (MG != none && !MG.bGoal) { i++; } } return i; } function Ending() //ゲームエンド、適当。 { local Controller C; local PlayerReplicationInfo Winner; foreach WorldInfo.AllControllers(class'Controller', C) { Winner = C.PlayerReplicationInfo; } EndGame(Winner, "TeamScoreLimit"); } defaultproperties { MapPrefixes[0]="MY" }

Step6:カスタムPawn等を使う

ここまでのチュートリアルで作成したMyGameはUTGameを継承したゲームなのでデフォルトのPawnやPlayerControllerはUTの物が使われています。

このステップではそれらをMyGame独自の物に取り替えます。

1.まず MyPawn.uc を作成します。次にMyPawn.ucを開き以下のコードを書きます。

class MyPawn extends UTPawn; defaultproperties { GroundSpeed=1000 }

コードの内容はUTPawnを継承しつつ移動スピードを1000にするという事です。

2.次にMyGame.ucを開き、デフォルトプロパティに以下のラインを追加します。

DefaultPawnClass=class'MYPawn'

以上でMyGameで使われるデフォルトPawnはMyPawnに変更出来ました。

Step7:ダッシュシステムの作成

このステップではFPSによくあるシフトキーでのダッシュシステムを作成します。

1.まず、C:\UDK\UDK-2011-05\UDKGame\Config\ UDKInput.ini を開き、179行あたりに以下の行を加えます。

Bindings=(Name="LeftShift",Command="GBA_Dush") Bindings=(Name="GBA_Dush",Command="StartDush | OnRelease StopDush")

このコードは左シフトキーを押した時に StartDush 、離した時に StopDush をUCスクリプトに送ります。

2.次にMyPlayerController.ucを作成し、キー入力からの信号を受け取るコードを追加します。

class MyPlayerController extends UTPlayerController; exec function StartDush() { local MyPawn P; P = MyPawn(Pawn); if(P != none) { P.StartDush(); } } exec function StopDush() { local MyPawn P; P = MyPawn(Pawn); if(P != none) { P.StopDush(); } }

このコードはキー入力があった場合、MyPawnのファンクションを実行する為の物です。

3.そして、MyPawn.ucを開きMyPlayerControllerからのコードを受け取る用のコードを書きます。

class MyPawn extends UTPawn; var float DushGroundSpeed; simulated function StartDush() { GroundSpeed=DushGroundSpeed; } simulated function StopDush() { GroundSpeed=default.GroundSpeed; } defaultproperties { GroundSpeed=300 DushGroundSpeed=500 }

4.最後にMyGame.ucを開きデフォルトプロパティに以下のコード追加します。

PlayerControllerClass=class'MyPlayerController'

以上でシンプルなダッシュシステムは完成です。

スクリプトをコンパイルし、インゲームで動作するか試してください。

~

最終更新：2014年03月26日 23:34