栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity与Android相互交互(一)

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity与Android相互交互(一)

最近被安排到,去做一个阅读器的App,要对接第三方的安卓和IOS的原生SDK,他们的Demo也是原生代码写的,对于第一次接触的我来说,难度有点大,而且也没人带,完全自己研究,各种网上查,跟着很多个教程做,都没成功,耗时一个星期总于可以了,在这里记录以下,

一般安卓的SDK提供的文件是aar或者jar,如果他们提供的有与unity可以交互的接口类,就直接把aar/jar文件导入到Unity工程中的Plugins/Android文件夹下面,创建脚本,根据SDK文档调用对应的方法即可。如果SDK没有提供与unity交互的接口,可以自己在AndroidStudio(下面简称AS),做一层封装,

而我用的SDK就没有与Unity交互的接口,

第一步创建新的AS工程

2、点击下一步 注意MinimumSDK 要与unity一致,(因为我的路径下已经有一个MyApplication 所以在Savelocation 在MyApplication后面加了一个3,)

3、新工程界面就是这样哒,然后点击左上角的Android切换成Project


4、在根目录右键 创建新的Module, 选着AndroidLibrary,Packagename这个是包的路径要在unity中用到,MinimumSDK要和unity保持一致


创建后的的目录

5、创建一个Class脚本 ,这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,
UnitySendMessage可以调用到Unity里的方法,第一个参数是所调用方法所挂载脚本的物体名字(区分大小写),第二个是方法名,第三个是参数

package com.sdk.mylibrary;

import android.app.Activity;
import android.widget.Toast;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class UnityAndAndroid {
    
    private Activity _unityActivity;

    
    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;
    }

    
    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;
    }

    
    public boolean showToast(String content){
        Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
        //这里是主动调用Unity中的方法,
        callUnity("Main Camera","FromAndroid", "hello unity i'm android");
        return true;
    }

    //测试unity调用的方法
    public int Add(int a,int b)
    {
        return a+b;
    }
}

6、选着菜单栏Build----RebuildProject 导出aar包,然后复制aar包放到Unity的Assets/Plugins/Android目录下面,

7、创建C#脚本,把脚本挂载到相机上(因为在安卓的callUnity(“Main Camera”,“FromAndroid”, “hello unity i’m android”);这行代码中,标明了从相机上获取FromAndroid的方法),

using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour {

    /// 
    /// 场景上的文本框用来显示android发送过来的内容
    /// 
    public Text text;
    public Text text2;

    /// 
    /// android原生代码对象
    /// 
    AndroidJavaObject _ajc;

    void Start () {
        //通过该API来实例化导入的arr中对应的类
        _ajc = new AndroidJavaObject("com.sdk.myunity.UnityAndAndroid");
        int add = _ajc.Call("Add", 100, 2);
        text2.text = add.ToString();
    }
    
    void Update () {
        
    }

    /// 
    /// 场景上按点击时触发该方法
    /// 
    public void OnBtnClick()
    {
        Debug.Log("调用安卓");
        //通过API来调用原生代码的方法
        bool success = _ajc.Call("showToast","this is unity");
        if(true == success)
        {
            //请求成功
        }
    }

    /// 
    /// 原生层通过该方法传回信息
    /// 
    /// 
    public void FromAndroid(string content)
    {
        text.text = content;
    }
}

8、然后打包APK 在手机上运行,即可,

下一个博客写如何接入第三方的SDK

参考链接:https://blog.csdn.net/qq_40544338/article/details/118406173

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号