#1.在AS中新建Empty Activity工程
#2.在Android视图下选中app右键选中Module,创建新的 Android Library
后续只对mysdk模块进行操作。
#3、引入Unity对接Android的库文件
导入classes.jar文件:
2018版本中路径为:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar
将classes.jar粘贴到mysdk模块的libs目录下**(需要将工程切换到project视图)**
这个classes.jar文件就被引入到工程后,展开三角,可以看到如下三个模块,其中就有com.unity3d.player。
4、创建本模块的Activity文件
展开mysdk模块下的src目录,选中com.***.mysdk,然后右键,新建一个Activity,选择Empty Activity,输入Activity Name以及Package Name和Language,勾掉Generate Layout File, 完成。
脚本初始为:
package com.example.mysdk;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class PrMainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
现将SDKMainActivity脚本内容修改为继续自UnityPlayerActivity ,并添加两个方法 UnityCallAndroid 和 AndroidCallUnity,
package com.example.mysdk;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class SDKMainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//unity调用Android
public void UnityCallAndroid () {
Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();
AndroidCallUnity();
}
//android调用unity
public void AndroidCallUnity () {
//第1个参数为Unity场景中用于接收android消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
}
}
#5、将模块打包
打包方法有两种。
一是手动进行构建,然后在Build/intermediates/packaged-classes/release目录下找到相应的jar包(这个jar包默认名称为classes.jar,为了区分,需要自己改名称);
二是用gradle命令。
打开本模块的build.gradle文件,在文件尾添加如下的一组命令。
//----------------这是一组将module导出为jar的gradle命令-------------------
// mysdk为自定义的jar包名称
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/mysdk.jar'
}
//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/packaged-classes/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'mysdk.jar')
}
exportJar.dependsOn(deleteOldJar, build)
//---------------------------命令结束------------------------------
build.gradle文件修改后,会提示要求同步,直接同步即可。同步结束,在IDE右上点开Gradle窗口,在other下找到exportJar命令。在mysdk/release/目录下得到生成的jar包。
#6、修改AndroidManifest.xml文件
文件初始只有一对application标签和activity标签
修改为:
<application android:label="MySDK">
<activity android:name="com.example.mysdk.PrMainActivity"></activity>
<!-- 这个android:name的值必须为包名+类名 -->
<activity android:name="com.example.mysdk.SDKMainActivity">
<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>
#在unity中使用jar文件
新建一个Unity工程,在Assets目录下新建Plugins/Android/bin目录。
AndroidManifest.xml文件拷贝到Assets/Plugins/Android目录下
mysdk.jar文件拷贝到Assets/Plugins/Android/bin目录下
#制作测试UI界面
receiveObj的名称必须与SDKMainActivity类的AndroidCallUnity方法中的UnityPlayer.UnitySendMessage方法的第一个参数保持一致。
创建SDKTest脚本挂载到receiveObj上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SDKTest : MonoBehaviour
{
private AndroidJavaClass jc;
private AndroidJavaObject jo;
private Button btn;
private Text text;
private void Awake()
{
btn = transform.Find("Button").GetComponent<Button>();
text = transform.Find("Text").GetComponent<Text>();
//这两行是固定写法
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
btn.onClick.AddListener(OnBtnClickHandler);
}
private void OnBtnClickHandler()
{
//调用Android中的方法UnityCallAndroid
jo.Call("UnityCallAndroid");
}
/// <summary>
/// 被Android中AndroidCallUnity调用
/// </summary>
/// <param name="str"></param>
public void UnityMethod(string str)
{
Debug.Log("UnityMethod被调用,参数:" + str);
text.text = str;
}
}
#打包并测试。