假设我们已经基于加速度计制作了一款手机游戏。我们正在使用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语句。
答案 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
为避免使用某些preprocessor directives,Application.platform
或混淆其他平台代码,这是在构建期间在编辑器中完成的。如果选择iOS并构建项目,则它将在C:\ Program UnityEngine.dll
路径中包含<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\iOSSupport
for iOS。它将与Android相同,但在<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer
路径中。
每个平台都有不同的 UnityEngine.dll 。您可以在我上面提到的路径中看到它们。通过 UnityEngine.dll 和其他托管dll,您将看到使用DllImport
或AndroidJavaClass
到代码本机端的调用。请注意, 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;