シューティングゲームを作ろう vol.3

スポンサーリンク

自機の弾の発射を作成します。

シューティングゲームを作ろうvol1でダウンロードした
SpaceShooterAssetPack
から「SpaceShooterAssetPack_Projectiles.png」を使用します。

「SpaceShooterAssetPack_Projectiles.png」をプロジェクトに追加をして下さい。
(ファイルをAssets→Spriteフォルダにドラッグ&ドロップします)

プロジェクトに追加した「SpaceShooterAssetPack_Projectiles.png」をクリックして「Inspector」(画面左側に表示)を開きます。
「SpriteMode」を「Multiple」、「PixelPerUnit」を「8」、「FilterMode」を「Point(no filter)」に変更します。

「SpriteEditor」を開きます。
「PixelSize」をX「8」、Y「8」に設定して分割します。

分割した画像から左から2番目の緑色の弾(SpaceShooterAssetPack_Projectiles.png)をSceneに追加(ドラッグ&ドロップ)します。

追加した緑色の弾のオブジェクト名(Inspectorの一番上の項目)を「PlayerBullet」に変更しましょう。

Projectウィンドウで新規Scriptファイルを作成します。Script名は「PlayerBulletController.cs」です。

Scriptファイル「PlayerBulletController.cs」をダブルクリックして「PlayerBullet」を制御するプログラムを作成しましょう。

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

public class PlayerBulletController : MonoBehaviour
{
    [SerializeField] GameObject p_obBullet;
    //弾の移動速度
    [SerializeField] float p_fMoveSpeed;

    void Start() {
    }

    public bool Move() 
    {
        float fY;
        //縦上方向に座標を更新します
        fY = transform.position.y + p_fMoveSpeed * Time.deltaTime;
        if (fY < 6f) {
        //画面内にある場合
            transform.position = new Vector3(transform.position.x,fY,0f);
        } else {
        //画面外にはみ出た場合
            transform.position = new Vector3(10f,20f,0f);
            return false;
        }

        return true;
    }

    public void SetPos(Vector3 vec3) {
        transform.position = new Vector3(vec3.x,vec3.y+0.25f,0f);
    }
}

「PlayerController.cs」も以下のように処理を追加、変更をします。

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

public class PlayerController : MonoBehaviour
{
  private const int BULLET_NUM = 10;
    //弾オブジェクト
    private GameObject[] p_obBullet = new GameObject[BULLET_NUM];
    private PlayerBulletController[] p_clBullet = new PlayerBulletController[BULLET_NUM];

    // Start is called before the first frame update
    void Start()
    {
    int i;
	GameObject wkObj;

	transform.position = new Vector3(0f,-3f,0f);
        //prefabからPlayerBulletを生成
        wkObj = (GameObject)Resources.Load("PlayerBullet");
        for (i=0;i<BULLET_NUM;i++) {
          p_obBullet[i] = (GameObject)Instantiate(wkObj, new Vector3(10f+i, 20f, 0f), Quaternion.identity);
            p_clBullet[i] = p_obBullet[i].GetComponent<PlayerBulletController>();
            p_obBullet[i].SetActive(false);
        }
    }

    // Update is called once per frame
    void Update () {
	int i;
	Vector3 vecWk;

	if (Input.GetKey (KeyCode.LeftArrow)) {
	  transform.Translate (-0.01f, 0, 0);
	}
	if (Input.GetKey (KeyCode.RightArrow)) {
	  transform.Translate (0.01f, 0, 0);
	}
        //スペースキーが押されたとき弾を発射する
	if (Input.GetKeyDown (KeyCode.Space)) {
          for (i=0;i<BULLET_NUM;i++) {
            	if (p_obBullet[i].activeSelf==false) {
		  p_obBullet[i].SetActive(true);
		 vecWk = new Vector3(transform.position.x + 0.03f,transform.position.y,0f);
		 p_clBullet[i].SetPos(vecWk);
		 break;
		}
	  }
	}

	for (i=0;i<BULLET_NUM;i++) {
	  if (p_obBullet[i].activeSelf==true) {
	    if (p_clBullet[i].Move()==false) {
		  p_obBullet[i].SetActive(false);
		}
	  }
	}
  }
}

Updateメソッドのスペースキーが押されたら弾を発射する処理ですが、生成したp_obBullet[]の中からactiveでないオブジェクトを探し、見つけたらactiveにする処理をしています。

if (Input.GetKeyDown (KeyCode.Space)) {・・・スペースキーが押されたら   
for (i=0;i<BULLET_NUM;i++) {・・・生成したオブジェクト配列数をループする
if (p_obBullet[i].activeSelf==false) {・・・activeでないオブジェクトを探す
p_obBullet[i].SetActive(true);・・・見つけたらactiveにする

その後の処理で、すべてのp_obBullet[]オブジェクトの中からactiveなオブジェクトに対して移動させています。

for (i=0;i<BULLET_NUM;i++) {・・・全てのオブジェクトをループさせる
if (p_obBullet[i].activeSelf==true) {・・・activeなオブジェクトを探す
if (p_clBullet[i].Move()==false) {・・・Move(移動)させる
p_obBullet[i].SetActive(false); ・・・Move()からfalseが返されたらactiveをfalse(無効化)する

ヒエラルキーウィンドウの「PlayerBullet」に「PlayerBulletController.cs」をアタッチ(ドラッグ&ドロップ)して下さい。
Inspectorウィンドウの「PlayerBulletController」の「p_obBullet」にヒエラルキーウィンドウの「PlayerBullet」をアタッチ、「p_fMoveSpeed」に5を設定しましょう。

「PlayerBullet」の設定が終わりましたら、プレハブ(Prefab)化しましょう。
プレハブ化とはオブジェクトの複製を作りやすくなる仕組みです。
ヒエラルキーウィンドウの「PlayerBullet」をプロジェクトウィンドウの「Resource」フォルダに追加(ドラッグ&ドロップ)します。
この操作だけでプレハブ化されました。

上記で修正した「PlayerController.cs」の「Start」メソッドの中で、プレハブを利用して「PlayerBullet」オブジェクトを複製しています。

ここまで出来ましたら実行して、動作を見てみましょう。

スペースキーを押すと自機から弾が発射されると思います。

前回の記事

スポンサーリンク
スポンサーリンク
ImagineWave