Unity2018、2019和安卓通信,基于AAR包优化

说明和优点

Unity高版本以后,把UnityPlayActivity.java从jar包分离了出来;
Unity集成了安卓打包的全部环境,包括SDK、OpenJava,默认会下载一个最新的Platform编译平台

classes.jar包和UnityPlayActivity.java文件位置

\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

优点
1、项目的包名不需要和安卓的包名一致
2、不需要处理classes.jar文件
3、使用起来方便

搭建安卓项目

1、创建一个空的AS项目
2、在项目里面创建一个Module
Unity2018、2019和安卓通信,基于AAR包优化_第1张图片
3、修改build.grade
Unity2018、2019和安卓通信,基于AAR包优化_第2张图片
4、复制资源到Module里面

复制\Unity\Hub\Editor\2019.4.6f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk\res覆盖到项目里面的res目录

5、修改Manifest文件


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.newgamestudio.unitydemolib">

    <application>
        <activity
            android:name="com.newgamestudio.unitydemolib.DemoActivity"
            android:theme="@style/UnityThemeSelector">
            <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、编写android和unity通信代码

public class AndroidUnityDemo {
     
    /**
     * unity项目启动时的的上下文
     */
    private Activity _unityActivity;
    /**
     * 获取unity项目的上下文
     * @return
     */
    Activity getActivity(){
     
        if(null == _unityActivity) {
     
            try {
     
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                _unityActivity = activity;
            } catch (ClassNotFoundException e) {
     

            } catch (IllegalAccessException e) {
     

            } catch (NoSuchFieldException e) {
     

            }
        }
        return _unityActivity;
    }

    /**
     * 调用Unity的方法
     * @param gameObjectName    调用的GameObject的名称
     * @param functionName      方法名
     * @param args              参数
     * @return                  调用是否成功
     */
    boolean callUnity(String gameObjectName, String functionName, String args){
     
        try {
     
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,gameObjectName,functionName,args);
            return true;
        } catch (ClassNotFoundException e) {
     

        } catch (NoSuchMethodException e) {
     

        } catch (IllegalAccessException e) {
     

        } catch (InvocationTargetException e) {
     

        }
        return false;
    }

    /**
     * Toast显示unity发送过来的内容
     * @param content           消息的内容
     * @return                  调用是否成功
     */
    public boolean showToast(String content){
     
        Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
        //这里是主动调用Unity中的方法,该方法之后unity部分会讲到
        callUnity("Main Camera","FromAndroid", "hello unity i'm android");
        return true;
    }
}

7、打包AAR文件,复制AAR和mianfest文件到Unity的Plugins/Android下面

搭建Unity项目

1、放置文件
Unity2018、2019和安卓通信,基于AAR包优化_第3张图片
2、编写测试代码

public class UnityAndroidDemo1 : MonoBehaviour
{
     
    public Text m_TxtAndroid;
    private AndroidJavaObject mJavaObj;

    private void Start()
    {
     
        mJavaObj = new AndroidJavaObject("com.newgamestudio.unitydemolib.AndroidUnityDemo");
    }

    public void OnClick()
    {
     
        bool success = mJavaObj.Call<bool>("showToast", "Unity Call.");
        Debug.Log(success);
    }

    public void FromAndroid(string content)
    {
     
        m_TxtAndroid.text = content;
    }
}

3、真机测试


安卓项目和Unity源码下载:
https://download.csdn.net/download/inspironx/12704690

你可能感兴趣的:(Game,unity3d)