日々是好日~every day is a good day~

日常の中の非日常の備忘録

【Unity】ARでカメラの方向に弾を撃つ

これまで作った2Dのシューティングゲームで 撃った弾はカメラの視界から消えたら 
具体的にはy座標が10f以上になったらとか-10f以下になったら非表示にするという処理方法をよく使っていました
3DやARではカメラは360度どの方向にも向けることができるので 同様のやり方だとベクトルで計算しなければならなくなり…いちいち大変
なので一定の時間が経過したら非表示にするという方法でやってみました
1.ARの設定をする(下の記事の12までで できていないものを設定)
everydayisagoodday.hatenadiary.com
2.ヒエラルキーの+をクリックしてUI/古い機能/ボタンを選択

3.オブジェクトの名前をShootButtonに変更し位置 サイズ 形 色等をお好みで調整

4.ヒエラルキーの+をクリックして3Dオブジェクト/スフィアを選択

5.オブジェクトの名前をBulletに変更しサイズを調整 コライダーのトリガーにするをチェック

6.BulletにRigidbodyを追加する

7.プロジェクトタブ内で右クリックし作成/マテリアルを選択

8.オブジェクトの名前をBulletMaterialに変更しインスペクターで好みの色を選択

9.BulletMaterialをBulletにアタッチする Rigidbodyのキネマティックにするをチェック

10.ヒエラルキーのBulletをプロジェクトに移動しプレファブ化する ヒエラルキーのBulletは右クリックして削除

11.プロジェクトタブ内で右クリックし作成/C#スクリプトを選択 名前をBulletCntrlにする

12.BulletCntrlスクリプトを編集

using System.Collections.Generic;
using UnityEngine;

public class BulletCntrl : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float bulletSpeed = 5f;
    public Transform transformCamera;
    public List<GameObject> listOfBullet = new List<GameObject>();
    private List<float> listOfTime = new List<float>();

    // Start is called before the first frame update
    void Start()
    {
        //あらかじめ10個の弾を作っておく
        for (int i = 0; i < 10; i++)
        {
            GameObject obj = Instantiate(bulletPrefab);
            obj.SetActive(false);
            listOfBullet.Add(obj);
            listOfTime.Add(0);
        }
    }

    // Update is called once per frame
    void Update()
    {
        //発射済弾の移動
        BallPositionUpdate();
    }
    private void BallPositionUpdate()
    {
        for (int i = 0; i < listOfBullet.Count; i++)
        {
            if (listOfBullet[i].activeInHierarchy)
            {
                Vector3 moveDirection = transformCamera.forward.normalized * bulletSpeed * Time.deltaTime;
                listOfBullet[i].transform.Translate(moveDirection);
                if (Time.time - listOfTime[i] > 2f)   //発射して2秒たったら非表示
                {
                    listOfBullet[i].SetActive(false);
                }

            }
        }
    }
    //Shootボタンクリック時(非表示の弾を探し位置と時間をリストに設定)
    public void ShootClick()
    {
        for (int i = 0; i < listOfBullet.Count; i++)
        {
            if (listOfBullet[i].activeInHierarchy == false)
            {
                listOfBullet[i].SetActive(true);
                listOfBullet[i].transform.position = transformCamera.transform.position;
                listOfTime[i] = Time.time;
                break;
            }
        }
    }
}

13.ヒエラルキーの+をクリックして空のオブジェクトを作成を選択

14.オブジェクトの名前をBulletに変更し スクリプトをアタッチする

15.BulletのスクリプトにBulletプレファブとMainCameraをアタッチする

16.ShootButtonインスペクターのクリック時()の+をクリックし Bulletオブジェクトをアタッチする

17.NoFunction横の▼をクリックしBulletCntrl/ShootClickを選択

実行すると

カメラの向いている方向に弾が発射され 一定の時間(この場合は2秒)経過すると非表示になります