【Unity】2Dでクリックした方向に弾を飛ばす【サンプル】
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
Unity2Dでクリックした方向に弾を飛ばすサンプル
画面タップでも動きます。
前提・準備
・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」を 0 に
・プロジェクトビューにプレハブ化して、シーンからは削除
Cubeの設定
・名前は「Shooter」(任意)
・↑のスクリプト(BallShooter)をアタッチ
・プレハブ(Ball)を「Ball」に紐づけ(インスペクターでドラッグ&ドロップ)
補足
今回は弾の移動はRigidbodyでやっています。
Transformで移動させたければ弾側にスクリプトを持たせた方が楽。
そうしなかった理由は、分かりやすさ重視で、スクリプト1個で出来る範囲で実装したかった為です。
でも、弾を撃って相手にダメージを~的なことをしたければ、やっぱり弾側にスクリプトを持った方が良い。
弾の速度とか威力とかは弾の属性ですしね。そこら辺もいずれまとめます(予定)。
以上です。
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発