前回までで、花びらの動き、桜の花びらを管理する 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 ► 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 の容量設定を行いました。
Awake は Start イベント関数よりも前に、1 つのゲームオブジェクトにつき 1 回呼び出されるイベント関数で初期化処理などのタイミングとして用いられます。
桜の花びらの量の偏りの対処
画面が18mx10mなので、画面上の同じサイズの範囲内で桜の花びらをランダムに出現させています。プレイしてみると途中花びらが少ない部分があります。
これは、落下速度が速くて、後から画面上に出現した花びらが追い付いていないためです。
そのため、もう少し出現範囲の縦幅を 10m から 25m へ広くしました。
テストプレイ
再生ボタンを押してテストプレイをしてみます。たまにまばらなことはありますが常に花びらが上画面から下画面に向けて舞い続けます。
これで 桜の花びらがずっと舞い続けるアニメーションが出来ました。
プレイ後に出る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 を呼び出すようにしてみたのですが、変わりません。
これについては、意外と時間がかかりそうなので、次回以降調査をしたいと思います。
これが直った際に、今回の桜の花びらが舞うプログラムを公開する予定です。
コメント