第04回

第04回 敵を作成しよう

プロジェクトの準備

  1. このページは 2Dシューティングゲーム を初心者用に簡略化したものです。
    ダウンロードした「第03回プロジェクト」から Assets/Scene/Stage.unity のダブルクリックで起動します。
    起動できないときは Shooting Guid を参照して下さい。
    Script にエラーがあるらしく、このままでは動かないのでエラーを修正します。
    1. Assets/Script/Bullet.cs を修正します。
      Bullet.cs は PlayerBullet にアタッチされています。
      PlayerBullet には二発の弾が設定されていて、この弾を移動するために使われます。
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class Bullet : MonoBehaviour
      {   public int speed = 10;
      
          void Start ()
          {   GetComponent<Rigidbody2D>().velocity = transform.up.normalized * speed;
          }
      }
      
    2. Assets/Script/Player.cs を修正します。
      Player.cs は Player にアタッチして、弾丸を連射するためと矢印キーで Player を操作するために使われます。
      Player では弾を連射するために public GameObject bullet; に PlayerBullet を設定します。
      PlayerBullet には、その子要素として二発の弾が設定されています。
      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class Player : MonoBehaviour
      {
          public float speed = 5;
          public GameObject bullet;
          
          IEnumerator Start ()
          {
              while (true) {
                  // 弾をプレイヤーと同じ位置/角度で作成
                  Instantiate (bullet, transform.position, transform.rotation);
                  // 0.05秒待つ
                  yield return new WaitForSeconds (0.05f);
              }
          }
          
          void Update ()
          {
              float x = Input.GetAxisRaw ("Horizontal");
              float y = Input.GetAxisRaw ("Vertical");
              Vector2 direction = new Vector2 (x, y).normalized;
              GetComponent<Rigidbody2D>().velocity = direction * speed;
          }
      }
      
  2. 修正が終わると、画面下の赤いエラーメッセージが消えます。
    再生ボタンで弾を連射しながら矢印キー(←→↑↓)の操作で Player が移動することを確認して下さい。
    第04回ではスクリプトの使い回しをしていますが、解り難いので使い回しを外しています。
    よって Player の Scenes はこれで完成です。
    メニューから File→Save Scene で保存して一度終了して下さい。

敵を作成

  1. プロジェクトフォルダーに格納されている Assets/Scenes/Stage のダブルクリックで起動します。
    敵の作成は、基本的にプレイヤーの作成手順と同様です。
    ヒエラルキービューに Player が残っていれば右クリックから削除して下さい。
  2. Assets/Prefabs から Enemy をヒエラルキービューにドラッグします。
    Enemy の Inspector から Add Component ボタンをクリックして Physics 2D→Rigidbody 2D を追加します。
    Rigidbody 2D の Gravity Scale を 0 に設定して下さい。
  3. Assets/Scripts のフォルダーを選択して Projectタブ→Createタブ→C#Script から Enemy.cs を作成します。
    Enemy.cs は敵のシップを移動するために使われます。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Enemy : MonoBehaviour
    {
        void Start ()
        {   GetComponent<Rigidbody2D>().velocity = transform.up.normalized * -1;
        }
    }
    
  4. Enemy ゲームオブジェクトに Enemy.cs をアタッチします。
    (アタッチがうまく出来ないことがちょくちょくあるようで、そのときは Unity Project を参照して下さい)
    ゲームを再生すると Enemy がアニメーションしながら下に移動します。
    Prefabs の Object を修正したときは、Inspector から Prefab/Apply タブ(Inspector の右上)をクリックして更新して下さい。

敵の弾

  1. 第04回のプロジェクトは解り難いので、スクリプトの使い回しを外して簡単にします。
    正規のプロジェクトは 2Dシューティングゲーム からダウンロードして下さい。
    敵の弾(Sprites/Bullet/Bullet_1)をヒエラルキービューにドラッグして名前を EBullet にします。
    EBullet(敵の弾の画像)に Rigidbody2D をアタッチして Gravity Scale を 0 に設定して下さい。
  2. Assets/Scripts のフォルダーを選択して Projectタブ→Createタブ→C#Script から EBullet.cs を作成します。
    EBullet.cs は敵の弾を移動するために使われます。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class EBullet : MonoBehaviour
    {
        void Start ()
        {   GetComponent<Rigidbody2D>().velocity = transform.up.normalized * 2;
        }
    }
    
  3. EBullet.cs を EBullet にアタッチして下さい。
    再生ボタンをクリックして実行すると、弾丸が発射されます。
    Enemy と EBullet の位置がずれているときは、Inspector の Position で調整して下さい。(X, Y ともゼロにすればOK?)
    EBullet を Assets/Prefabs にドラッグして、ヒエラルキービューの EBullet を右クリックから削除して下さい。
  4. メニューの GameObject/Create Empty から EnemyBullet を作成します。
  5. Assets/Scripts のフォルダーを選択して Projectタブ→Createタブ→C#Script から EnemyBullet.cs を作成します。
    EnemyBullet.cs は3発ずつの弾を連射するために使われます。
    3発の弾は「160度, 180度, 200度」回転した方向に発射します。
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class EnemyBullet : MonoBehaviour {
        public GameObject bullet;
    
        IEnumerator Start()
        {   while(true)
            {   transform.rotation = Quaternion.identity;
                transform.Rotate(new Vector3(0, 0, 1), 160);
                Instantiate (bullet, transform.position, transform.rotation);
                transform.Rotate(new Vector3(0, 0, 1), 20);
                Instantiate (bullet, transform.position, transform.rotation);
                transform.Rotate(new Vector3(0, 0, 1), 20);
                Instantiate (bullet, transform.position, transform.rotation);
                yield return new WaitForSeconds (0.3f);
            }
        }
    }
    
  6. EnemyBullet.cs を EnemyBullet にアタッチして下さい。
    (アタッチがうまく行かないときは Unity Project を参照して下さい)
    public GameObject bullet; を宣言すると Inspector に Bullet が追加されます。
    画面右の Bullet にヒエラルキービューから移動した Asset/EBullet をドラッグして設定します。
    再生ボタンで実行すると3発の弾丸が広がるように連射されます。
  7. ヒエラルキービューの EnemyBullet を Enemy の子になるように設定して下さい。
    (Enemy が表示されていないときは Assets/Prefabs からドラッグ)
    ゲームを再生すると Enemy が弾を連射しながら下方向に移動します。
    画面を閉じると保存の確認があるので保存して終了します。
  1. 今回のプロジェクトもかなり解り難いので、スクリプトの使い回しを外して作成しています。
    また、弾を発射する Enemy と発射しない Enemy が作られていますが、これも外しています。
  2. 省略したプログラムの詳細は 2Dシューティングゲーム から 「第04回 敵を作成しよう」を参照して下さい。
    第04回の完成したプロジェクトは、後部の「今回のプロジェクトファイルをダウンロード」からダウンロードすることが出来ます。

[Next Chapter ↓] Shooting-05
[Previous Chapter ↑] Shooting-03

前田稔の超初心者のプログラム入門
超初心者のプログラム入門(Unity)