2012年1月17日火曜日

Unityを用いたゲーム開発(タワーディフェンス編)Part.1

はじめまして、開発の半沢 匠です。

今話題のゲームエンジンUnity(http://unity3d.com/)を使ってゲーム開発をしてみよう!
という事で、まずは「タワーディフェンス」を作ってみました!

ここでは、作業報告も兼ねて作業経過や開発時に役に立った事等を連載していきたいと思います。


はじめに

Unityとは、簡単に表すと
「Windows及びMacで動作可能な3Dゲーム開発ツール」です。

簡単なGUI操作でコンテンツを構築し、
構築したコンテンツに対してプログラミング言語(JavaScript、C#)を使って動きを作成することができます。
プログラマでない方でも直感的に操作できるインターフェイスになっております。

さらに、Unityはマルチプラットフォームに対応しており、
下記の実行形式に書き出す事が出来ます。

・Windows、MacOSXのOS
・WEBブラウザ
・iPhone、Android
・PS3、Xbox、Wii

Proライセンスは有料ですが、無料版も用意されており、
無料版でも十分な機能が備わっています。

---------------

プレイアブルデモ Part.1
※プレイするにはUnityのwebプレイヤーが必要になります

それなりに動いてはいますが、
ゲームとしてはまだまだまだですね。
ここからゲームらしくなるように調整していきたいと思います。


■スクリプト
Unityはスクリプト言語を使って"ゲームらしさ"を作成することができます。
ここでは、今回開発した際に役に立った事を紹介したいと思います。
今回は C# で開発しております。
こちらでは、ある程度Unityの知識を持った人向けの解説になっております。

・クリックした位置に銃をポップ
画面上でマウス左クリックを押下箇所に銃(GameObject)を生成させます。
- GunPopスクリプトを適当なGameObjectに指定する


public class GunPop: MonoBehaviour {
 public GameObject selectGun   // 生成する銃を指定

 void Update (){
  // マウス左クリック押下したか判定
  if( Input.GetMouseButtonUp(0) ){
   // マウス座標を取得
   Vector3 screenPoint = Input.mousePosition;
   // マウス座標はXYの2次元なのでZ座標にはカメラのZ座標を指定
   screenPoint.z = 17.0f;
   // カメラ座標からワールド座標に変換
   Vector3 worldPoint = Camera.main.ScreenToWorldPoint(screenPoint);
   // 変換されたワールド座標にselectGun(銃のGameObject)のインスタンスを生成
   Instantiate(selectGun, worldPoint, selectGun.transform.rotation);
  }
 }
}


・弾が敵に当たった場合、当たった敵のHPを減らす
- 弾のGameObjectにBulletスクリプトを指定する
- 敵のGameObjectにEnemyStatusスクリプトを指定する
- 弾・敵のGmaeObjectにColliderを設定し、「Is Trigger」にチェックを入れる

public class Bullet : MonoBehaviour {
    public float hitDamage = 1.0f; // 与えるダメージを指定
    void OnTriggerEnter(Collider collisionInfo){
        // 当たったGameObjectのタグが"Enemy"か判定
        if(collisionInfo.gameObject.tag == "Enemy"){
            // 当たったGameObjectに指定されているスクリプトの"ApplyDamege"関数を呼び出し
            // 引数、hitdamage を渡す
            collisionInfo.gameObject.SendMessage("ApplyDamage",hitDamage);
            // 自分自身を消滅させる
            Destroy(gameObject);
        }
    }
}

public class EnemyStatus : MonoBehaviour {
    public float hitPoint = 1.0f; // 自分自身のHPを指定
    void ApplyDamage(float damage){
        // 受けたダメージを自身のHPから減算
        hitPoint-=damage;
        // HPが0以下になったか
        if( hitPoint <= 0.0f ){
            // 自分自身を消滅させる
            Destroy(gameObject);
        }
    }
}


■次回予定
・もう少し銃の配置される場所を明示的にし、敵に弾を当てやすいようにする仕組みを導入
・スコア機能を実装





0 件のコメント:

コメントを投稿