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.jarAndroidManifest.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也要放入)文件夹下面,也是完全可以,真的可以!!!省去了很多步骤 很方便

感谢一下文章

  1. Unity2019安卓环境配置
  2. Unity3D与Android平台通信
  3. Unity2019.4.4与AndroidStudio3.5.2交互

猜你喜欢

转载自blog.csdn.net/K20132014/article/details/109159008