概要
このチュートリアルでは1からある程度動くゲームを作成します。2011年11月の更新です。
1.UDKの入手
上記のページ右上のDawnLoad UDKからUDKをダウンロードする事が出来ます。
2.各種ツールの入手&インストール
コーディング関係
必ずしもVisual Studioでコーディングをする必要はありませんが、メモ帳などでするよりかは効率的です。
3DCG関係
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