Unity不定期便

Unityエンジンを使って、いろいろ勉強したことをメモ代わりにまとめてます。

Unityでコイン落としゲームを作ってみたら意外に簡単だった…。(手順も公開)

f:id:masatolan:20131202153700j:plain

Unityエンジンを使って、今までいくつかミニゲームを作ってきましたが、定番とも言える「コイン落としゲーム」をまだ作っていなかったので挑戦してみました。

例のごとく、忘れないように手順をログ的に明記しておきます。

 

素材集めから!

まずは、ゲームで使う素材などをAsset Storeからゲットしていきます!

Gold Coins

f:id:masatolan:20131202151132j:plain

普通のコインはUnityのCylinderで代用していますが、スペシャルコインはこちらを使いました。

 

Clock

f:id:masatolan:20131202151137j:plain

時計のアイテムが欲しかったので、こちらで…。

ちなみに、片側にしか時計面が無いので、今回は2枚貼りあわせて使ってます。

 

FREE Christmas Assets

f:id:masatolan:20131202151142j:plain

クリスマス近いし…、ということで色々アイテムをゲット!

 

Metal Textures Pack

f:id:masatolan:20131123085415j:plain

舞台のテクスチャー関連です。

 

Skybox Volume 2

f:id:masatolan:20131123085404j:plain

バックの背景用に、メインカメラにこのSkyboxを貼り付けました。

 

Free SFX Package

f:id:masatolan:20131202151147j:plain

コインの音や、ミュージックなどなどは、こちらから!

これで、だいたいの素材はOKです。これだけ集めても「無料」というのは素晴らしいですね…。

 

筐体を作る!

早速、コイン落としの筐体を作ります。

と言っても、Cubeを組み合わせるだけですが…。

f:id:masatolan:20131202153834j:plain

①Cubeを少し大きく引き伸ばして、ゲットしたテクスチャを貼り付けてます。

②無くても良いのですが、コインがここに落ちたらポイントになることを明確にするため…。

③プッシャーです。

前後に動く必要があるので、以前のようなアニメーション機能で作成しようと思ったのですが、そうするとコインが落ちた時に上手く緩衝してくれないので、スクリプトで動かすことに。

で、助けてもらった動画がこちら!

ちょうど、プッシャーを動かす部分をスクリプトでやってくれていたので、マルっと真似てます。 

    var offs = Vector3 ( 0, 0, Mathf.Sin ( Time.time ) );
	rigidbody.MovePosition ( origin + offs );

}

プッシャーにはrigidbodyを付けて、MovePositionで動かしてます。

今回「Mathf.Sin」という方法がとても勉強になりました。ちょうどいい感じに、周期的な動きをしてくれるのでいろいろ使えそう。

 

あとは、落ちたコインのインスタンスを回収するゾーンを作ります。

f:id:masatolan:20131202153841j:plain

①は、単純に落ちたオブジェクトを消すというだけです。 

function OnTriggerEnter ( col : Collider ) {

    GameObject.Destroy ( col.gameObject );

}

で、②に落ちたオブジェクトの種類に応じて、色々特典を付与する感じです。

とりあえず、オブジェクトそれぞれに「タグ」を付けて、判別できるようにしてます。 

f:id:masatolan:20131202155718j:plain

スクリプトも一緒に貼り付けます。

function OnTriggerEnter ( col : Collider ){

    if ( !score.gameover ) {
		if ( col.tag == "Coin") {
			audio.PlayOneShot ( shot );
			score.coin += 1;
		}else if ( col.tag == "Gold") {
			audio.PlayOneShot ( shot );
			score.coin += 5;
		}else if ( col.tag == "Clock") {
			audio.PlayOneShot ( shot );
			time.time += 10;
		}else if ( col.tag == "star") {
			audio.PlayOneShot ( shot );
			score.coin += 30;
		}else if ( col.tag == "present") {
			audio.PlayOneShot ( shot );
			score.coin += 100;
			time.time += 30;
		}
	}

}

static変数の「score.coin」でコイン枚数を増やし、「time.time」で制限時間を増やしてます。(あと、コインが落ちた時のサウンドも同時に鳴らしてます)

あとから気付いたのですが、アイテム数がもう少し増えればSwitch分の方が良いかもね。

 

コインを落とす!

コインの落とし方ですが、色々考えたものの…、上空からランダムに落ちるようにしました。(一番、手っ取り早い…)

f:id:masatolan:20131202161557j:plain

空のゲームオブジェクトを上空に用意して、そこからキーボードのスペースキーを押す度にコインがランダムな位置に落ちる…という感じ。

スクリプトは以下。(同じような構文が続くので途中まで…)

function Update () {

    if ( !score.gameover ) {
		if ( Input.GetKeyDown ( "space")) {
			var r : int = Random.Range ( 0, 60 );
			offs = Vector3 ( Random.Range ( -2, 3 ), 0, 0 );
			if ( r <= 35 ) {
				Instantiate ( bullet, transform.position + offs, transform.rotation );
				audio.PlayOneShot ( drop );
				score.coin -= 1;
				}else if ( r <= 47 ) {
					Instantiate ( bullet1, transform.position + offs, transform.rotation );
					audio.PlayOneShot ( drop );
				}else if ( r <= 50 ) {
					Instantiate ( bullet2, transform.position + offs, transform.rotation );
					audio.PlayOneShot ( drop );
                                }
          ↓以下続く…

X軸上に、Randomを使ってバラバラにコインを落とすようにしてます。

あとは、生成された乱数によって、何のオブジェクトを出現させるかを割り振ってるだけです…。

 

スコア関連の表示!

ゲーム画面の作成です。

GUITextを配置して、スコアと制限時間、インフォメーションを作成。

f:id:masatolan:20131202163913j:plain

ちなみに、以前にご紹介した方法でサクッとフォントを変えてます。

 

あと、今回初めてGUITextureを使ってみました。

単純にPC上で作った画像を、簡単に貼り付けられるので便利です。(今回は、png形式の透過情報が入った画像を使ってます)

 

コインの初期配置!

これでだいたい完成なのですが、ゲームが始まって筐体上にまったくコインが無いと寂しいので、あらかじめコインを配置しておきます。

f:id:masatolan:20131202162500j:plain

若干、コインを浮かせるように配置しているので、ゲームが始まると同時に「ドン!」とコインたちが一斉に筐体へ落ちる演出を作ってます。

 

完成!

これで、コイン落としゲームは完成です!

f:id:masatolan:20131202153700j:plain

【ゲームはコチラから遊べます!(PC環境推奨)】

 

それにしても…、Unityを使うとこういう感じのゲームは、本当に簡単に出来てしまいますねぇ。

ありがたいです。(ちなみに、今回は製作時間5時間ほど…)

 

さて、次は何を作ろうか…。

 

コイン落としゲームの参考になった書籍
Unity4入門   最新開発環境による簡単3Dゲーム製作

Unity4入門 最新開発環境による簡単3Dゲーム製作