【2Dシューティング】Unity公式チュートリアルをやってみる3回目。敵の作成

2Dシューティング】Unity公式チュートリアルをやってみるシリーズの3回目です。前回は自機の移動と弾の発射を実装しました。
【2Dシューティング】Unity公式チュートリアルをやってみる2回目。自機の移動と弾

今回は敵を作成していきます。

敵を作成しよう

ここでやること

使いまわしを最初に作るのですが、まあ深く考えずに。

  • 使いまわし用スクリプトの作成
  • PlayerScriptを修正
  • 敵スクリプトを作成
  • Playerオブジェクト、敵オブジェクトにScriptをアタッチ

使いまわしスクリプトを作ろう

敵または自機で使いまわせるスクリプトを作成します。他スクリプトでGetCompornentを使うことでメソッドとかが使えるようになります。まあこのあたりは考えてもわからないのでさっさとやっていきます。Scriptの名前はSpaceShipScriptにしました。

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class SpaceShipScript : MonoBehaviour
{
  // 移動スピード
  public float speed;

  // 弾を撃つ間隔
  public float shotDelay;

  // 弾のPrefab
  public GameObject bullet;

  // 弾を撃つかどうか
  public bool canShot;

  // 弾の作成
  public void Shot (Transform origin)
  {
    Instantiate (bullet, origin.position, origin.rotation);
  }

  // 機体の移動
  public void Move (Vector2 direction)
  {
    GetComponent<Rigidbody2D>().velocity = direction * speed;
  }
}

PlayerScriptを修正しよう

使いまわし用のスクリプトSpaceShipScriptを作成したのでPlayerScriptでそれを使うように修正します。だるいのでコピペ推奨

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour {
  SpaceShipScript spaceship;

	//Startメソッドをコルーチンとして呼び出す
	IEnumerator Start(){
		// Spaceshipコンポーネントを取得
	  spaceship = GetComponent<SpaceShipScript> ();

		while(true){
			// 弾をプレイヤーと同じ位置/角度で作成
		 spaceship.Shot (transform);

		 // shotDelay秒待つ
		 yield return new WaitForSeconds (spaceship.shotDelay);
		}
	}

	//毎フレーム呼ばれる関数
	void Update () {
		float x = Input.GetAxisRaw("Horizontal");//右・左
		float y = Input.GetAxisRaw("Vertical");//上・下
		//移動する向きを決める
		Vector2 direction = new Vector2(x, y).normalized;
		//移動する向きとスピードを代入する
		spaceship.Move(direction);
	}
}

敵スクリプトの作成

ここもだるいのでコピペ推奨。名前はEnemyScriptにしました。ここらへんはいろいろ難しいとこですが3Way弾うたせることを想定してかいてあります。あと弾を撃つか撃たないかを切り替えるスイッチをSpaceShipScriptに書いているので、falseのときは敵が弾を撃ちません。

using UnityEngine;
using System.Collections;

public class EnemyScript : MonoBehaviour
{
  // Spaceshipコンポーネント
  SpaceShipScript spaceship;

  IEnumerator Start ()
  {
    // Spaceshipコンポーネントを取得
    spaceship = GetComponent<SpaceShipScript> ();

    // ローカル座標のY軸のマイナス方向に移動する
    spaceship.Move (transform.up * -1);

    // canShotがfalseの場合、ここでコルーチンを終了させる
    if (spaceship.canShot == false) {
      yield break;
    }

    while (true) {

      // 子要素を全て取得する
      for (int i = 0; i < transform.childCount; i++) {

        Transform shotPosition = transform.GetChild(i);

        // ShotPositionの位置/角度で弾を撃つ
        spaceship.Shot (shotPosition);
      }

      // shotDelay秒待つ
      yield return new WaitForSeconds (spaceship.shotDelay);
    }
  }
}

Playerオブジェクト、敵オブジェクトにScriptをアタッチしよう

使いまわしScriptを作成したので、それを各オブジェクトにアタッチする必要があります。それと個別に用意したスクリプトもアタッチします。

敵のぶんだけ画像にしましたが、自機についても同じようにします。
scrennshot 20181212 1934

敵の弾を作ろう

ここでやること

  • 弾オブジェクトの作成とPrefab化(EnemyBullet)
  • 空オブジェクトを3つ作成。名前はShotPositionにする
  • ShotPositionを敵オブジェクトの子要素して3way弾になるよう弾の角度をずらす
  • 再生して確認

弾オブジェクトを作ってアタッチしよう

弾オブジェクトの作成とPrefab化→EnemyオブジェクトのBullet欄にアタッチを行います。弾オブジェクトの名前はEnemyBulletにしました。「EnemyBulletEnemyScriptRigidbody2Dのアタッチを忘れずに行うようにします
screenshot 20181212 2005

空オブジェクトshotPositionをつくろう

空オブジェクトを3つ作って敵オブジェクトの子要素にします。名前はshotPositionにして角度をずらします。

shotPositionの角度(Rotationで調整)
ゲームオブジェクト名XYZ
shotPosition(その1)00160
shotPosition(その2)00180
shotPosition(その3)00200

その他いろいろ弾の発射間隔、移動スピードの調整もありますが、ここらへんはお好みで。

ここまでの状態

敵が3ウェイ弾を発射してくる。can shotのチェックをはずせば敵は弾をうってこない。Unityってこざかしい作業が多い。疲れてきた。
screenshot-20181212-2043

次の記事

次の記事は当たり判定を実装していきますが、あらゆるオブジェクトに当たり判定をつけていきます。
【2Dシューティング】Unity公式チュートリアルをやってみる4回目。当たり判定。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78