Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者40代後半中年中間管理職おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ 汎用オブジェクトの使いまわし

f:id:Harukichi:20210923181339g:plain


こんなアプリを作っていて、ふと思った

 

本当のぱちんこなら、玉は発射するたびに作るわけではなく、かつ、いらなくなったら捨てるわけでもなく、内部またはお店の設備の中で循環して使いまわしているはず

 

リソースは有限

使えるなら使いまわした方がECOというもの

 

アプリのメモリ、リソースも有限

特にスマホアプリならなおさら・・・

 

ということで、作っているアプリでも、毎回玉のPrefabから生成して、いらなくなったら捨ててというのをやめて、最初から一定数作っておいて、盤面上に出てないやつを次に盤面上に発射するようにしてみる

 

スクリプト

//スタート関数内で下記を呼び出して、一定数生成したオブジェクトを配列に入れておく

    void SetupTamaArray()
    {
        TamaArray = new GameObject[TAMARRRAYSIZE];

        for(int i = 0; i < TAMARRRAYSIZE; i++)
        {
            TamaArray[i]=Instantiate(TamaPrefab, transform.position, transform.rotation);

   //オブジェクトは非アクティブにしておく
            TamaArray[i].SetActive(false);

     }

 

 

//玉の生成、盤面への発射

    void TamaSpawn()
    {

  //最初は下記のように毎回玉を生成していた
       // Rigidbody rb = Instantiate(TamaPrefab, transform.position,    transform.rotation).GetComponent<Rigidbody>();


        float currentPower = power;
        currentPower*= Random.Range(1.0f, 1.0005f);
        Rigidbody rb = new Rigidbody();

 

        for (int i = 0; i < TAMARRRAYSIZE; i++) {//配列の中から使っていないものを検索


            if (!TamaArray[i].activeSelf) //オブジェクト非アクティブならこれを使う
            {

    //玉を発射するための準備 位置、角度、移動量を初期化 
                TamaArray[i].transform.position = transform.position;
                TamaArray[i].transform.rotation = Quaternion.identity;
                rb = TamaArray[i].GetComponent<Rigidbody>();
                rb.velocity = new Vector3(0, 0, 0); //前回のものが残っていると不都合なので

 

    //初期化したらアクティブに
                TamaArray[i].SetActive(true);

    //盤面上に発射

                rb.AddForce(Vector3.up * currentPower, ForceMode.Impulse);

    //非アクティブなものが見つかったので、検索は終了
                break;
            }

        }

 

    }

 

 //玉が盤面外に排出されたらコライダーで検知して、非アクティブ化する

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Tama"))
        {

            // Destroy(other.gameObject); 最初は毎回削除していた

            other.gameObject.SetActive(false); //非アクティブ化

        }
    }

 

今回の説明は以上

では、実際どのくらい無駄が減ったとか、パフォーマンスが上がったのかを知りたいところであるが・・・

 

見た目は・・・

 

 

変わらんなぁ

 

まあまあのCPU、グラボを積んだPC上では見た目でわかるはずはないわなぁ

 

数値で確認したいところだが、やり方がわからない

 

数値でのパフォーマンスの違い確認は、次回の宿題としておこう

 

〇余談

普通の人は興味ないと思うが、あらかじめ玉のオブジェクトは15個作ってみたが、実際に同時に使われるのは6個もなかなかいかない感じだった

 

あと、玉のオブジェクトを非アクティブ化しても打ち出されて落下した際の慣性というか、重力というか・・は残っているので、これを再度発射する際にはクリアしておかないとまともに玉が飛んでくれなくなる

 

これに気づかず、解消するために結構時間がかかった(T_T)/~~~

 

今回は以上