Unity調用Android類方法
1. 添加Unity的classes.jar文件
創建一個Android工程AndroidUnityDemo。
由於Unity的版本不同,直接在Unity安裝包文件夾里面搜索classes.jar文件,如果有多個classes.jar文件,一般選擇的是mono/Release文件夾下的classes.jar文件。
將classes.jar文件放在app文件下的libs文件夾下。
然后,更新一下。
2. 編寫Android類
打開MainActivity.java類,讓MainActivity類繼承於UnityPlayerActivity類,如果提示類不存在,說明unity的classe.jar文件沒有加載進來。
刪除setContentView(R.layout.activity_main);
MainActivity.java
1 package com.xxxxxx.androidunitydemo; 2 3 import android.os.Bundle; 4 import android.util.Log; 5 6 import com.unity3d.player.UnityPlayerActivity; 7 public class MainActivity extends UnityPlayerActivity { 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 } 12 public void test1() 13 { 14 Log.v("Android_Unity", "no return value and no parameter"); 15 } 16 public String test2() 17 { 18 Log.v("Android_Unity","have return value and no parameter"); 19 return "Hello Unity"; 20 } 21 public void test3(String par) 22 { 23 Log.v("Android_Unity","no return value and have parameter"); 24 Log.v("Android_Unity",par); 25 } 26 public String test4(String par) 27 { 28 Log.v("Android_Unity","have return value and have parameter"); 29 Log.v("Android_Unity",par); 30 return "Hello Unity"; 31 } 32 public static void test5() 33 { 34 Log.v("Android_Unity", "static function"); 35 } 36 }
3. 打包成arr文件
打開build.gradle文件,將apply plugin: ‘com.android.application’修改為apply plugin: ‘com.android.library’,將applicationId ‘com.XXXXXX.androidunitydemo’刪除。
Build.gradle
1 apply plugin: 'com.android.library' 2 android { 3 compileSdkVersion 23 4 buildToolsVersion "23.0.3" 5 defaultConfig { 6 minSdkVersion 15 7 targetSdkVersion 23 8 versionCode 1 9 versionName "1.0" 10 } 11 buildTypes { 12 release { 13 minifyEnabled false 14 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 15 } 16 } 17 } 18 dependencies { 19 compile fileTree(dir: 'libs', include: ['*.jar']) 20 testCompile 'junit:junit:4.12' 21 compile 'com.android.support:appcompat-v7:23.4.0' 22 }
如果不用在Unity中添加Android的res文件的話,將AndroidManifest文件中使用res的部分刪除。修改AndroidManifest.xml文件,加入android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">與<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
AndriodManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxxxxx.androidunitydemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23" /> <application android:allowBackup="true" android:label="AndroidUnityDemo" android:supportsRtl="true" > <activity android:name="com.xxxxxx.androidunitydemo.MainActivity" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
打包文件,點擊Build->Build Apk,點擊Show in Explorer,打開arr文件所在文件夾,點擊outputs->arr,就可以看到app-debug.arr壓縮包。
4. 創建一個簡單場景
創建一個Unity項目名為UnityAndroidDemo。
點擊File->Build Setting,點擊Android,在點擊Switch platform按鈕,進行平台轉換,點擊Player Settings,在Inspector會看到具體內容,點擊Other Settings,找到Identification中的Bundle Identifier,將其內容修改成Adnroid的packageName,也就是AndroidManifext.xml文件中package的值。
點擊File->Save Scene,保存場景。
5. 將AndroidManifest.xml與arr文件加入到Unity項目中
在Project里創建文件夾Plugins,在文件夾Plugins文件夾里創建文件夾Android,將app-debug.arr文件解壓,將其中的classes.jar文件與AndroidManifest.xml文件取出來放入Unity的Android文件夾下。
6. 調用Android類
打開Main Camera,點擊Add Component->New Script,創建一個c#文件,點擊Create and Add。
打開NewBehaviourScript.cs文件,進行編寫。
1 using UnityEngine; 2 using System.Collections; 3 4 public class NewBehaviourScript : MonoBehaviour { 5 // Use this for initialization 6 void Start () { 7 } 8 // Update is called once per frame 9 void Update () { 10 if (Input.GetKey(KeyCode.Escape)) 11 Application.Quit(); 12 } 13 void OnGUI() 14 { 15 if (GUILayout.Button("NoReturnValueAndNoParameter")) 16 { 17 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 18 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 19 jo.Call("test1"); 20 } 21 if (GUILayout.Button("HaveReturnValueAndNoParameter")) 22 { 23 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 24 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 25 string returnValue = jo.Call<string>("test2"); 26 Debug.Log("Have Return Value And No Parameter Return Value : " + returnValue); 27 } 28 if (GUILayout.Button("NoReturnValueAndHaveParameter")) 29 { 30 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 31 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 32 jo.Call("test3","Hello Android"); 33 } 34 if (GUILayout.Button("HaveReturnValueAndHaveParameter")) 35 { 36 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 37 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 38 string returnValue = jo.Call<string>("test4","Hello Android"); 39 Debug.Log("Have Return Value And Have Parameter Return Value : " + returnValue); 40 } 41 if (GUILayout.Button("staticFunction")) 42 { 43 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 44 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 45 jo.CallStatic("test5"); 46 } 47 } 48 }
7. 運行結果顯示