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
作成されたファイルをアップすれば遊べます!
次は何つくろうかな〜。