一、Unity如何調用c#之外的語言的內容
1、c/c++可以編譯成.so動態庫(android平臺下),.dll動態庫(window平臺和編輯器下),.a靜態庫(iOS平臺下),.bundle包(Mac平臺下和編輯器下)
把編譯好的東西放在Plugins目錄下的指定平臺目錄下即可。比如iOS平臺就放在iOS文件夾下面。Android平臺根據cpu架構不同放在對應文件夾下面,比如Anroid/libs/armeabi-v7a。 Window平臺及編輯器一般放在x86_64目錄下。
不同動態庫可能有沖突,比如x86的動態庫以及x86_64的動態庫是互相沖突的,這個要在編輯器中設置各個庫的對應平臺是哪個。
2、iOS擴展也可以直接把.m或者.mm的源文件放在iOS目錄下,Unity打包的時候會直接將其打包到xcode工程里面。這個跟編譯好靜態庫是一樣的。
3、Window平臺的動態庫可以用vs來編譯,也可以用mingw來編譯。如果是c99用的比較多的,推薦用mingw。比如tolua就是用這套來編譯的。
4、Android平臺的插件如果是java的,推薦用Android Studio來編譯。如果是c/c++的,推薦用ndk來編譯。這個后面會詳細介紹。
5、在c#中直接用DllImport即可直接使用對應函數,比如
#if UNITY_IOS // iOS相關函數實現在.m文件中[DllImport( "__Internal" )]PRivate static extern float _iOSSetBatteryMonitoringEnabled(); // 啟用電量監控
#elif UNITY_ANDROID // android相關函數用動態庫封裝調用
[DllImport("NativePlugin")] private static extern int _AndroidCheckTemperature(); // 檢測溫度
#endif
6、Android的java的部分,可以直接使用AndroidJavaClass來調用相應的函數,比如以下是獲取Android系統電量的代碼
try        {            using (AndroidJavaClass unityPlayer = new AndroidJavaClass(UNITY_CLASS))            {                if (null != unityPlayer)                {                    using (AndroidJavaObject currActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))                    {                        if (null != currActivity)                        {                            using (AndroidJavaObject intentFilter = new AndroidJavaObject("android.content.IntentFilter", new object[] { "android.intent.action.BATTERY_CHANGED" }))                            {                                using (AndroidJavaObject batteryIntent = currActivity.Call<AndroidJavaObject>("registerReceiver", new object[] { null, intentFilter }))                                {                                    int level = batteryIntent.Call<int>("getIntExtra", new object[] { "level", -1 });                                    int scale = batteryIntent.Call<int>("getIntExtra", new object[] { "scale", -1 });                                    // Error checking that probably isn't needed but I added just in case.                                    if (level == -1 || scale == -1)                                    {                                        return 50f;                                    }                                    return ((float)level / (float)scale) * 100.0f;                                }                            }                        }                    }                }            }        }        catch (System.Exception ex)        {        }        return 100;二、Android平臺插件開發注意事項
1、推薦使用Android Studio來開發。不要在用Eclipse ADT了。
2、使用gradle來編譯。Android開發的編譯經歷了Ant、Maven到Gradle。Gradle提供了更加靈活強大的構建支持。從依賴管理到編譯控制。
3、推薦使用CMake來編譯jni部分代碼。官方不再推薦使用ndk來編譯了。Android Studio和Gradle也支持CMake。
4、編譯出來的東西是一個.aar的文件,這個相對于.jar來說,就是一個更加豐富的包。它可以包含資源、動態庫、jar代碼、AndroidManifest.xml等等。
5、工程中要加入classes.jar,這個可以在Unity的安裝路徑中找到。我們需要的UnityPlayer等等都是在這個包里面的。不過有一點比較麻煩的是,在打包完畢之后必須將aar包中的此文件再刪除掉(libs/classes.jar),否則會造成沖突導致Unity打包失敗。
6、build.gradle中的minSdkVersion targetSdkVersion要跟Unity中的設置一致。如果之前在項目中已經有AndroidManifest.xml了,則這些數據要一致,否則也會編譯失敗。
7、自己如果需要擴展Activity的行為,則需要自己實現一個新的MyUnityPlayerActivity,繼承自UnityPlayerActivity。修改后,AndroidManifest.xml中相關內容也要進行修改。如果僅僅是想封裝一些原生系統功能的話,那么直接寫一個類就可以了。需要用到Activity的時候,使用UnityPlayer.currentActivity調用相關函數即可。
      另外再注意一下,在C#代碼中創建AndroidJavaClass的時候傳入的參數應該包含完整的包名,比如 com.xxxx.MyPlugin,而不僅僅是一個類名。
新聞熱點
疑難解答