ゲーム内に弾を生成する処理は、そのアクションの多さに比例して処理の負荷が高くなります。
そのため、完成した処理の見直しを行いつつ、効率化を図ることが大切です。
設計部分を再構築したり、負荷のかかっている部分を見つけるなど、リファクタリングは多岐にわたります。
今回の場合、プレハブをアサインする際のデータ型の情報を GameObject ではなく、Rigidbody2D に変更します。
このようにすることで、Instantiate メソッドの処理の部分も変更になります。
Instantiate メソッドは、第1引数に指定したデータ型を元にプレハブをクローンする処理です。
このとき、プレハブにアタッチされているクラスであれば、いずれであってもクローンを生成出来ます。
そのため、生成されたクローンが、その後、どのような制御を行う必要があるかを考えて、
それに合わせたデータ型で生成する方が効率化を図れます。
今回であれば、生成後に Rigidbody2D コンポーネントを取得する必要があり、そのために GetComponent メソッドを行っていました。
Instantiate メソッド、そして GetComponent メソッドは負荷の高い処理であるため、
いずれかの処理を無くしたり、あるいは、利用する回数を減らすことができれば、処理の負荷軽減を図ることが可能です。
Instantiate メソッド自体はオブジェクトプールなどの機能を追加することで処理を代用し、処理の負荷軽減が可能ですが、
それは別途、機能の追加が必要になるため、今回は Instantiate メソッドは利用しつつ、その処理の戻り値になるデータ型を
GameObject 型から Rigidbody2D 型に変更しています。
結果として、GetComponent メソッドの処理を省略した、効率的なアプローチが完成します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletGenerator : MonoBehaviour
{
// 弾のプレハブ(bulletPrefab に Rigidbody2D がアタッチされている前提)
public Rigidbody2D bulletPrefab;
// 弾の速度
public float bulletSpeed = 10f;
// 弾の生成位置
public Transform spawnPoint;
void Update()
{
// Vが押されたら
if (Input.GetKeyDown(KeyCode.V))
{
// 弾のプレハブのクローンを生成する
Rigidbody2D bullet = Instantiate(bulletPrefab, spawnPoint.transform.position, Quaternion.identity);
// プレイヤーの向きを取得
float playerDirection = transform.localScale.x;
Debug.Log(bulletSpeed * playerDirection);
// プレイヤーの向きに応じて初期速度を設定
bullet.velocity = new Vector2(bulletSpeed * playerDirection, 0f);
// 画像の向きをキャラに合わせる
Vector3 temp = bullet.transform.localScale;
temp.x = transform.localScale.x;
bullet.transform.localScale = temp;
}
}
}
処理が簡略化されているとともに、GetComponent メソッドの処理も不要になっているので処理負荷の軽減も出来ています。