【Unity】2Dでクリックした方向に弾を飛ばす【サンプル】


Unity2Dでクリックした方向に弾を飛ばすサンプル


画面タップでも動きます。
クリックした方向に弾を飛ばすGIF

前提・準備


・Unity2018.1.0を使用
・CameraコンポーネントのProjectionはOrthographic
・Cube(弾を撃つ係、シーンに配置、スクリプトをアタッチ)
・Sphere(弾の係、プレハブ、Rigidbody2D)
・弾の移動はRigidbodyで実装(Transform使わない)

スクリプト(BallShooter)


using UnityEngine;

public class BallShooter : MonoBehaviour {

	public GameObject ball;
	float speed;

	void Start () {
		speed = 10.0f;	// 弾の速度
	}
	
	void Update () {

		if (Input.GetMouseButtonDown(0)) {

			// 弾(ゲームオブジェクト)の生成
			GameObject clone = Instantiate(ball, transform.position, Quaternion.identity);

			// クリックした座標の取得(スクリーン座標からワールド座標に変換)
			Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

			// 向きの生成(Z成分の除去と正規化)
			Vector3 shotForward = Vector3.Scale((mouseWorldPos - transform.position), new Vector3(1, 1, 0)).normalized;

			// 弾に速度を与える
			clone.GetComponent<Rigidbody2D>().velocity = shotForward * speed;

		}
	}
}

クリックした座標の取得はカメラの位置が基準となっているため、カメラのZ座標を考慮する必要がある。
向きの生成で記述しているnormalizedが正規化。
正規化しないと、遠くをクリックしたときは弾が速く、近くをクリックすると遅くなってしまう。
Unityのバージョンによって、InstantiateのAPIに差異がある。(Unityが古いと動かないかも)

Shpereの設定



・名前は「Ball」(任意)
・Rigidbody2D の「Gravity Scale」を 
・プロジェクトビューにプレハブ化して、シーンからは削除

Cubeの設定



・名前は「Shooter」(任意)
・↑のスクリプト(BallShooter)をアタッチ
・プレハブ(Ball)を「Ball」に紐づけ(インスペクターでドラッグ&ドロップ)

補足


今回は弾の移動はRigidbodyでやっています。
Transformで移動させたければ弾側にスクリプトを持たせた方が楽。
そうしなかった理由は、分かりやすさ重視で、スクリプト1個で出来る範囲で実装したかった為です。
でも、弾を撃って相手にダメージを~的なことをしたければ、やっぱり弾側にスクリプトを持った方が良い。
弾の速度とか威力とかは弾の属性ですしね。そこら辺もいずれまとめます(予定)。

以上です。

今月のUnity新着記事
【簡単!】Unity2Dでクリックした方向に弾を飛ばすサンプル
  • このエントリーをはてなブックマークに追加

PAGE TOP