Unity调用安卓原生的通用前奏(血泪史)

     完整源码demo地址:https://download.csdn.net/download/qq_37310110/10438314  

    参考博客地址:https://blog.csdn.net/qq_37310110/article/details/80455663

   老早就想着写一篇关于unity与安卓交互的博客记录了,一直也没有时间刚好最近项目与安卓原生的交互很频繁。就想着顺带记录一下我的安卓交互血泪史。网上 的参考博客很多很多五花八门,琳琅满目,其实都挺不错的但是呢在实际开发过程中会遇到各种各样的 你想不到的坑,而这些坑只能自己一个人默默的去填平。以下也是本博主参考网络及几何自身项目的记录。

开始:

下载安装最新版本AndroidStudio,部署安卓端

或许有的人会说习惯用Eclipse ,此处不做争论理论两个编辑器都是可以的,只不过一个打出的是jar包,一个打出的是arr包,具体arr包跟jar包的区别大家有兴趣可以深入一下,arr是比jar包更高一级的里面内容更多一些。其实最重要的一点现在androidStudio是大趋势 。

1.新建工程

          123内容随便填不做特殊要求,4的话会自动生成这个名字感觉上应该跟unity的包名一致,没做测试,为了免去不必要麻烦就设置一样。


    此界面不做设置默认即可,有特殊需求的做相应设置





      注意此处有大坑(本人所遇到的),一下的1.2默认是都勾选的意思应该是默认安卓的一套显示布局巴拉巴拉。本人在这里把这两个勾选给取消掉了,不要勾选切记。这个小步骤影响你后面的步骤的繁琐程度。



2.引用unity的classjar

 classes.jar的路径是不一样的,我在此贴出我的路径。大家参考



把此jar拖拽到libs,再从libs拖拽到unity目录,娘的走过去是移动,走回来就是复制粘贴了,真是厉害。



选中工程根目录右键 打开 OpenModuleSetting


好到此引用jar成功,预编译一下。



3.敲代码安卓端的java代码,我是安卓小白代码全靠粘贴

打开MainActivity类,这个类名是在新建工程的时候可以设置的

package com.romantic.forunity;

import android.app.AlertDialog;
import android.os.Vibrator;
import android.os.Bundle;
import android.widget.Toast;

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

public class MainActivity extends UnityPlayerActivity {

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

    }

    public String ShowDialog(final String _title, final String _content){

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle(_title).setMessage(_content).setPositiveButton("Down", null);
                builder.show();
            }
        });

        return "Java return";
    }

    // 定义一个显示Toast的方法,在Unity中调用此方法
    public void ShowToast(final String mStr2Show){
        // 同样需要在UI线程下执行
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),mStr2Show, Toast.LENGTH_LONG).show();
            }
        });
    }

    // 第一个参数是unity中的对象名字,记住是对象名字,不是脚本类名
    // 第二个参数是函数名
    // 第三个参数是传给函数的参数,目前只看到一个参数,并且是string的,自己传进去转吧
    public void callUnityFunc(String _objName , String _funcStr, String _content)
    {
        UnityPlayer.UnitySendMessage(_objName, _funcStr, "Come from:" + _content);
    }
}

4.为unity的成功调用做一下改动

1)在主 activity 结点下添加信息,否则在 Unity 导出 APK 时会报找不到manifest 文件的错误信息

2)修改application 中的应用样式,因为导出的 AAR 文件将不带自定义的样式,故不能从style.xml里取系统样式

3)同时需要删除res\Values目录下的styles.xml文件

4)修改mipmap重命名为drawable

有点乱但是按照步骤来哈  哈哈哈


修改AndroidManifest.xml





5.android端部署成功导出arr包

按照惯例先预编译一下然后


或者




然后把arr包还有androidMainifest.xml一起放到unity的android路径下

二.部署Uniuty端


unity端的测试代码

#region 模块信息
// **********************************************************************
// Copyright (C) 2018 Blazors
// Please contact me if you have any questions
// File Name:             Director
// Author:                romantic123fly
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CallAndroidTest : MonoBehaviour {
    private Text mText;

    void Start()
    {   
        mText = GameObject.Find("MsgText").GetComponent<Text>();
    }

    public void MyShowDialog()
    {
        // Android的Java接口  
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        // 参数  
        string[] mObject = new string[2];
        mObject[0] = "赤灵";
        mObject[1] = "终于起作用了";
        // 调用方法  
        string ret = jo.Call<string>("ShowDialog", mObject);
        setMsg(ref ret);
    }

    public void MyShowToast()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("ShowToast", "正在打印吐司。。。");
    }

    public void BeCallFunc(string _content)
    {
        setMsg(ref _content);
    }

    private void setMsg(ref string _str)
    {
        mText.text = _str;
    }
}

然后打包运行



  完整源码demo地址:https://download.csdn.net/download/qq_37310110/10438314  

  参考博客地址:https://blog.csdn.net/qq_37310110/article/details/80455663

猜你喜欢

转载自blog.csdn.net/qq_37310110/article/details/80455663