Unity如何区分Android和iOS

时间:2018-07-01 16:21:29

标签: c# unity3d

假设我们已经基于加速度计制作了一款手机游戏。我们正在使用Input.accelerometer类。

using UnityEngine;

public class ExampleClass : MonoBehaviour {
    public float speed = 10.0F;
    void Update() {
        Vector3 dir = Vector3.zero;
        dir.x = -Input.acceleration.y;
        dir.z = Input.acceleration.x;
        if (dir.sqrMagnitude > 1)
            dir.Normalize();

        dir *= Time.deltaTime;
        transform.Translate(dir * speed);
    }
}

此代码可在Andoid和iOS上使用。我想知道,Unity如何知道我们是在Android还是iOS上运行游戏?我已经检查了UnityEngine.dll文件,但在操作系统之间找不到任何if-else语句。

2 个答案:

答案 0 :(得分:4)

基本上,Unity的两个方面是托管方面和本机方面。受管部分只是C#API,本机端只是用C ++编写的代码的本机端,可以与iOS的Object-C Swift或Android的Java通信。

被管理部分的扩展名通常是 .dll ,而Android的本机端通常是 .so .aar 。 jar 或只是一个 .dex

iOS本机端的受管部件扩展通常是 .a .m .mm .c .cpp 。对于iOS,直到您使用xCode构建生成的项目为止,某些管理部分都不会编译,并且仍为 .cpp 形式。

  

此代码可在Andoid和iOS上使用。我想知道Unity如何   知道我们是在Android还是iOS上运行游戏吗?

他们在运行时不这样做。 Unity API太多了,每次这样做都是多余的和混乱的。

为简化此操作,它在不同平台上使用了不同的托管文件和本机文件。。这些文件包含在构建期间,并且在您单击构建按钮后即可在编辑器中做出此决定。

首先,转到<UnityInstallationDirecory>\Editor\Data\PlaybackEngines

enter image description here

为避免使用某些preprocessor directivesApplication.platform或混淆其他平台代码,这是在构建期间在编辑器中完成的。如果选择iOS并构建项目,则它将在C:\ Program UnityEngine.dll路径中包含<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\iOSSupport for iOS。它将与Android相同,但在<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer路径中。

每个平台都有不同的 UnityEngine.dll 。您可以在我上面提到的路径中看到它们。通过 UnityEngine.dll 和其他托管dll,您将看到使用DllImportAndroidJavaClass到代码本机端的调用。请注意, UnityEngine.dll 不是该版本中包含的唯一文件。这些路径中的大多数文件都带有我上面提到的扩展名。其中包括托管文件和本机文件。

答案 1 :(得分:0)

确定您所处平台的正确方法是使用Unity使用的#define指令进行检查。您可以在the docs here

中找到有关它的更多信息。

以下是如何检查您使用的是Android还是IOS的示例:

#if UNITY_ANRDOID
     // Android code goes here
#elif UNITY_IOS
     // IOS Code goes here
#endif

希望这会有所帮助!

如果要进行运行时检查,则可以使用RuntimePLatform

if (Application.platform == RuntimePlatform.Android)
     value = 5;
 else if(Application.platform == RuntimePlatform.IPhonePlayer)
    value = 10;