[Unity]カメラの位置からタップした方向にPrefab弾を撃つ方法[ScreenPointToRay]

 

完成形

ブロック崩しのようなものをUnityで制作中。

 

こんな感じでタップした場所に弾が出る、

カメラを移動するとカメラの位置から弾が発射されるようにしたい。

 

現状だとカメラ移動のスワイプでも弾が撃たれてしまってる。

これはGetMouseButtonDown(0)で弾の射出とカメラ移動の両方を判定しているから。

今後スワイプでは弾が出ないように調整する予定、

 

ここまででちょっとハマったので一旦メモしとく。

 

 コード


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

public class BulletGenerator : MonoBehaviour
{

    public GameObject normalBulletPrefab;//通常弾の設計図

    private void Start()
    {
        
    }
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            Vector3 camPos = Camera.main.transform.position;
            GameObject normalBullet = Instantiate(normalBulletPrefab, camPos, Quaternion.identity) as GameObject;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 worldDir = ray.direction;
            normalBullet.GetComponent<NormalBulletController>().Shoot(worldDir.normalized * 2000);
        }
    }
}

 

上記のコードを空のジェネレーターオブジェクトを作って貼り付ける。

normalBulletPrefabに作っておいた弾のprefabをインスペクターからアタッチする。

 

あとはカメラの座標からInstatiateメソッドで弾のPrefabを生成。

タップした場所はInput.mousePositionから取得するが、スクリーン座標なので正しい位置にならない。

なのでScreenPointToRayでタップしたスクリーン座標への向きをワールド座標で取得できる。

 

カメラの移動は下記のリンクのコードを参考に実装。

Unityでオブジェクトを中心にカメラを移動させるスクリプト - Qiita
#スワイプでカメラ移動させたい!!頼む!!最近Unityの楽しさを知ってからというものの、業務でPHPを使いつつ、家ではがっつりゲーム開発というワケワカメな状況を送っているBuzzです。今回はそ…

 

ハマった箇所

Instantiate(オブジェクト)だとprefabのオブジェクトの元の座標にて生成されてしまうらしい。

知らずに40分くらい消え去った。

 

Instantiate(オブジェクト,座標,回転)のように引数で、現在のカメラの座標を指定すればいいだけでした…。

【Unity】PrefabをInstantiateして楽にオブジェクトを配置
もしやGameObjectをひとつひとつ手作業で作成していませんか? もしそうなら、もっと楽にGameObjectを作成する方法を伝授いたしましょう。それはPrefab(プレハブ)の機能と、それを実体化するInstantiateを使う方法です。ほんと便利だから是非。

 

ScreenPointToRayで取得したベクトルが間違ってるのではないかと思い、色々と調べていたが違った。

単にオブジェクトの生成箇所が間違っていただけでした。

 

 

オブジェクトの射出部分に関しては下の本を参考にかきました。