FC2ブログ
    09 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 11

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unityでオブジェクトプールって使ったりしてますか?私は使ってませんが、こういうこと? 

    今日は10月だというのに、気温が30度もあるとかって話ですね。
    週末には20度まで下がるとのことですが・・・・
    温度差で風邪ひかないようにしてくださいな。
    坂内っす。

    オブジェクトプール使ってますか?
    私は使ってません。

    これどういう時に使うといいんでしょうかね。
    数百個のオブジェクトをInstantiateするときとかなんでしょうか。
    シューティングゲームの弾みたいな?
    敵もいっぱい同じのが出るなら使えそうですよね。

    結局オブジェクトをInstantiateするときに、GCが走るので、「多大なオブジェクトをInstantiateやDestroyをすると重くなる」というものの対応でオブジェクトプールがあるんだとは思ってます。
    なかなかポケットガールみたいなシミュレーションゲームでは使う機会なさそうなんですよね・・・

    ちなみに簡単なオブジェクトプール

    [Blog20211011.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20211011 : MonoBehaviour
    {
    [SerializeField] GameObject objPref;
    [SerializeField] Button btnCreate;

    int count = 100;

    void Start()
    {
    btnCreate.onClick.AddListener(OnClickCreate);
    }

    void OnClickCreate() {
    for (int i = 0; i < count; i++) {
    Instantiate(objPref, new Vector3(Random.Range(-10f, 10), Random.Range(-10f, 10f), Random.Range(-10f, 10f)), Quaternion.identity);
    }
    }
    }



    例えば、ボタンを押したときにCubeを100個生成する処理がこのようにあった場合、100回GCが走ってしまいます。
    (このコードだけだとボタンを押すたびに100個を超えて増えてしまいますが)

    オブジェクトプールを使うとこんな感じになります(たぶん

    [Blog20211011.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20211011 : MonoBehaviour
    {
    [SerializeField] GameObject objPref;
    [SerializeField] Button btnCreate;

    GameObject[] cubes;

    int count = 100;

    private void Awake() {
    cubes = new GameObject[count];
    for (int i = 0; i < count; i++) {
    GameObject obj = Instantiate(objPref, new Vector3(Random.Range(-10f, 10), Random.Range(-10f, 10f), Random.Range(-10f, 10f)), Quaternion.identity);
    cubes[i] = obj;
    cubes[i].SetActive(false);
    }
    }

    void Start()
    {
    btnCreate.onClick.AddListener(OnClickCreate);
    }

    void OnClickCreate() {
    foreach (GameObject obj in cubes) {
    obj.SetActive(true);
    }
    }
    }



    はじめにオブジェクトを作成し、プールしておきます。
    実際に使う際には、プールされたオブジェクトを表示するといった形で使用します。

    また、消す際にもDestroyをしないで、SetActive(false)で消すことができます。
    これによって無駄にGCを発生させないようにするのがオブジェクトプールのようです。

    本日はオブジェクトプールについてでした。

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/831-925fa3a0
    この記事にトラックバックする(FC2ブログユーザー)