Unity でゲームを作ろう 様
弾の発射処理の作り方&エフェクトの追加方法
https://unity.moon-bear.com/zombie-slayer/shoot-an...
・オブジェクトプール ー生成したゲームオブジェクトを破棄せずに再利用する考え方と実装方法例ー ・LayerMask.GetMask メソッド
〇 PlayerController プレイヤーの情報を管理するクラス。体力や弾数などを管理し、外部のクラスに情報提供するクラス。リロード処理、敵の攻撃の当たり判定なども管理する カメラのゲームオブジェクト(AR Camera、あるいは Main Camera ゲームオブジェクト)にアタッチする
〇 EffectManager エフェクトの管理を行うクラス。Create Empty で新しいゲームオブジェクトを作成し、そこにアタッチする シングルトンで作成し、どのクラスからでもアクセスしやすい状態にする。エフェクトなどは個別のゲームオブジェクトに持たせないようにし、管理を簡便化できる
◇RayController 画面のタップ処理(マウスの左クリック)を判定し、Physics.Raycast メソッドを活用して、弾が発射できるかを管理制御するクラス PlayerController から弾数の情報を提供してもらい、PlayerController の弾数の値を更新したり、リロードさせる命令をだす カメラの子オブジェクトとして Create Empty で新しいゲームオブジェクトを作成し、そこにアタッチする
private GameObject muzzleFlashObj; // 生成したエフェクトの代入用 // 発射エフェクトの表示。初回のみ生成し、2回目はオンオフで切り替える if (muzzleFlashObj == null) { // 発射口の位置に RayController ゲームオブジェクトを配置する muzzleFlashObj = Instantiate(EffectManager.instance.muzzleFlashPrefab, transform.position, transform.rotation); muzzleFlashObj.transform.SetParent(gameObject.transform); muzzleFlashObj.transform.localScale = muzzleFlashScale; } else { // 生成済のエフェクトの表示(パーティクルシステムの Play On Awake にチェックが入っていると、エフェクトが再度再生される) muzzleFlashObj.SetActive(true); } // 発射 Shoot(); yield return new WaitForSeconds(playerController.shootInterval); // エフェクト非表示 muzzleFlashObj.SetActive(false);
Yucchiy's Note 様
Unity 2021から利用できるUnity標準のオブジェクトプールについて
https://blog.yucchiy.com/2021/04/objectpool-in-uni...
[SerializeField, Header("Ray 用のレイヤー設定")] private int[] layerMasks; [SerializeField] //Debug用。確認できたら、SerializeField 属性を削除して private にしておく private string[] layerMasksStr; // Layer の情報を文字列に変換し、Raycast メソッドで利用しやすい情報を変数として作成しておく layerMasksStr = new string[layerMasks.Length]; for (int i = 0; i < layerMasks.Length; i++) { layerMasksStr[i] = LayerMask.LayerToName(layerMasks[i]); } if (Physics.Raycast(ray, out hit, playerController.shootRange, LayerMask.GetMask(layerMasksStr))) {
Unity公式スクリプトリファレンス
LayerMask.GetMask
https://docs.unity3d.com/jp/current/ScriptReferenc...