Unity2019.4与Android交互
前言
UnityPlayerActivity找不到!UnityPlayerActivity找不到!UnityPlayerActivity找不到!
换了2019.4版本 ,导出android发现很多错误.例如UnityPlayerActivity找不到,资源重复等等问题.原因在于Unity做了更改.好像是2019.2之后的版本做了升级(具体那个版本不知),话不多说,直接开搞
Android Studio
创建工程,记住包名
Android Studio中的配置和代码示例
首先导入classes.jar
,这一步都是没有变化,根据自己andriod项目mono/IL2Cpp
,找到对应的jar包,例如我的项目
ctrl+c,然后在AS Libs文件夹中ctrl+v,然后再点击Add as library
然后编辑MainActivity.java
,发现继承不了UnityplayerActivity
插件unity的Classes.jar包中是没有这个类存在的,这个时候我们需要在Untiy中找到UnityPlayerActivity
,例如我的路径
你可以直接把这个类添加到MainActivity
同级目录,但是我更加推荐直接把整个包拷贝过来
最后效果
然后我们在MainActivity
中写代码
package com.test.unityandroidtest;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
public static MainActivity instance = null; //单例类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance=this;
}
//利用Toast
public void SayHi(final String str)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_SHORT).show();
}
});
}
//计算两数之和
public int GetSum(int num1,int num2)
{
return num1+num2;
}
public static void SendUnity(String str)
{
String newstr="我是Android传来的消息:"+str;
UnityPlayer.UnitySendMessage("UnityAndroidConnect","AndroidCallUnityMsg",newstr);
}
}
然后修改AndroidManifest.xml
原来的
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.unityandroidtest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
修改后
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.unityandroidtest">
<application>
<!--表明这个Activity是启动Activity 一定要写完全的包名 路径-->
<activity android:name="com.test.unityandroidtest.MainActivity">
<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>
然后在AS中,标题任务栏 Build->Make Project.
一般的我们只要一个jar就可以了
用压缩包打开jar包,删除里面com目录下面
删除test文件中的buildConfig.class
注:在unity打包的时候,如果遇到
这种D8:Program type already presen
就表明资源重复了,上述两部都是 在删除多余的文件
Unity中
然后把我们的classes.jar
和AndroidManifest.xml
放在Unity中,classes.jar放在了libs文件夹中
接着在unity中 新建一个gameobject,命名为UnityAndroidConnect
,然后新添加一个脚本,写入代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
public Button btnToast, btnNum, btnString;
public Text text;
AndroidJavaClass jc;
AndroidJavaObject androidInstance; //单例
private void Start()
{
try
{
/* 下面的代码已不再适用
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
*/
//一定要写完整
jc = new AndroidJavaClass("com.test.unityandroidtest.MainActivity");
androidInstance = jc.GetStatic<AndroidJavaObject>("instance");
}
catch (Exception e)
{
text.text = "初始化错误:" + e.ToString();
}
btnToast.onClick.AddListener(MakeToast);
btnNum.onClick.AddListener(GetSum);
btnString.onClick.AddListener(UnitySendAndroid);
}
public void MakeToast()
{
try
{
androidInstance.Call("SayHi", "hello unity");
}
catch (Exception e)
{
text.text = e.ToString();
}
}
public void GetSum()
{
try
{
int num = 90;
int num2 = 90;
num = androidInstance.Call<int>("GetSum", num, num2); //返回值Int方法
text.text = "计算结果:" + num.ToString();
}
catch (Exception e)
{
text.text = e.ToString();
}
}
public void UnitySendAndroid()
{
try
{
string str = "loveyou";
jc.CallStatic("SendUnity", str); //静态方法 可以直接用AndroidJavaClass jc
}
catch (Exception e)
{
text.text = e.ToString();
}
}
/// <summary>
/// android 发来的消息
/// </summary>
/// <param name="recvMsg"></param>
public void AndroidCallUnityMsg(string recvMsg)
{
text.text = "结果:" + recvMsg;
}
}
Unity界面就随便搭建一下
打包设置
打包测试结果
最后的骚操作
上面的步骤打包运行,找资料的时候发现了别的sao操作,就是我们可以直接把编写好的java类放在unity中直接编译,这里有个官方GitHub项目,可以查看一下https://github.com/Unity-Technologies/uaal-example
例如我们上面的MainActivity
文件直接放在Unity Android(AndroidMainfest.xml也要放入)文件夹下面,也是完全可以
感谢一下文章
上一篇: 分治法-整数划分(java)
下一篇: 如何巧设置指定搜索引擎 让IE9更完美
推荐阅读
-
Android开发之图形图像与动画(一)Paint和Canvas类学习
-
Android开发之图形图像与动画(五)LayoutAnimationController详解
-
浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
-
Android编程中关于单线程模型的理解与分析
-
Android 用RxBinding与RxJava2实现短信验证码倒计时功能
-
iOS与Unity交互笔记之参数传递
-
Android webview与js交换JSON对象数据示例
-
浅析Android 快速实现图片压缩与上传功能
-
Android md5加密与php md5加密一致详解
-
基于Android XML解析与保存的实现