Unity3D的Plattform依赖编译什么时候起作用?

When does Unity3D's Plattform dependent compilation work?

我有一个来自我的项目的小代码片段。它在脚本中用于拖放菜单。脚本附加到每个项目,可拖动。

public void OnDrag(PointerEventData eventData){
    if (isPlantLocked())
        return;

    #if UNITY_EDITOR
        transform.position = Input.mousePosition;
    #endif

    #if UNITY_ANDROID
        transform.position = Input.touches[0].position;
    #endif
}

我遇到异常(我拖动项目的每一帧),Input.touches.Length 为零,但此代码区域只能用于 android,并且在移动版本上一切正常.

现在我的问题是如何摆脱异常以及平台依赖项何时起作用?

如果您查看 "Build Settings" window,有一个 "Switch Platform" 按钮可以调整您当前的运行时平台并触发相应指令的编译,即使在编辑。这意味着 UNITY_ANDROIDUNITY_EDITOR 都可以同时为 true,因为 UNITY_EDITOR 意味着您在 Unity 应用程序本身中是 运行。

由于您正在检查输入类型并且第一个输入类型用于鼠标,您可能希望将 UNITY_EDITOR 替换为 UNITY_STANDALONE,然后确保在编辑器中进行测试时,您设置了正确的当前平台。

另一种选择(如果您永远不会发布独立版本并且它仅用于非 PC 平台则更好)是首先检查 UNITY_EDITOR 然后 #else if其他选项:

#if UNITY_EDITOR
    transform.position = Input.mousePosition;
#elif UNITY_ANDROID
    transform.position = Input.touches[0].position;
#endif

这样您可以更轻松地更换当前的平台设置。

当您在 Editor 中,并且在构建设置中选择了 Android 平台时,这两个代码将工作。

如果您不想在 Editor 中执行特定的 Android 代码,您可以执行以下操作:

public void OnDrag(PointerEventData eventData){
if (isPlantLocked())
    return;

#if UNITY_EDITOR
    transform.position = Input.mousePosition;
#endif

#if UNITY_ANDROID && !UNITY_EDITOR
    transform.position = Input.touches[0].position;
#endif}

您还可以阅读更多相关内容 here