Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity如何区分Android和iOS_C#_Unity3d - Fatal编程技术网

C# Unity如何区分Android和iOS

C# Unity如何区分Android和iOS,c#,unity3d,C#,Unity3d,假设我们制作了一款基于加速度计的手机游戏。我们正在使用Input.Accelerator类 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.Accelerator类

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怎么知道我们是在安卓还是iOS上运行游戏?我已检查UnityEngine.dll文件,但在操作系统之间未找到任何if-else语句。

确定您所在平台的正确方法是检查Unity使用的define指令。您可以在中找到有关它的更多信息

下面是一个如何检查您是否使用Android或IOS的示例:

#if UNITY_ANRDOID
     // Android code goes here
#elif UNITY_IOS
     // IOS Code goes here
#endif
希望这有帮助

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


统一基本上有两个方面,即管理方面和本地方面。托管部分只是C API,而本地端只是C++编写的代码,与ObjvC-SWIFT通信,以便为Android访问IOS或java。p> 托管部分扩展通常是.dll,Android的本机端通常是.so、.aar、.jar或只是.dex

iOS本机端的托管部件扩展通常为.a、.m、.mm、.c、.cpp。对于iOS,在使用xCode构建生成的项目之前,某些管理部分不会被编译,并且仍然是.cpp的形式

这段代码适用于Andoid和iOS。我想知道,团结是如何实现的 知道我们是在安卓还是iOS上运行游戏吗

他们在运行时不会这样做。有这么多UnityAPI,每次这样做都是多余和混乱的

为了简化这一点,它为不同的平台使用不同的托管文件和本机文件。这些文件在构建期间包含,单击“构建”按钮后,将在编辑器中做出此决定

首先,转到\Editor\Data\PlaybackEngines

为了避免使用一些或误用不同的平台代码,这是在构建时在编辑器中完成的。如果选择iOS并生成项目,它将包括位于C:\Program\Editor\Data\PlaybackEngines\iOSSupport路径中的iOS的UnityEngine.dll。它将对Android执行相同的操作,但在\Editor\Data\PlaybackEngines\AndroidPlayer路径中


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

这可能是瞎猜,但在Windows上运行时,您使用的是UnityEngine.dll。。。但是我不相信Android或iOS会使用dll。。。我相信他们会使用.so's或.a,这就是为什么你会在UnityEngine.dll中找到任何东西来区分两个不同的操作系统?而且,我相信大多数开发人员会使用预处理命令来防止编译不必要的代码,比如elif else。如果您正在编译.so甚至.dll,并且您的If条件不为true,则该主体中的代码将不会包含在完成的对象中。目标平台是在生成时确定的,在库文件中找不到任何内容。问题不是问如何确定平台。。我认为你应该再读一遍,添加一个运行时检查,尽管问题是:我想知道,Unity如何知道我们是在Android还是iOS上运行游戏?当你说确定你在哪个平台上的正确方法是检查Unity使用的define指令。看起来更像是告诉OP如何检测平台,而不是回答unity如何检测使用不同API的平台。问题是一个API如何在多个平台上工作。Unity是如何决定在每个平台上使用哪个API的。@程序员很明显,这就是OP想要的答案。有没有办法让我知道我们从Android传感器获取数据的位置和方式?我假设Unity的类Input.acceleration从Android的类public static final int TYPE_加速计中获取数据。此类是否包含在\Editor\Data\PlaybackEngines\AndroidPlayer路径的任何位置?是的,但它不是开源的。你不能看到源代码,除非你反编译它,这违反了你同意的Unity条款。如果你在一家公司工作,你可以付钱给Unity来获得源代码,但这非常昂贵。文件就在那里。对于加速计,我怀疑其中一个.so或.a文件。对于Input.GetKeyXX函数,如果反编译jar文件,则它位于C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\classes的classes.jar文件中。您将在那里看到实现。
if (Application.platform == RuntimePlatform.Android)
     value = 5;
 else if(Application.platform == RuntimePlatform.IPhonePlayer)
    value = 10;