アクションゲームを作る2 ゲームの流れを作る


今回は前回の記事:アクションゲームを作る CharacterControllerで作ったゲームにタイトル画面やクリア画面といった画面を追加してゲームの流れを作ります。

今回の作成講座は前回の記事で作ったプロジェクトを使って制作を進めて行きますので、前回の記事を読んでいない方は読んでからこの記事を読んでくださいね。


前回のアクションゲームにタイトル画面が追加され、プレイヤーを方向キーで操作して赤い立方体のゴール地点まで到達するとゴール画面が表示されるようになりました。

準備



前回の講座で作ったプロジェクトを開いてください。このような状態になっていますでしょうか。
前回の記事には書いていませんでしたが、ゲーム画面のシーンをtestという名前で保存していました。

Action2-1.jpg


タイトル画面のシーンを作成する


ではタイトル画面を作成していきます。

タイトル画面は別のシーンとして保存しますので、新規にシーンを追加します。

手順としては
1.メニューよりFile -> New Sceneを選択し新規のシーンを追加します。
2.File -> SaveScene より新規のシーンを保存しておきましょう。
3.titleという名前で保存します。
4.Projectパネルにtitleというシーンが表示されます。

Action2-2.jpg

タイトル画面の作成


タイトル画面を作りましょう。

今回は適当な文字を表示しておきましょう。
メニュー GameObject->CreateOther->3D Textを選択してください。

Action2-3.jpg

するとHelloWorldという文字がSceneパネルに表示されると思います。
そのHelloWorldという文字をMainCameraに映る位置に移動しておきましょう。

表示されているHelloWorldという文字を変更するには3Dtextを選択した状態でInspectorパネルに表示される
TextMesh -> Textの項目を変更してください。
ここではTestActionという文字に変更しました。
Action2-4.jpg

ここまでできたら
メニュー File -> Save Scene (又はCtrl+S) でシーンを保存しておきましょう。

ゴール画面の作成


上記の手順を繰り返して、ゴール画面も作っておきましょう。

goalシーンを追加して、Goalという3Dテキストが表示されるようにしておきましょう。

Action2-5.jpg
こんな状態。

タイトル画面からゲーム画面への遷移



ではタイトル画面でボタンをおしたらゲーム画面へ画面が遷移する処理を作って行きましょう。

Projectパネルのtitleシーンをダブルクリックしてtitleシーンを開いてください。

・メニューよりGameObject -> CreateEmptyで空のゲームオブジェクトを作りMenuという名前に変更
・Projectパネルを右クリック -> Create -> JavaScript でJSを作成しTitleMenuという名前に変更
・ProjectパネルのTitleMenuをドラッグしHierarchyパネルのMenuにドロップ
の操作をそれぞれ行い空のゲームオブジェクトとスクリプトを作り、
スクリプトTitleMenuをMenuに適用しましょう

Action2-6.jpg

TitleMenuをダブルクリックしてスクリプトの編集画面を開いて、以下の様にスクリプトを記述してください。

#pragma strict

function OnGUI()
{
if (GUI.Button(Rect(150, 280, 100, 30), "Start"))
{
Application.LoadLevel("test");
}
}


function Start()とfunction Update()の処理が最初は書いてありますが消してしまってかまいません。

function OnGUI()

上記のOnGUI関数の中ではではカメラの位置に関係なく表示されるボタンやテキストや画像などを表示するための処理を記述することができます。
今回はこの関数内にボタンを表示し、ボタンが押されたら別のシーンを読み込む処理を記述します。

if (GUI.Button(Rect(150, 280, 100, 30), "Start"))

GUI.Button()の関数はUnityのボタンを表示するための関数です。

引数としては
第一引数に座標を指定するRect(x座標, y座標, 幅, 高さ)
第二引数にボタンに表示する文字
を指定します。

このボタンの関数がif文の条件になっていますが、ボタンが押された瞬間だけTrueが返ってくる様になっています。
なのでボタンがクリックされたら以下の
Application.LoadLevel("test");

が実行されます。
Application.LoadLevel()にはシーン名を文字列として渡すとシーンを読み込んでくれます。

ではUnityの画面に戻って実行してみましょう。


ビルドセッティング



上記までの状態で実行してStartボタンを押すとエラーが表示されてしまうと思います。
Level 'test' (-1) couldn't be loaded because it has not been added to the build settings.
To add a level to the build settings use the menu File->Build Settings...


ゲームで読み込むシーンがビルドセッティングで予め登録してある必要があります。
メニュー File -> Build Settings でビルドセッティングの画面を開きましょう。

開いたら真ん中右にあるAddCurrentボタンをクリックしましょうすると現在開いているシーンがScenesInBuildの欄に追加されるとおもいます。Projectパネルのtestシーンとgoalシーンも開いてこの一覧に追加しておいてください。

Action2-7.jpg
ちなみにゲームを再生した場合にScenes In Buildの右端の数字が0番のシーンからゲームがスタートするので、必ずTitleシーンが0番になるようにしておきましょう。
最初に読み込まれるシーン以外の番号は特に順番が入れ替わってしまっていても問題ありません。

以上の操作が上手くできていれば、ゲームを再生して
Title画面のStartボタンを押してゲーム画面に遷移できるとおもいます。

Projectパネルの整理


Projectパネルを見てください。

Action2-8.jpg

goalシーンやPlayerのスクリプト、タイトル画面のスクリプトなど異なる場面の処理に使うオブジェクトが混在していて見づらいです。今後Projectパネルにはもっとオブジェクトが増えていきますので、ここで一回整理をしておきましょう。

Projectパネルで右クリックCreate->Folder を選択するとフォルダを作成することができます。
フォルダを作ったらシーンごとの名前を付け、その中に場面ごとのオブジェクトをドラッグドロップしましょう。

Action2-9.jpg

シーンごとにオブジェクトをまとめることができるので、Projectパネルが非常に見やすくなりました。
このフォルダを作って整理する方法は、シーンやスクリプトを一つのフォルダにまとめる方法や今回の様にシーン別にフォルダにまとめたりといろいろな方法があると思いますので、個人個人で使いやすい方法を模索していってください。

追記:
当記事で説明に使っている画像はUnity3.5のものです。
最新版のUnity4ではProjectパネルは以下の様に変更されました。
Unity4Alert.jpg
Projectパネルに新たにフォルダやその他オブジェクトを作成する場合は右側のフォルダの中身の部分を右クリックするか左上のCreateボタンを押してオブジェクトを作成してください。


ゴールを作成する


では、次はゲーム画面に出てくるゴールを作って行きましょう。

Cubeを作成しGoalと名前を変えましょう。
Goalを良い感じの場所に移動、サイズを変更しましょう。
Action2-10.jpg

次にゴールを半透明の赤い色に変更します。

Projectパネルを右クリック Create -> Material でマテリアルを作成しGoalという名前に変更しましょう。
作成したGoalマテリアルを選択した状態でInspectorパネルのShaderドロップダウンを選択し、
Transparent -> Diffuse を選択しましょう。

Action2-11.jpg

Main Colorの右側の白い枠をクリックし、色の選択画面を開きましょう。
(もしこの欄が表示されていない場合はInspector左上の球をクリックすると表示できます。)

色の選択画面を操作して赤い色を選択しましょう。
半透明にするには一番下のAという欄が半透明度を表す値ですのでこの欄を変更します、ここでは150位がいいでしょう。
Action2-12.jpg

ではGoalマテリアルをHierarchyパネルのGoalゲームオブジェクトにドラッグドロップして適用してください。
Action2-13.jpg


ゴールとプレイヤーの衝突判定


次に「プレイヤーがゴールに触れた」という状況を検出する処理を作成していきます。

・ProjectパネルにGoalスクリプトを作成して、Goalゲームオブジェクトに適用してください。
・次にGoalゲームオブジェクトのInspectorパネルからBoxCollider欄のIsTriggerのチェックボックスをチェックしてください。
IsTriggerにチェックを入れることでオブジェクト同士の衝突を検出することができます。

Action2-14.jpg

次にGoalスクリプトをダブルクリックしてGoalスクリプトを以下の様に記述してください。
function OnTriggerEnter (other : Collider) {

if (other.name == "Player") {
Application.LoadLevel("goal");
}
}


IsTriggerにチェックを入れたオブジェクトに他のオブジェクトが触れるとOnTriggerEnter関数が呼ばれます。
引数としてはCollider型の衝突の情報が格納された引数が渡されます。


if (other.name == "Player") {

上記で衝突してきたオブジェクトの名前を取得し、その名前がPlayerだった場合の処理を実行します。

Application.LoadLevel("goal");

衝突したゲームオブジェクトの名前がPlayerだった場合にタイトル画面のスクリプトにも登場したApplication.LoadLevel()関数でGoalシーンを呼び出します。


完成


ではUnityの画面に戻ってゲームを再生してみましょう。
Playerを操作してGoalに触れるとGoalシーンに画面が切り替われば完成です!


プレイヤーがステージから落下してしまった場合もゴールを作った時と同じように、ステージの下に衝突判定付きのゲームオブジェクトを置いておけば、プレイヤーがステージから落下してしまった場面を検出できますし。
ゴール画面にタイトル画面に戻るボタンを追加してゲームをもう一度プレイできるようにしたり。
プレイヤーがゴールに到着したらゴールのシーンではなくステージ2のシーンを読み込むようにして複数ステージに対応してみたりと、今回の内容を応用すれば様々なゲームが作ることができると思います。

今回は以上です。

<<他の記事を読む

[スポンサードリンク]


このエントリーをはてなブックマークに追加
posted by Unity3d at 2012年11月12日23:05 | Comment(5) | シンプルゲーム作成講座 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
if (GUI.Button(Rect(150, 280, 100, 30), "Start"))で
280じゃなくて100くらいじゃないとうまく表示されなかったです
Posted by 甘裸 at 2014年06月06日 11:41
どうやってもゴールシーンに切り替わらない。。

スクリプトも合ってて、IsTriggerにチェックもついてるんだけどな〜^^;
Posted by 鷹本 at 2014年09月10日 08:20
探しても探しても、コンパイルエラーが多発するばかり。
Posted by BLST at 2014年09月22日 16:49
非常に参考になりました。
後続で迷った方へのアドバイス、最新版のUnity 5.3.0f4では、ビルドセッティングのところが,AddCurrentではなく、Add Open Scenesになっていますが、同じ意味なので、クリックして問題ありません。また、Build Settingsの Scenes In Buildに直接Projectパネルの、シーンをドラッグ&ドロップで持ってきて直接追加することもできます。
ゴールを作成するのところで、バージョンが上がったため、マテリアルのShaderドロップダウンはTransparent -> Diffuseではなく、Legacy Shaders -> Diffuseから選択できます。
Posted by 若葉 at 2015年12月13日 16:10
titleからtestに移動するとなんか暗くなります
Posted by at 2016年10月13日 14:43
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。