デコシノニッキ

ホロレンジャーの戦いの記録

VuforiaBehaviourがシーン再生時にアタッチされないようにする

シーンを再生すると、どこからともなくVuforiaBehaviourが呼ばれて鬱陶しいなと思っていたのですが、リフレクションで封殺できるみたいですね。

https://forum.unity.com/threads/do-not-run-vufory-when-the-application-starts.498351/page-2

使い方はシーン内の適当なオブジェクトにアタッチするだけです。

using UnityEngine;
using UnityEngine.SceneManagement;
using Vuforia;
using System.Reflection;
using System;
 
public class VuforiaCameraIssueFix : MonoBehaviour
{
    void Awake()
    {
        try
        {
            EventInfo evSceneLoaded = typeof(SceneManager).GetEvent("sceneLoaded");
            Type tDelegate = evSceneLoaded.EventHandlerType;
 
            MethodInfo attachHandler = typeof(VuforiaRuntime).GetMethod("AttachVuforiaToMainCamera", BindingFlags.NonPublic | BindingFlags.Static);
 
            Delegate d = Delegate.CreateDelegate(tDelegate, attachHandler);
            SceneManager.sceneLoaded -= d as UnityEngine.Events.UnityAction<Scene, LoadSceneMode>;
        }
        catch (Exception e)
        {
            Debug.LogWarning("Cant remove the AttachVuforiaToMainCamera action: " + e.ToString());
        }
    }
}

f:id:haikage1755:20181216142853g:plain

ただ、封殺はできるんですが、スクリプトを外した時にどうやらリソース解放がうまくいっておらずUnityごと立ち上げなおさないとVuforiaが起動できなくなります。
VuforiaUtility.Deinitを使うとリソースを強制解放できるみたいなので、Editor拡張でEditor内実行できるようにしておくと楽になるかも。というのをちょっと作ってみているのでおいおい書けたらなと思っています。

もう一歩突っ込んで、AttachVuforiaToMainCameraがそもそもどこから呼ばれているのかは調べたいですね。

では、このAttachVuforiaToMainCameraはどこから呼ばれているのか??

PlatformRuntimeInitializationというクラスがあり、その中でRuntimeInitializeOnLoadMethod(詳細) 属性が指定されたメソッドInitPlatform内で、

SceneManager.sceneLoaded += new UnityAction<Scene, LoadSceneMode>(VuforiaRuntime.AttachVuforiaToMainCamera);

とシーン読み込み時に毎度AttachVuforiaToMainCameraが呼ばれています。はい、つまり不可避ですね。

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」