SceneのロードとDOTweenを同時に使うとWebGLでクラッシュする

UnityでSceneのロードとDOTweenを同時に使うと、WebGLにビルドした際のシーン遷移時にクラッシュするという問題が起こりました。

Unityエディタ上では何の問題もなく動作します。

エラーはこちら。

An error occurred running the Unity content on this page. See your browser’s JavaScript console for more info.
Uncaught abort(264) at Error
at jsStackTrace (WebGL_100.wasm.framework.unityweb:8:22313)
at stackTrace [Object.stackTrace] (WebGL_100.wasm.framework.unityweb:8:22484)
at Object.onAbort (http://localhost:52963/Build/UnityLoader.js:4:11118)
at abort (WebGL_100.wasm.framework.unityweb:8:527862)
at :wasm-function[63571]:0x139fd80
at :wasm-function[24252]:0xbbc009
at :wasm-function[28437]:0xc8b8b9
at :wasm-function[51313]:0x1156724
at dynCall_viii (:wasm-function[63292]:0x139f114)
at dynCall_viii [Object.dynCall_viii] (WebGL_100.wasm.framework.unityweb:8:515595)
at invoke_viii (WebGL_100.wasm.framework.unityweb:8:388396)
at :wasm-function[48890]:0x10c35e8
at :wasm-function[46766]:0x104d3f9
at :wasm-function[24273]:0xbbd0bd
at :wasm-function[42788]:0xf7df80
at :wasm-function[46571]:0x1042e2a
at :wasm-function[46570]:0x10429be
at :wasm-function[46569]:0x10426db
at :wasm-function[54657]:0x126ec83
at :wasm-function[54655]:0x126e92c
at :wasm-function[42650]:0xf743ce
at :wasm-function[42649]:0xf73d3a
at :wasm-function[59756]:0x1335a1c
at dynCall_iiiii (:wasm-function[63261]:0x139ece4)
at dynCall_iiiii [Object.dynCall_iiiii] (WebGL_100.wasm.framework.unityweb:8:497905)
at invoke_iiiii (WebGL_100.wasm.framework.unityweb:8:355236)
at :wasm-function[56497]:0x12c4b3f
at :wasm-function[55816]:0x12a470e
at :wasm-function[4483]:0x1ccbda
at :wasm-function[4482]:0x1ccb03
at :wasm-function[10568]:0x410c9f
at :wasm-function[10552]:0x40f9ac
at :wasm-function[12547]:0x50c6b1
at :wasm-function[12546]:0x50c3ca
at :wasm-function[10950]:0x43c821
at :wasm-function[10658]:0x4199ef
at :wasm-function[10658]:0x419a04
at :wasm-function[10653]:0x41950d
at :wasm-function[10646]:0x4174fe
at dynCall_v (:wasm-function[63278]:0x139efc2)
at dynCall_v [Object.dynCall_v] (WebGL_100.wasm.framework.unityweb:8:509074)
at browserIterationFunc (WebGL_100.wasm.framework.unityweb:8:181211)
at runIter [Object.runIter] (WebGL_100.wasm.framework.unityweb:8:184272)
at Browser_mainLoop_runner (WebGL_100.wasm.framework.unityweb:8:182734)

詳細

環境は

  • Unity 2019.4.8f1
  • DOTween v1.0.244

です。

また、具体的には

  1. SceneManager.LoadSceneAsync()のallowSceneActivationをfalseにした状態で実行
  2. DOTweenのSecuenceでアニメーションを再生
  3. SequenceのOnComplete()でallowSceneActivationをtrueにする

をしたところ、上記エラーが出ました。

試したこと

https://github.com/Demigiant/dotween/issues/59
https://wakky.tech/unity-dotween-scene-load/
https://docs.unity3d.com/ja/2018.4/Manual/IL2CPP-BytecodeStripping.html

ここら辺を参考に、

  • DOTween.Clear(true)する
  • DOTween.KillAll()する
  • SequenceにSetLink()を追加する
  • StripEngineCodeを無効にする

などを試してみましたが、解決できませんでした。

原因

原因はシーンの非同期ロードとDOTweenを同時に使っていたことのようでした。(詳細は不明)

推測するに、Sequenceの破棄とそのSequenceを実行しているシーンの破棄が重なり、Sequenceが意図しない挙動になったのではないかと思います。

解決方法

解決方法としては、以下のようなものが考えられます。

  • 非同期ロードではなく同期ロードを使う
  • 1フレーム待ってからallowSceneActivationをtrueにする
  • OnDisable()でSequenceを破棄する

この中でも個人的に良さそうなのは3つ目、OnDisable()でSequenceを破棄する方法。

Sequenceを変数に格納しておき、Unity標準のイベントOnDisable()のタイミングでKill()するというものです。

試したことにも書いたようにSetLink()では解決できませんでしたが、この方法では解決することができました。

コメント