国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

Unity原生平臺插件開發簡介(Android/iOS)

2019-11-07 23:35:55
字體:
來源:轉載
供稿:網友

一、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,而不僅僅是一個類名。


上一篇:IOS 權限

下一篇:iOS 定位

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永济市| 宜都市| 靖边县| 潢川县| 达孜县| 密云县| 商洛市| 天台县| 扎赉特旗| 保亭| 治县。| 射阳县| 正阳县| 锦屏县| 托克逊县| 庆城县| 新闻| 临高县| 南华县| 屏南县| 本溪市| 闸北区| 巩义市| 麦盖提县| 昭平县| 罗定市| 柳河县| 天水市| 新蔡县| 天祝| 德格县| 朝阳市| 黔江区| 嘉义市| 河曲县| 威宁| 万源市| 阿拉尔市| 平湖市| 金湖县| 光山县|