▶
【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ゲーム開発