Unity3Dで簡単なシューティングゲームを開発してみました。

こんにちわ!バッティングセンターの筋肉痛が2日遅れで来た

自称24歳のおっさんこと私です。



まいどお馴染みUnity3Dでほんと〜〜〜に簡単なシューティングゲームを開発してみました。

その過程をメモったので公開します!

宜しければご参考ください。(といってもいろいろ突込みどころあると思いますがw)



バグはある。それは知っていますが、アドバイスなどその他いろいろは

gakushi0130(あっと)gmail.com または @gakushi0130まで。



完成ゲーム 動作↓

http://dl.dropbox.com/u/22293811/ShootingGame.html



ゲーム説明



左右キーで移動

スペースで弾を発射します。



Start Gameで開始



1000点とると勝ち

3回隕石に当たると負け



仕様設計?なにそれ?美味しいの?





1, キャラクターを作成する。

GameObject -> Create Other -> Cube

キューブが出来る。

Cubeの名前をPlayerに変更



2, 照明を作成する。

GameObject -> Create Other -> Directional Light

照明が出来る。



3, メインカメラの設定

MainCamera -> Inspector

Background : #000

Projection : Orthographic

Size : 5

上記のように変更する。

このカメラ設定が2Dゲームの基本になる。





4, プロジェクトセッティング 入力に関してのセッティング確認

Edit -> Project Setting -> Input



Horizontal : 左右の動きを設定する。

Vertical : 上下の動きを設定する。





5, 矢印キー左右で動くように設定



PlayerBehaviourScript.js


var playerSpeed : int;

function Update () {
	// Input.GetAxis("Horizontal") : X軸を返す。
	// Time.deltaTime : 最後のフレームが完了するために使った時間
	amtToMove = (playerSpeed * Input.GetAxis("Horizontal")) * Time.deltaTime;
	
	// transform.Translate : 指定した方向と値で移動する。
	transform.Translate(Vector3.right * amtToMove);
}





6, Rigidbodyの設定

Rigidbodyはプレイヤーの物理シュミレーションなどを設定する。

UseGravity : 重力 OFF

Is Kinematic : 運動力学 ON

※ 何が変わったかチェックすること。

上記のように設定





7, プレイヤーの残機とスコアを入れる変数を作成する。



PlayerBehaviourScript.js


var playerLives : int;

// static : 全てのコードで有効な変数
static var playerScore : int;





8, 画面上にスコアと残機数を表示する。



PlayerBehaviourScript.js


function OnGUI(){
	
	// GUI.Label : 画面上に文字を表記する。
	// Rect : 2Dで位置とサイズを指定する。
	GUI.Label(Rect(10,10,200,50), "Score: " + playerScore);
	GUI.Label(Rect(10,30,200,50), "Lives: " + playerLives);
}





9, 弾を作成する。



Edit ->GameObjedt -> Sphere

玉が作成される。

大きさを調整する。

Scale X Y Z : 0.3

名前をBulletに変更する。



マテリアル作成

Project -> Create -> Material

名前をBulletMaterialとする。

色を調整したあとBulletにドラックアンドドロップで色を変更する。



BulletにRegitbodyを適応させる。

Compornent -> physics -> Rigidbody

Playerと同じように設定する。

Use Gravity : Off

Is Kinematic : On



10, 弾を制御するスクリプトを作成する。



BulletBehaviourScript.js


var bulletSpeed : int;

function Update () {
	
	// キー入力に関係せず上に飛ぶ。
	amtToMove = bulletSpeed * Time.deltaTime;
	transform.Translate(Vector3.up * amtToMove);
	
	// Yが6.5に達した場合 Bulletを削除する。
	if(transform.position.y >= 6.5){
		Destroy(gameObject);
	}
	
}





11, Bulletをプレハブ化する。

※ プレハブ化とはゲームオブジェクトの「作り置き」

Create -> Prefab

名前をBulletPrefabとする。

Bullet GameObjectをBulletPrefabにドラックアンドドロップ

Bullet GameObjectはいらないので削除する。



PlayerBehaviourScript.js

var Bullet : Rigidbody;



Inspector -> Bulletの箇所にBulletPrefabをドラックアンドドロップする。









12, プレイヤーから弾を発射できるようにする。



PlayerBehaviourScript.js


function Update () {
	
	amtToMove = (playerSpeed * Input.GetAxis("Horizontal")) * Time.deltaTime;
	transform.Translate(Vector3.right * amtToMove);
	
	// スペースを押したかを判定
	if (Input.GetKeyDown("space")) {
		
		// Bullet GameObjectを作成する。
		// transform.position, transform.rotation : Playerの位置を指定する。
		var tempBullet : Rigidbody;
		tempBullet = Instantiate(Bullet, transform.position, transform.rotation);
	}
}





13, 効果音の作成

sfxr

http://www.drpetter.se/project_sfxr.html

cfxr

http://thirdcog.eu/apps/cfxr



それぞれ効果音を作成することができるフリーソフト

弾を打ったときの効果音を適当に作成する。

名前をshootとする。



BulletPrefab -> Compornent -> Audio -> Audio Source



BulletPrefab -> Inspector

Audio Clipにshootをドラックアンドドロップする。



これで弾を発射したとき音がなるようになる。





14, 敵を作成する。



GameObject -> Sphere

名前をEnemyとする。

Project -> Create -> Material

適当にマテリアルを作成してEnemyに適応させる。





15, 敵を制御するスクリプトを作成する。



EnemyBehaviourScript.js


var enemySpeed : int;

function Update () {

	amtToMove = enemySpeed * Time.deltaTime;

	transform.Translate(Vector3.down * amtToMove);

	// 敵が画面外にでた場合にXをランダムで上に戻す。
	if (transform.position.y <= -1) {
		transform.position.y = 9;
		transform.position.x = Random.Range(-15, 5);
	}
}





16, 弾が敵にあたったときの判定を行う。



まず、Enemy GameObject -> Inspector ->Box Collider

Is Trigger を Onにする。



新規タグを追加する。

Enemy -> Inspector -> Tag -> Add Tag

Element0 : Enemy と追加する。

Enemyのタグを先ほど追加したEnemyにする。



※ 必ず Enemy, Player, Bullet の Z軸を0に揃えること。



BulletBehaviourScript.js


// トリガーに接触した場合に呼ばれる。
function OnTriggerEnter(otherObject : Collider){
	
	// Enemyタグに接触した。
	if (otherObject.gameObject.tag == "Enemy"){
		
		//Debug.Log ("Hit!!!");
		
		// 接触後の処理

		// スコアを追加する。
		PlayerBehaviourScript.playerScore += 100;

		// 弾, 敵の削除再配置
		otherObject.gameObject.transform.position.y = 9;
		otherObject.gameObject.transform.position.x = Random.Range(-15, 5);

		Destroy(gameObject);
	}
}





18, 弾が敵にあたったときの爆発の演出



Edit -> GameObject -> Create Other -> Particle System

名前をExplosionとする。

Size関係やParticle Animator で爆発のアニメーションを調整する。

※ AutodestructをOnにすること。消えなくなる。



Explosionをプレハブ化する。

Create -> Prefab

名前をExplosionPrefabとする。



爆発の効果音を作成する。

ExplosionPrefab -> Compornent -> Audio -> Audio Source

効果音をExplosionPrefabにドラックアンドドロップして適応させる。



BulletBehaviourScript.js


var explosionPrefab : Transform;



BulletPrefab -> Inspector -> Explotion

ExplosionPrefabをドラックアンドドロップする。





BulletBehaviourScript.js

OnTriggerEnter 追加


		var tempExplosion : Transform;
		tempExplosion = Instantiate(Explosion, transform.position, transform.rotation);







19, プレイヤー衝突判定と爆発アニメーション



Edit -> GameObject -> Create Other -> Particle System

名前をPExplosionとする。

Size関係やParticle Animator で爆発のアニメーションを調整する。

PExplosionをプレハブ化する。



PlayerBehaviourScript.js


var PExplosion : Transform;



BulletPrefab -> Inspector ->P Explotion

PExplosionPrefabをドラックアンドドロップする。





PlayerBehaviourScript.js


function OnTriggerEnter(otherObject : Collider){

	if(otherObject.gameObject.tag == "Enemy"){

		otherObject.gameObject.transform.position.y = 9;
		otherObject.gameObject.transform.position.x = Random.Range(-15, 5);

		// プレイヤー爆発アニメーション
		var tempPExplosion : Transform;
		tempPExplosion = Instantiate(PExplosion, transform.position, transform.rotation);

		// ライフを減らす。
		playerLives -- ;
	}
}





20, 勝敗判定



PlayerBehaviourScript.js

Update 関数内


	if(playerScore >= 1000){
		print("YouWin!!!");
		Application.LoadLevel(3);
	}else if (playerLives <= 0){
		//print("YouLose...");
		Application.LoadLevel(2);
	}





21, メインメニュー, 勝利, 敗北画面作成



File -> NewScene

名前をmainMenue, win, loseとそれぞれ作成する。



File -> Build Setting

全てのシーンを放り込む。そのまま閉じる。





22, メインメニューのスクリプトを作成する。



以下のスクリプトをMainCameraに適用させる。



mainMenueBehaviourScript.js


function OnGUI () {

	instructionText = "左右キーで移動\nスペースで弾を発射します。";
	GUI.Label(Rect(10,10,300,200), instructionText);

	if (GUI.Button(Rect(10,60,200,50), "Start Game")){
		Application.LoadLevel(1);
	}
}





23, 敗北のスクリプトを作成する。



以下のスクリプトをMainCameraに適用させる。



LoseBehaviourScript.js


function OnGUI () {
	if(GUI.Button(Rect(10,10,300,50), "You Lose... Press To Play Again!")){
		Application.LoadLevel(0);
	}
}





24, 勝利のスクリプトを作成する。



以下のスクリプトをMainCameraに適用させる。



WinBehaviourScript.js


function OnGUI () {
	if(GUI.Button(Rect(10,10,300,50), "You Win!!! Press To Play Again!")){
		Application.LoadLevel(0);
	}
}





25, Web で遊べるようにビルドする。



File -> Build Setting -> Build

作成されたファイルをアップすれば遊べます!


次は何つくろうかな〜。