Android Studio与Unity3D结合的结构

登录后复制

使用版本:
Unity:2018.2.10f
AS:3.5

最近由于需要接公司原生的java SDK,所以打算用U3D调用sdk、然后监听sdk回调的方法,麻烦的地方在于sdk部分需要在AS中去做。

1,根据博客中的方法,首先新建一个安卓工程

android unity3d 结构 android studio unity3d_android studio

android unity3d 结构 android studio unity3d_android unity3d 结构_02



2,工程新建之后右键创建一个模块,取名叫unityactivity,注意这里的包名和新建工程的包名要一致(尽量避免不必要的错误,当然具体原因我还不太清楚)

android unity3d 结构 android studio unity3d_android unity3d 结构_03

android unity3d 结构 android studio unity3d_android unity3d 结构_04

android unity3d 结构 android studio unity3d_安卓_05



3,然后打开U3D安装目录,找到Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下的classes.jar,找到后复制放入unityactivity模块的libs文件夹下,然后右键->Add as Library

android unity3d 结构 android studio unity3d_android unity3d 结构_06

android unity3d 结构 android studio unity3d_unity_07



这里选默认的就行了,也就是导入到unityactivity文件夹下,导入之后截图如下(classes.jar前面有效小三角,代表导入成功):

android unity3d 结构 android studio unity3d_android_08

android unity3d 结构 android studio unity3d_android studio_09

android unity3d 结构 android studio unity3d_android_10



4,在AS中编写交互脚本,一个是U3D调用AS,然后AS给U3D回调。如果是接SDK的话,即U3D调用SDK的消息,然后等SDK收到回调方法后,再把消息通知给U3D。代码如下:

登录后复制

package com.yadong.unityactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Toast;

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

public class UnityMainAcivity extends UnityPlayerActivity {

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

    //unity调用Android
    public void UnityCallAndroid () {
        AndroidCallUnity();
    }

    //android调用unity
    public void AndroidCallUnity () {
        //第1个参数为Unity场景中用于接收android消息的对象名称
        //第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
        //第3个参数为unity方法的参数
        UnityPlayer.UnitySendMessage("Text", "fromeAndroid", "安卓给你发消息了.");
        Toast.makeText(this,"android给U3D返回消息", Toast.LENGTH_LONG).show();
    }
}


5,修改AndroidManifest.xml

android unity3d 结构 android studio unity3d_android studio_11

登录后复制

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yadong.unityactivity">

    <!-- 这个android:label设置后,unity中ProductName就不生效了,记得改这个-->
    <application >

        <!-- 这个android:name的值必须为包名+类名-->
        <activity android:name="com.yadong.unityactivity.UnityMainAcivity">
            <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>



6,先Build-Clean Project一下,然后Build-Make Module ‘模块名字’,生成jar包,结果如下:

android unity3d 结构 android studio unity3d_android unity3d 结构_12

android unity3d 结构 android studio unity3d_android studio_13


7,在unity新建文件夹 Plugins/Android/bin,将上一步找到的classes.jar放进去,同时将第六步修改的AndroidManifest.xml复制到Plugins/Android和bin同一层级,放完后:

android unity3d 结构 android studio unity3d_unity_14



8,接下来我们处理U3D的部分,新建一个测试的脚本

登录后复制

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
    public Text text;

    public Button btn;
    AndroidJavaObject jo;
    private void Start()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        btn.onClick.AddListener(CallAndroid);

    }

    public void CallAndroid()
    {

        jo.Call("UnityCallAndroid");
        Debug.Log("点击按钮");
        System.Console.WriteLine("点击按钮");
    }

    void methodName111(string str)
    {
        text.text = str;
        Debug.Log(str);
        System.Console.WriteLine(str);
    }

    void fromeAndroid(string str)
    {
        text.text = str;
        Debug.Log("安卓传来信息 : " + str);
        System.Console.WriteLine("安卓传来信息 : " + str);
    }
}

9,然后建个Text,将脚本拖上去;再建个button,监听点击回调

android unity3d 结构 android studio unity3d_android unity3d 结构_15

10,打包成apk,这里要注意apk的包名不能与安卓的包名一致

android unity3d 结构 android studio unity3d_unity_16

最终测试结果:

android unity3d 结构 android studio unity3d_android unity3d 结构_17

android unity3d 结构 android studio unity3d_android studio_18



unity2020以后的classes.jar所在位置:

登录后复制

Unity Hub\Hub\Editor\2020.3.33f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

另外unity 2019.3后的版本classes.jar不包含UnityPlayerActivity类了,我们需要复制UnityPlayerActivity.java到模块src路径下。

UnityPlayerActivity.java位置:

登录后复制

Unity Hub\Hub\Editor\2020.3.33f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

其实对于AS工程来说来说,正常开发即可。如果想继承UnityPlayerActivity,打包的时候需要在build.gradle中添加如下字段:

登录后复制

compileOnly fileTree(include: ['*.jar'], dir: 'libs')
    compileOnly files('libs/classes.jar')
    
    android unity3d 结构 android studio unity3d_android unity3d 结构_19

并在打包后解压缩aar,删除 classes.jar和UnityPlayerActivity.java,否则unity中打包时候会报类重复的错误。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空