📌

UnityでVisionOS Simulatorかどうかを判定する

2024/10/03に公開

背景

Simulatorでのみ有効にする処理を書きたかったので調査した。

結論

IPreprocessBuildWithReportでbuild前にhookして、ScriptingDefineSymbolを定義するのが楽そうだった。

コード

SamplePreprocessor.cs
public class SamplePreprocessor : IPreprocessBuildWithReport
{
    private const string SYMBOL_IS_SIMULATOR = "IS_SIMULATOR";

    public int callbackOrder => 0;

    public void OnPreprocessBuild(BuildReport report)
    {
        BuildTargetGroup buildTargetGroup = report.summary.platformGroup;
        if (buildTargetGroup != BuildTargetGroup.VisionOS) return;

        // 現在のSymbolsを取得する
        PlayerSettings.GetScriptingDefineSymbolsForGroup(buildTargetGroup, out var symbols);
        var list = new List<string>(symbols);

        // TargetSDKがSimulator/Deviceのどちらかを判定して、Symbolを追加/削除する
        switch (PlayerSettings.VisionOS.sdkVersion)
        {
            case VisionOSSdkVersion.Device:
                RemoveSimulatorSymbols(list, SYMBOL_IS_SIMULATOR);
                break;
            case VisionOSSdkVersion.Simulator:
                SetSimulatorSymbols(list, SYMBOL_IS_SIMULATOR);
                break;
        }

        PlayerSettings.SetScriptingDefineSymbolsForGroup(buildTargetGroup, list.ToArray());
    }

    private void SetSimulatorSymbols(List<string> list, string symbol)
    {
        if (list.Contains(symbol)) return;
        list.Add(symbol);
    }

    private void RemoveSimulatorSymbols(List<string> list, string symbol)
    {
        if (!list.Contains(symbol)) return ;
        list.Remove(symbol);
    }
}

これで判定可能になる

#if IS_SIMULATOR
Debug.Log("Simulator");
#else
Debug.Log("Device");
#endif

Discussion