【Unity】ObjectPool で花びらオブジェクトたちを管理する(後編)

前回までで、花びらの動き、桜の花びらを管理する Unity の ObjectPool の設定を行いました。
現状はテストプレイ開始時に画面上にランダムに配置された花びらたちが舞います。

いろいろな横移動距離でランダムな配置から花びらが舞い落ちてきました。

いろいろな横移動距離でランダムな配置から花びらが舞い落ちてきました。

今回は、舞い散った後ふたたび画面上に出現させることで、無制限に花びらが舞い落ちるアニメーションを完成させます。
※ Unity は 2021.3.14f1、 OS は Windows 10 です。

桜の花びらの生成と破棄のサイクルのイメージ

桜の花びらの生成と破棄のサイクルのイメージ

画面下に消えたことを知らせるイベント関数

「桜の花びら」のゲームオブジェクトには SakuraNoHanabira というスクリプトのコンポーネントがついています。
このスクリプトに次のイベント関数と処理を加えます。

    private void OnBecameInvisible()
    {
        Manager.OnHanabiraInvisible(this);
    }

OnBecameInvisible はゲームオブジェクトが画角から外れるなどして表示されなくなる際に呼び出されます。
このイベント関数に、 Manager.cs につくったオリジナルの関数を呼び出させます。

    public void OnHanabiraInvisible(SakuraNoHanabira hanabira)
    {
        pool.Release(hanabira);
        pool.Get();
    }

これは、画面下に消える花びらのゲームオブジェクトに結び付いたコンポーネントを引数に受け取ります。
画面下に消える花びらのゲームオブジェクトを ObjectPool に Release 関数で戻します。
その後、新たに花びらのゲームオブジェクトを ObjectPool から得ます。
前回説明したように ObjectPool のゲームオブジェクトを外部に渡す際は、位置をランダムに変えるため、上画面の指定された範囲内のどこかに配置されます。

DOTween からの警告メッセージの対処

 

DOTween からのエラーメッセージDOTween からのエラーメッセージ

DOTween からのエラーメッセージ

「DOTWEEN ► Max Tweens reached: capacity has automatically been increased from 200/50 to 200/125. Use DOTween.SetTweensCapacity to set it manually at startup
UnityEngine.Debug:LogWarning (object)
DG.Tweening.Core.Debugger:LogWarning (object,DG.Tweening.Tween) (at D:/DG/_Develop/__UNITY3_CLASSES/_Holoville/__DOTween/_DOTween.Assembly/DOTween/Core/Debugger.cs:40)
DG.Tweening.Core.TweenManager:GetSequence () (at D:/DG/_Develop/__UNITY3_CLASSES/_Holoville/__DOTween/_DOTween.Assembly/DOTween/Core/TweenManager.cs:138)
DG.Tweening.DOTween:Sequence () (at D:/DG/_Develop/__UNITY3_CLASSES/_Holoville/__DOTween/_DOTween.Assembly/DOTween/DOTween.cs:733)
SakuraNoHanabira:Start () (at Assets/SakuraNoHanabira.cs:57)」

最大 Tween に達しました。容量は自動的に 200/50 から 200/125 に増加します。 SetTweenCapacity を使って下さい」みたいなことが書いてあるようです。
200/50 to 200/125 というのは Tween 数 / Sequence 数 のことのようで、今回は Sequence 数が既定値では足りなかったようです。
4回警告がでたのは、段階的に自動的に容量を増やしたからです。最終的に 1250 / 330 の容量になっているので 1300 / 330 程度にしておきます。

SetTweenCapacity で検索すると、昔から有名な警告メッセージなのか説明サイトが複数ありました(感謝)。

検索1位の【Unity】DoTween:「Max Tweens reached」警告が発生した時の対処方 | KAZUPON研究室 を参考にして、DOTWeen の開始の前に次の処理をいれました。

// Manager.cs
    private void Awake()
    {
        DG.Tweening.DOTween.SetTweensCapacity(tweenersCapacity: 1250, sequencesCapacity: 330);
    }

Manager.cs はシーンの「管理役」ゲームオブジェクトに付加されています。
花びらと違い、一つしか存在しないゲームオブジェクトので、このクラスで DOTween の容量設定を行いました。
AwakeStart イベント関数よりも前に、1 つのゲームオブジェクトにつき 1 回呼び出されるイベント関数初期化処理などのタイミングとして用いられます。

桜の花びらの量の偏りの対処

画面が18mx10mなので、画面上の同じサイズの範囲内で桜の花びらをランダムに出現させています。プレイしてみると途中花びらが少ない部分があります。

これは、落下速度が速くて後から画面上に出現した花びらが追い付いていないためです。
そのため、もう少し出現範囲の縦幅を 10m から 25m へ広くしました。

テストプレイ

再生ボタンを押してテストプレイをしてみます。たまにまばらなことはありますが常に花びらが上画面から下画面に向けて舞い続けます。

再生成により無制限に一定量の花びらが舞い落ちるようになりました。

再生成により無制限に一定量の花びらが舞い落ちるようになりました。

これで 桜の花びらがずっと舞い続けるアニメーションが出来ました。

プレイ後に出るSetActive 呼び出し時のエラー

SetActive関数呼び出し時のエラーメッセージ

SetActive関数呼び出し時のエラーメッセージ

「GameObject is already being activated or deactivated.
UnityEngine.StackTraceUtility:ExtractStackTrace ()
Manager:<Start>b__4_1 (SakuraNoHanabira) (at Assets/Manager.cs:56)
UnityEngine.Pool.ObjectPool`1<SakuraNoHanabira>:Get ()
Manager:OnHanabiraInvisible (SakuraNoHanabira) (at Assets/Manager.cs:90)
SakuraNoHanabira:OnBecameInvisible () (at Assets/SakuraNoHanabira.cs:89)」

テストプレイを終了すると20~40程度出てきます。
文言だけ読むとすでにアクティブなのにアクティブにしようとしているとかなので、 activeSelf で確認してから SetActive を呼び出すようにしてみたのですが、変わりません。
これについては、意外と時間がかかりそうなので、次回以降調査をしたいと思います。
これが直った際に、今回の桜の花びらが舞うプログラムを公開する予定です。

 

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました