欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity2019.4与Android交互

程序员文章站 2022-06-11 08:50:31
...

前言

UnityPlayerActivity找不到!UnityPlayerActivity找不到!UnityPlayerActivity找不到!
换了2019.4版本 ,导出android发现很多错误.例如UnityPlayerActivity找不到,资源重复等等问题.原因在于Unity做了更改.好像是2019.2之后的版本做了升级(具体那个版本不知),话不多说,直接开搞

Android Studio

创建工程,记住包名

Unity2019.4与Android交互

Android Studio中的配置和代码示例

首先导入classes.jar,这一步都是没有变化,根据自己andriod项目mono/IL2Cpp,找到对应的jar包,例如我的项目
Unity2019.4与Android交互
ctrl+c,然后在AS Libs文件夹中ctrl+v,然后再点击Add as library
Unity2019.4与Android交互
Unity2019.4与Android交互
Unity2019.4与Android交互
然后编辑MainActivity.java,发现继承不了UnityplayerActivity
Unity2019.4与Android交互
插件unity的Classes.jar包中是没有这个类存在的,这个时候我们需要在Untiy中找到UnityPlayerActivity,例如我的路径
Unity2019.4与Android交互
你可以直接把这个类添加到MainActivity同级目录,但是我更加推荐直接把整个包拷贝过来
Unity2019.4与Android交互
最后效果
Unity2019.4与Android交互
然后我们在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就可以了
Unity2019.4与Android交互
用压缩包打开jar包,删除里面com目录下面
Unity2019.4与Android交互
删除test文件中的buildConfig.class
Unity2019.4与Android交互
注:在unity打包的时候,如果遇到
Unity2019.4与Android交互
这种D8:Program type already presen就表明资源重复了,上述两部都是 在删除多余的文件

Unity中

然后把我们的classes.jarAndroidManifest.xml放在Unity中,classes.jar放在了libs文件夹中
Unity2019.4与Android交互
接着在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界面就随便搭建一下
Unity2019.4与Android交互
打包设置
Unity2019.4与Android交互
打包测试结果
Unity2019.4与Android交互

最后的骚操作

上面的步骤打包运行,找资料的时候发现了别的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交互
相关标签: unity android