📌
UnityでVisionOS Simulatorかどうかを判定する
背景
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