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を作成したので、それを各オブジェクトにアタッチする必要があります。それと個別に用意したスクリプトもアタッチします。
敵のぶんだけ画像にしましたが、自機についても同じようにします。
敵の弾を作ろう
ここでやること
- 弾オブジェクトの作成とPrefab化(EnemyBullet)
- 空オブジェクトを3つ作成。名前はShotPositionにする
- ShotPositionを敵オブジェクトの子要素して3way弾になるよう弾の角度をずらす
- 再生して確認
弾オブジェクトを作ってアタッチしよう
弾オブジェクトの作成とPrefab化→EnemyオブジェクトのBullet欄にアタッチを行います。弾オブジェクトの名前はEnemyBulletにしました。「EnemyBulletにEnemyScriptとRigidbody2Dのアタッチを忘れずに行うようにします」
空オブジェクトshotPositionをつくろう
空オブジェクトを3つ作って敵オブジェクトの子要素にします。名前はshotPositionにして角度をずらします。
| ゲームオブジェクト名 | X | Y | Z |
|---|---|---|---|
| shotPosition(その1) | 0 | 0 | 160 |
| shotPosition(その2) | 0 | 0 | 180 |
| shotPosition(その3) | 0 | 0 | 200 |
その他いろいろ弾の発射間隔、移動スピードの調整もありますが、ここらへんはお好みで。
ここまでの状態
敵が3ウェイ弾を発射してくる。can shotのチェックをはずせば敵は弾をうってこない。Unityってこざかしい作業が多い。疲れてきた。
次の記事
次の記事は当たり判定を実装していきますが、あらゆるオブジェクトに当たり判定をつけていきます。
【2Dシューティング】Unity公式チュートリアルをやってみる4回目。当たり判定。

コメント