こんにちは。【2Dシューティング】Unity公式チュートリアルをやってみるシリーズの7回目です。前回は敵の軍隊を実装しました。
【2Dシューティング】Unity公式チュートリアルをやってみる6回目。敵の軍隊
今回はタイトルを移動制限としたが、音をならす項目があるので先にそちらをやっていく。音に関しては効果音のとこだけちょっとコードがでてくるくらいで簡単かつゲームシステムとあまり関係ないのでとばしてもいいだろう。
音をならそう
ここでやること
- Soundフィアルをhierarkhyにおく
- Playerにshot効果音をアタッチ。ちょいとコード追加
- 爆発Prefabに爆発効果音をアタッチ
簡単なので一気にやって音を出そう
BGMは指定のサウンドファイルをhierarkhyに置くだけ。
ショット効果音に関してはPlayerオブジェクトに「SEフォルダ」の「shot」ファイルをアタッチ。スクリプトに効果音を鳴らすためのコードを追加する。Shot関数の下に一文追加するだけだ。音まではブログにのせないが、チュンチュンうるさいショットだった。
spaceship.Shot (transform); // ショット音を鳴らす GetComponent<AudioSource> ().Play();
爆発は爆発Prefab(Explosion)に効果音ファイルの「boom」をアタッチするだけ、なのだが・・・やり方によってはうまくいかないことがあるだろう。そのときは爆発Prefabでadd componentから空のAudio Sourceを追加して、そこに効果音ファイルをアタッチする方法もある。
全く内容が薄いので次の項目いきます。
Playerに移動制限をかけよう
ここでやること
- PlayerScriptにMoveメソッド追加(移動制限をかけるため)
- SpaceShipScript定義したMoveメソッドはもう使わないので消す
- EnemyScriptにもMoveメソッド追加
Scriptを修正していこう
実をいうと今Playerが画面外にいけるような状態になっている。公式チュートリアルはDestoryAreaより外に出るとOnTriggerExit2Dが働いて、自機が消滅すると書いてるが、レイヤーで調整しているため関数は無視され、画面外にいきほうだいになっている。これを改善するためPlayerScriptを修正する。
修正するくらいならはじめからそうかいとけよって感じだ。公式チュートリアルはクソだ。
void Update () { / * 略 * / //spaceship.をはずす↓ Move(direction); } // 機体の移動 void Move (Vector2 direction) { // 画面左下のワールド座標をビューポートから取得 Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0)); // 画面右上のワールド座標をビューポートから取得 Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1)); // プレイヤーの座標を取得 Vector2 pos = transform.position; // 移動量を加える pos += direction * spaceship.speed * Time.deltaTime; // プレイヤーの位置が画面内に収まるように制限をかける pos.x = Mathf.Clamp (pos.x, min.x, max.x); pos.y = Mathf.Clamp (pos.y, min.y, max.y); // 制限をかけた値をプレイヤーの位置とする transform.position = pos; }
//Moveメソッドを消す
IEnumerator Start () { / * 略 * / // spaceship.をはずす↓ Move (transform.up * -1); / * 略 * / } // 機体の移動 public void Move (Vector2 direction) { GetComponent<Rigidbody2D>().velocity = direction * spaceship.speed; } / * 略 * /
さまざまな修正をする
公式チュートリアルと同じようにやってないところもあり、いろいろうまくいってないところをあげてみる。
- 敵が画面外に出ても消えない→レイヤーを変更してOnTriggerExit2Dを無視しているため
- 上に移動すると自機が死ぬ→上に移動すると自分の弾にあたって死ぬ。レイヤーの設定をさぼった
自機が自滅するのはレイヤーですぐに修正できるが、敵の件は困りものだ。レイヤーをデフォルトに戻すと、DestroyAreaと敵が衝突することになってしまい、ゲームが始まった瞬間敵が爆発する。これを改善する方法はオブジェクトにタグをつけることだ。Playerの弾(Bullet)にPlayerBulletという名前のタグをつけた。
これでPlayerBulletと当たったときだけという条件分岐を表現できるようになるのでEnemyScriptのOnTriggerEnter2Dを以下のようにした。
void OnTriggerEnter2D (Collider2D c){ if(c.gameObject.CompareTag("PlayerBullet")){ Destroy(c.gameObject);//弾の削除 spaceship.Explosion();//爆発する Destroy(gameObject);//敵の削除 } }
これで敵のレイヤーをデフォルトに戻しても敵が爆発しなくなる。今回はいろいろ雑だったがこんなところだ。移動制限も決まり文句っぽいところがあるのでコピペコピペでいいだろう、たぶんこのブログを見ても意味不明なので公式チュートリアルを見たほうがいい。
次の記事
次の記事はゲームタイトルの作成です。Xキーをおすとゲームがはじまるよう調整します。
【2Dシューティング】Unity公式チュートリアルをやってみる8回目。タイトルをつける
コメント