Unity不定期便

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

苦節4時間。Unityでゾンビ撃退ミニゲームを作ってみたので手順を公開!

f:id:masatolan:20131123084555j:plain

どうもです!

Unityで、簡単なミニシューティングを作ろうと思い、ゴソゴソしていたら意外にいろいろ勉強する点があったので、忘れないように手順などをメモ代わり的にまとめておきます。

 

まずは素材集めから!

とりあえずAsseStoreから、ゾンビキャラとか舞台になるテクスチャなどをゲットします。(どれも無料のやつです)

 

今回使った「ゾンビ君」はこちらです。

f:id:masatolan:20131123085356j:plain

なかなか、感じが出ていて良いです。

 

舞台の背景は、こちらのテクスチャ使いました。

f:id:masatolan:20131123085404j:plain

 

床は、こちら。

f:id:masatolan:20131123085410j:plain

 

砲台のテクスチャはこれ。

f:id:masatolan:20131123085415j:plain

あと、ゾンビは「Mecanim」を使って動かすので、スターターキットも一緒にゲット!

(Mecanimの詳細はこちら!)

 

舞台を作る!

先ほどゲットしたテクスチャを、舞台に貼り付けるとこんな感じ。 

f:id:masatolan:20131123090619j:plain

まあまあ感じ出てるかな…。

砲台は、CubeとCylinderの組み合わせです。

 

砲台の操作に関しては、スクリプトで…

rigidbody.AddForce ( transform.right * Input.GetAxis ( "Horizontal" ) * speed, ForceMode.Impulse );

 とやってます。

キーボードで矢印キーの左右しか使わない場合は、「Horizontal」を使えば水平方向にしか動かないので便利かと。

あとは、Input.GetKeyDownをつかってスペースキーを押した時に玉のインスタンスを飛ばしています。

 

あと、舞台から砲台が落ちないように、両端にストッパーとなるCubeを配置。

f:id:masatolan:20131123090625j:plain

(多分、スクリプト側で制御できるんだろうけど…)

 

あと、見えない壁を3枚用意して、玉とゾンビのオブジェクトを消すようにしてます。

f:id:masatolan:20131123090629j:plain

①で、発射した玉を消す。

②で、近づいてきたゾンビを消して、ゲーム終了にする。

③は、無くても良いのですが…、なぜか上方向に飛び抜けるゾンビがたまに発生するので、それの対策で消すようにしてます。(たぶん、もっと良い対策がありそうですが…)

 

ゾンビをランダムに出現させる!

ゾンビの出現方法ですが、舞台の奥からランダムに出現して砲台に向かって歩かせたかったので、まず「出現Box」のようなモノを作りました。

f:id:masatolan:20131123092954j:plain

「出現Box」を、Unity搭載の「Animation」機能で左右に動かすようにして、あとはランダムにゾンビを出していくだけ…という感じ。

「Animation」機能については、こちらを参考にどうぞ!

Unity4の「Animation」でオブジェクトをプログラミング無しで動かしてみる! - Unity不定期便

 

「ランダム」の発生スクリプトに関しては、以下のような単純なやつでやってます。

var r : int = Random.Range ( 0, 50 );

 0〜50までの間で乱数を発生させて、rに代入した乱数をif文で「rが0だったら…」みたいな分岐をさせました。

 

ゾンビを自動で歩かせる!

 ゾンビを出現させたら、あとは自動で砲台に向かって歩いてもらうようにしました。

が…、これが、意外にムズかった!

 

いろいろ調べたけど、自動で歩かせるにはやはりスクリプトが必要みたい。でも、どうやってコーディングしたら良いのか…さっぱり。

そんな時に、こちらのサイトが参考になりました!

【Unity4】【mecanim】メカニムを使ってみた・その2

f:id:masatolan:20131123151553j:plain

上記を参考に、スクリプトでMecanimのAnimatorを操作して、勝手に歩いてくれるようにコーディングしてみました。

function OnAnimatorMove() {

      moveDirection = Vector3.zero;
	moveDirection += transform.forward*2;
	animator.SetFloat ( "Speed", 1 );	
	controller.Move ( moveDirection * Time.deltaTime );

}

OnAnimatorMove()関数内で、動きを指定すると良い感じですね。
内容的には、ゾンビの歩くモーションを動かして(SetFloat)、同時に手前にゾンビを移動させる(moveDirection)というスクリプトになっています。
細かい部分は、もう少し勉強したらご紹介できると思います…。

 

当たり判定とエフェクトを付ける! 

無事に、ゾンビが砲台に向かってどんどん歩き出すようになったので、今度は砲台から発射された「玉とゾンビ」の当たり判定を付けてみます。

これは、ほぼスクリプト処理になるのですが、発射された玉の方にスクリプトを貼って処理するようにしました。

f:id:masatolan:20131123151655j:plain

 

スクリプトはこんな感じ。

var bomb : GameObject;
function OnTriggerEnter ( col : Collider ) {

    if ( col.tag == "Player" ) {

		GameObject.DestroyObject ( col.gameObject );
		var thisbomb : GameObject = Instantiate ( bomb, transform.position, transform.rotation );
		score.score += 10;
		Destroy ( thisbomb, 0.5 );		
	}	
	GameObject.DestroyObject ( gameObject );
	
}

tagを使って、ゾンビに当たったのかどうかを判定してます。

玉が外れて、奥側の見えない壁に当ってもスコアを加算しないためでもあります…。あと、単純に消えるだけでは面白くないので、Particleを使ったインスタンスを発生させてから、0.5秒後に消してます。

(今回は、Standard AssetsのParticleを拝借) 

 

効果音とスコアを付ける!

砲台から玉が発射された時に、「ドーン!」と効果音があった方が気持ち良いので付けてみます。

砲台に、サウンドを鳴らすスクリプトを追加するのと、オーディオソースを追加します。

スクリプトは、こういう簡単なヤツです。

var shot : AudioClip; 
function Update() { 
    audio.PlayOneShot ( shot );
}

 

音の素材に関しては、やはりAssetStoreからゲットしました。

f:id:masatolan:20131117174558j:plain

ちなみに、以前作ったゲームでもありましたが、このサウンドのスクリプトは消えてしまうオブジェクトに貼ると鳴らないので注意しましょう。前回、これでちょっとハマリまして…、読者の方にアドバイス頂きました。(今回だと、玉やゾンビなどには貼らないようにする)

 

スコアに関しては、単純なスクリプトです。

guiText.text = "Score = " + score.ToString();

GUITextを配置して、上記スクリプトでスコア表示してます。static指定したscore変数を、ゾンビが消える度に10ずつ足していくだけです。

 

完成!

そして…とりあえず、なんとか完成しました!

f:id:masatolan:20131123084555j:plain

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

 

画面にも表示してますが、キーボードの矢印キーで砲台を操作して、スペースキーで玉を発射します。

ゾンビが、手前まで来たらゲーム終了となります。(私の最高スコアは、1340点でした…)

 

今回は、ゾンビを自動で歩かせる処理に、ちょっと手間取ってしまいました。

でも、知らないことを学習して次に活かせれば良いかな…、と自分で言い聞かせながら、また次回作に取り組みます。

 

 

★もう一つの撃ちまくり系ミニゲームの記事はこれ!

製作6時間!Unityで撃ちまくり系ミニゲームver2を作ったので手順を公開! - Unity不定期便

 

ミニゲーム作りで役立ったベスト書籍
Unity4入門   最新開発環境による簡単3Dゲーム製作

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

 

 

Unity入門 ~高機能ゲームエンジンによるマルチプラットフォーム開発~
 

 

Unityではじめるゲームづくり (DVD付) (ゲープロシリーズ)

Unityではじめるゲームづくり (DVD付) (ゲープロシリーズ)