意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

Unity调用安卓原生的通用前奏(血泪史)

来源:恒创科技 编辑:恒创科技编辑部
2022-10-02 22:00:04


欢迎加入Unity业内qq交流群:956187480



Unity调用安卓原生的通用前奏(血泪史)


b站有别人的视频教程:​​https://www.bilibili.com/video/av13882682​​

老早就想着写一篇关于unity与安卓交互的博客记录了,一直也没有时间刚好最近项目与安卓原生的交互很频繁。就想着顺带记录一下我的安卓交互血泪史。网上 的参考博客很多很多五花八门,琳琅满目,其实都挺不错的但是呢在实际开发过程中会遇到各种各样的 你想不到的坑,而这些坑只能自己一个人默默的去填平。以下也是本博主参考网络及几何自身项目的记录。

开始:

下载安装最新版本AndroidStudio,部署安卓端

或许有的人会说习惯用Eclipse ,此处不做争论理论两个编辑器都是可以的,只不过一个打出的是jar包,一个打出的是arr包,具体arr包跟jar包的区别大家有兴趣可以深入一下,arr是比jar包更高一级的里面内容更多一些。其实最重要的一点现在androidStudio是大趋势 。

1.新建工程

123内容随便填不做特殊要求,4的话会自动生成这个名字感觉上应该跟unity的包名一致,没做测试,为了免去不必要麻烦就设置一样。

Unity调用安卓原生的通用前奏(血泪史)_3d

此界面不做设置默认即可,有特殊需求的做相应设置

Unity调用安卓原生的通用前奏(血泪史)_unity_02

Unity调用安卓原生的通用前奏(血泪史)_android_03

注意此处有大坑(本人所遇到的),一下的1.2默认是都勾选的意思应该是默认安卓的一套显示布局巴拉巴拉。本人在这里把这两个勾选给取消掉了,不要勾选切记。这个小步骤影响你后面的步骤的繁琐程度。

Unity调用安卓原生的通用前奏(血泪史)_java_04

2.引用unity的classjar

classes.jar的路径是不一样的,我在此贴出我的路径。大家参考

Unity调用安卓原生的通用前奏(血泪史)_3d_05

把此jar拖拽到libs,再从libs拖拽到unity目录,娘的走过去是移动,走回来就是复制粘贴了,真是厉害。

Unity调用安卓原生的通用前奏(血泪史)_android_06

选中工程根目录右键 打开 OpenModuleSetting

Unity调用安卓原生的通用前奏(血泪史)_java_07

好到此引用jar成功,预编译一下。

Unity调用安卓原生的通用前奏(血泪史)_unity_08

3.敲代码安卓端的java代码,我是安卓小白代码全靠粘贴

打开MainActivity类,这个类名是在新建工程的时候可以设置的

package com.romantic.forunity;

import android.app.AlertDialog;
import android.os.Vibrator;
import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}

public String ShowDialog(final String _title, final String _content){

runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null);
builder.show();
}
});

return "Java return";
}

// 定义一个显示Toast的方法,在Unity中调用此方法
public void ShowToast(final String mStr2Show){
// 同样需要在UI线程下执行
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show();
}
});
}

// 第一个参数是unity中的对象名字,记住是对象名字,不是脚本类名
// 第二个参数是函数名
// 第三个参数是传给函数的参数,目前只看到一个参数,并且是string的,自己传进去转吧
public void callUnityFunc(String _objName , String _funcStr, String _content)
{
UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content);
}
}

4.为unity的成功调用做一下改动

1)在主activity结点下添加信息,否则在Unity导出APK时会报找不到manifest文件的错误信息

2)修改application中的应用样式,因为导出的AAR文件将不带自定义的样式,故不能从style.xml里取系统样式

3)同时需要删除res\Values目录下的styles.xml文件

4)修改mipmap重命名为drawable

有点乱但是按照步骤来哈 哈哈哈

修改AndroidManifest.xml

Unity调用安卓原生的通用前奏(血泪史)_java_09


Unity调用安卓原生的通用前奏(血泪史)_unity_10

5.android端部署成功导出arr包

按照惯例先预编译一下然后

Unity调用安卓原生的通用前奏(血泪史)_交互_11

或者

Unity调用安卓原生的通用前奏(血泪史)_java_12

Unity调用安卓原生的通用前奏(血泪史)_交互_13

然后把arr包还有androidMainifest.xml一起放到unity的android路径下

二.部署Uniuty端

Unity调用安卓原生的通用前奏(血泪史)_交互_14

unity端的测试代码

#region 模块信息
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name: Director
// Author: romantic123fly
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CallAndroidTest : MonoBehaviour {
private Text mText;

void Start()
{
mText = GameObject.Find("MsgText").GetComponent<Text>();
}

public void MyShowDialog()
{
// Android的Java接口
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 参数
string[] mObject = new string[2];
mObject[0] = "赤灵";
mObject[1] = "终于起作用了";
// 调用方法
string ret = jo.Call<string>("ShowDialog", mObject);
setMsg(ref ret);
}

public void MyShowToast()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("ShowToast", "正在打印吐司。。。");
}

public void BeCallFunc(string _content)
{
setMsg(ref _content);
}

private void setMsg(ref string _str)
{
mText.text = _str;
}
}

然后打包运行

Unity调用安卓原生的通用前奏(血泪史)_java_15

Unity调用安卓原生的通用前奏(血泪史)_3d_16


欢迎加入Unity业内qq交流群:956187480


上一篇: 租用美国服务器:潜在的风险与应对策略。 下一篇: MongoDB 5.0 扩展开源文档数据库操作