zoukankan      html  css  js  c++  java
  • unity与android交互总结

    在网上找了很多教程,基本上使用的方法都是在eclipse上新建普通android工程,让主activity继承UnityPlayerActivity,然后在该activity中写供unity调用的接口或者主动要回调unity的接口,然后导出jar包到unity。

    这种方式只要人品不好就会出一堆乱七八糟的问题:

      如新建工程时选择SDK版本小于4.0时在unity build APK时报错,因为style.xml就不会有parent="Theme.AppCompat.Light,而是parent="android:Theme.Light";

      如成功在unity打包出apk后运行时根本进不了unity中的场景内容而是直接进入了android中的activity(可能原因是电脑上的android环境和unity(或者操作系统)是不同版本的,一个是32位一个是64位)

      如....

    也试过用android studio,以为官方的东西可能靠谱一些,结果发现android studio不能直接导出jar包,需要新建library再修改配置发布文件等等多个复杂步聚……最终生成jar包了,然并卵,仍然不能使用,貌似生成的jar包内容不对,遂放弃,不想继续研究了,也许是我方法出错……

    以下是我认为最靠谱省事的办法:

      1.unity中新建空项目。

      2.选择导出android工程。

      3.用eclipse打开该工程(若已有需要接入的android工程则进行合并),在eclipse中开始写接口。

      4.接口完成后右键点击src目录Export->Java->JAR file导出jar包,注意只需要导出src目录中的东西就可以了,不要加入其它没用的东西(有第三方插件时可能需要打包插件相关的东西)。

      5.回到unity,在Project中新建plugins/Android(unity5.x以前版本必须是该目录结构)目录,将上一步导出的jar包放进该目录中(最好再建个bin目录,放到bin中),另外将android项目中的AndroidMainFest.xml也复制到Android下(有第三方插件时res整个目录也需要复制)。

      6.接下来就可以在unity中自由使用刚做好的android插件吧!

    这种方式导出的android工程省去了手动去unity安装路径中去寻找并导入class.jar及Bundle Identifier要与unity保持一致等问题。

    接下来说说unity调用android接口的两种方式:

    1. 多数使用的:

    1 if(GUILayout.Button("test",GUILayout.Height(100)))
    2 {
    3      AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    4       AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    5      jo.Call("AndroidFunction","teststring");
    6 }

    这种方式需要修改android主activity让其继承UnityPlayerActivity,通过获得的jo调用该activity中的各种接口。

    2.在android工程中不修改任何代码,直接在src中新建普通class(当然也可以放在新建的包中),不需要继承任何类,直接写入你需要提供给unity调用的接口,后面unity调用方式如下:

    1 if(GUILayout.Button("test",GUILayout.Height(100)))
    2 {
    3      AndroidJavaClass jc = new AndroidJavaClass("com.package.package.YourNewClass");
    4      //或者AndroidJavaObject jo = new AndroidJavaObject("com.package.package.YourNewClass");
    5      jc.CallStatic("AndroidFunction","teststring");
    6      //或者jo.CallStatic("AndroidFunction","teststring");
    7      //方法无论是public还是private都可以调用到,如要调用非static的方法则只能使用jo
    8 }

    当你有多个插件SDK需要接入时就可以分别写在不同的类中,以降低偶合。当然如果SDK有UI交互则仍是需要activity的(在android中需要获得当前unity的activity可以通过UnityPlayer.currentActivity获得)。

    android回调unity的两种方法:

    1. 简单直接的:UnityPlayer.UnitySendMessage("TestGameObject", "Func", str)。

    2. 首先在Java中定义接口,例如:

    public interface IMyCallback {
        void OnDone();
        void OnDoneWithArg(String arg1);
    }

    然后通过AndroidJavaProxy在C#中实现接口,例如:

    class AndroidMyCallback : AndroidJavaProxy
    {
        public AndroidMyCallback()
        : base("com.mygame.IMyCallback")
        {
        }
        public void OnDone(AndroidJavaObject result)
        {
        }
        public void OnDoneWithArg(string arg1)
        {   
        }
    }

    在C#中实例化这个接口类型,并传递给Java:

    javaClass.CallStatic("InvokeWithCallback", new AndroidMyCallback());

    最后在Java里面回调该接口:

    public static void InvokeWithCallback(IMyCallback callback) {
        callback.OnDone();
        callback.OnDoneWithArg("");
    }
  • 相关阅读:
    13、字符串相互匹配删除
    12、指定长度替换制表符
    11、输入字符颠倒输出
    10、字符串输入删除末尾特殊符,清除空行
    9、筛选满足长度条件的输入内容进行输出
    8、获取输入的字符串并输出最长的那个
    7、初识函数
    6、计数垂直直方图输出
    5、计数水平直方图输出
    Tiny4412 Uboot
  • 原文地址:https://www.cnblogs.com/suoluo/p/5443889.html
Copyright © 2011-2022 走看看