Unity调用Android类方法

发表于2018-12-05
评论0 5.8k浏览
做安卓平台的游戏开发,肯定需要去调用一些安卓的类,本篇就给到大家介绍下调用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
package com.xxxxxx.androidunitydemo;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    public void test1()
    {
        Log.v("Android_Unity", "no return value and no parameter");
    }
    public String test2()
    {
        Log.v("Android_Unity","have return value and no parameter");
        return "Hello Unity";
    }
    public void test3(String par)
    {
        Log.v("Android_Unity","no return value and have parameter");
        Log.v("Android_Unity",par);
    }
    public String test4(String par)
    {
        Log.v("Android_Unity","have return value and have parameter");
        Log.v("Android_Unity",par);
        return "Hello Unity";
    }
    public static void test5()
    {
        Log.v("Android_Unity", "static function");
    }
}

3、打包成arr文件

打开build.gradle文件,将apply plugin: ‘com.android.application’修改为apply plugin: ‘com.android.library’,将applicationId ‘com.XXXXXX.androidunitydemo’删除。

Build.gradle
apply plugin: 'com.android.library'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}

如果不用在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文件,进行编写。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
        if (Input.GetKey(KeyCode.Escape))
            Application.Quit();
    }
    void OnGUI()
    {
        if (GUILayout.Button("NoReturnValueAndNoParameter"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("test1");
        }
        if (GUILayout.Button("HaveReturnValueAndNoParameter"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            string returnValue = jo.Call<string>("test2");
            Debug.Log("Have Return Value And No Parameter Return Value : " + returnValue);
        }
        if (GUILayout.Button("NoReturnValueAndHaveParameter"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("test3","Hello Android");
        }
        if (GUILayout.Button("HaveReturnValueAndHaveParameter"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            string returnValue = jo.Call<string>("test4","Hello Android");
            Debug.Log("Have Return Value And Have Parameter Return Value : " + returnValue);
        }
        if (GUILayout.Button("staticFunction"))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.CallStatic("test5");
        }
    }
}

7、运行结果显示

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引