Unity全方位2Dシューティングチュートリアル4回目。弾の作成

「【Unity 入門】全方位シューティングを作る」というサイトのチュートリアルをやってみるシリーズの4回目です。前回は背景のスクロールとマウスカーソルのほうにプレイヤーをむけるというものをやりました。(まったくわかりませんでした)
Unity全方位2Dシューティングチュートリアル3回目。自機へ機能追加

この記事はUnityさわりたての筆者がとりあえず真似して2Dシューティングを作ってみようという感じで書いてますので解説が全く含まれていません。詳細な解説等がしりたいかたは離脱したほうがよいです。

7.弾の作成

弾はUnityのPrefabという仕組みを使ってつくります。

ここでやること

  • 弾のPrefab化
  • 弾のスクリプトを作成
  • UtilsScriptにGetDirection()メソッドを追加
  • 弾のスクリプトを弾のPrefabにアタッチ
  • PlayerScriptに弾に関する変数やメソッドを定義する
  • 弾のPrefabをPlayerオブジェクトにアタッチ

弾のスクリプトを作成

コードを読んでもほとんど理解することができませんでした。解説することができないのでコードとあと画像だけはっときます。Init関数は角度を制御するための関数みたいです。

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

public class BulletScript : MonoBehaviour {
	private Vector3 m_velocity; //速度

	void Update () {
		transform.localPosition += m_velocity;//弾の移動
	}

	//弾を発射するときに初期化するための関数
	public void Init(float angle, float speed){
		//弾の発射角度をベクトルに変換する
		var direction = UtilsScript.GetDirection(angle);

		//発射角度と速さから速度を求める
		m_velocity = direction * speed;

		//弾が進行方向を向くようにする
		var angles = transform.localEulerAngles;
		angles.z = angle - 90;
		transform.localEulerAngles = angles;

		//2秒後に削除する
		Destroy(gameObject, 2);
	}
}

このスクリプトを弾のPrefabにアタッチします。以下アタッチされた状態の画像です。
screenshot 20181209 2234

UtilsScriptにGetDirection()メソッドを追加

このメソッドはBulletScriptで使用されます

public static Vector3 GetDirection(float angle){
	return new Vector3(
	Mathf.Cos(angle * Mathf.Deg2Rad),
	Mathf.Sin(angle * Mathf.Deg2Rad),
	0
	);
}

Player側で弾に関数変数やメソッドを定義

はっきりいってお手上げです。なんの参考にもならないかもしれませんがPlayerScriptのコード全部はっときます。

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

public class PlayerScript : MonoBehaviour {
	public float m_speed; //移動の速度
	public BulletScript m_bulletPrefab; //弾のPrefab
	public float m_bulletSpeed; //弾の速さ
	public float m_bulletAngleRange; //複数の弾を発射するときの角度
	public float m_bulletTimer; //弾の発射タイミングを管理するタイマー
	public int m_bulletCount; //弾の発射数
	public float m_bulletInterval; //弾の発射間隔

	// Use this for initialization
	void Start () {

	}

	//毎フレーム呼び出される関数
 void Update () {
		var h = Input.GetAxis("Horizontal");
		var v = Input.GetAxis("Vertical");

		//矢印キーが押されている方向にプレイヤーを移動する
		var velocity = new Vector3(h, v) * m_speed;
		transform.localPosition += velocity;

		// プレイヤーが画面外に出ないように位置を制限する
	  transform.localPosition = UtilsScript.ClampPosition( transform.localPosition );

		// プレイヤーのスクリーン座標を計算する
		var screenPos = Camera.main.WorldToScreenPoint( transform.position );

		// プレイヤーから見たマウスカーソルの方向を計算する
		var direction = Input.mousePosition - screenPos;

		// マウスカーソルが存在する方向の角度を取得する
		var angle = UtilsScript.GetAngle( Vector3.zero, direction );

		// プレイヤーがマウスカーソルの方向を見るようにする
		var angles = transform.localEulerAngles;
		angles.z = angle - 90;
		transform.localEulerAngles = angles;

		//弾の発射タイミングを管理するタイマーを更新する
		m_bulletTimer += Time.deltaTime;

		//まだ弾の発射タイミングではない場合はここで処理を終える
		if(m_bulletTimer < m_bulletInterval) return;

		//弾の発射タイミングを管理するタイマーをリセットする
		m_bulletTimer = 0;

		//弾を発射する
		BulletNWay(angle, m_bulletAngleRange, m_bulletSpeed, m_bulletCount);
	}

	private void BulletNWay(float angleBase, float angleRange, float speed, int count){
		var pos = transform.localPosition;//プレイヤーの位置
		var rot = transform.localRotation;//プレイヤーの向き

		//弾を発射する場合
		if(1 < count){
			//発射する回数分ループする
			for(int i = 0; i < count; ++i){
				//弾の発射角度を計算する
				var angle = angleBase + angleRange * ((float)i / (count - 1) - 0.5f);

				//発射する弾を生成する
				var bullet = Instantiate(m_bulletPrefab, pos, rot);

				//弾を発射する方向と速さを設定する
				bullet.Init(angle, speed);
			}
		}
	}
}

しいて書くとすればBulletNWayというメソッドで弾を生成するInstatiate()がでてきていることかなと思います。あとはInstantiateの引数でPrefabを生成しているので、BulletScriptで定義したInit()メソッドが使えるということかなと思います(bullet.Init)

PlayerScriptにいろいろ定義したら、PrefabをアタッチできるようになるのでBulletPrefabをアタッチします。とりあえずアタッチした画像はっときます。↓その他定義した変数の値も設定できるようになっているので設定しておきます。
screenshot 20181209 2244

ここまでの状態

なんとか弾がでるようになりました。とりあえずわからないけどシューティングってのはこういうもんかってのを知るために最後まで進めます。上記のコードはなにかボタンを押して弾を発射するようなコードは含まれていないので、自動で弾が発射されるようになっています。
screenshot-20181209-2252

次の記事

次は敵の作成です。
Unity全方位2Dシューティングチュートリアル5回目。敵の作成