• unity调用Android的两种方式:其二,调用aar包


    上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html

    现在我们介绍一下怎么生成aar包和unity怎么调用aar

    一、通过Android studio生成aar

    首先,在Android studio上面新建一个工程。

    选择你要发布的Android 版本,注意:要和unity保持一致。

    选择empty activity

    默认的activity name不用动,直接点finish

     

    找到unity的安装路径D:****EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClasses

    复制class.jar到Android studioProjectapplibs

    在Android studio的file 找到Project Structure... 点击

    接下来找到app,找到dependdencies,点击右边的+号,选择第二个 2 file dependency

    找到 libs下刚导进去的class.jar, 点击OK

    接下来就是在MainActivity里编写接口了

    将MainActivity继承UnityPlayerActivity,然后删掉setContentView(R.layout.activity_main); 如果不继承UnityPlayerActivity也是可以的,

    类似这样

    或者这样

     选择其中的一种编写来接口

    package com.hello.world;
    
    import android.os.Bundle;
    import android.util.Log;
    
    import com.unity3d.player.UnityPlayerActivity;
    
    public class MainActivity extends UnityPlayerActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
      //接口
        public String test()
        {
            Log.v("测试","成功");
            return "测试成功";
        }
    
    }
    

     在AndroidManifest.XML中添加 <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 

    OK,目前为止准备工作已经完成了,接下来该打aar包了

    点击Build/Build APK

    当Android studio右上角显示这个时,说明已经build成功了

    好了,结束了,已经打包好了arr包,就在outputs下,跟打jar包相比是不是省事多了

    二、unity调用aar

    新建一个工程,将unity切换到Android平台,点击player Setting

    将unity的包名和Android的版本设置的和aar包的一样

    在assets先创建Plugins/Android,主要名字别写错了,在Android studio中找到aar包,把它放在Android文件夹下,arr和jar一样,名字可以随意改,

    把Android studio里的AndroidManifest.XML也放到unity的Plugins/Android路径下。

    添加脚本test,保存场景为test

    接下来的这一步非常关键:

     在unity里双击你的arr包,如果不能打开,就下一个解压工具,双击app-debug后会弹出这个框

    找到libs,打开

     删掉里面的class.jar, 关闭窗口,不删掉会报错的同志们。

     

     然后在test脚本里添加如下代码

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 
     5 public class Test : MonoBehaviour {
     6 
     7     void OnGUI()
     8     {
     9         //方法一
    10         try {
    11             var javaClass = new AndroidJavaObject("com.hello.world.MainActivity");
    12             string value1=javaClass.Call<string>("test");
    13             GUI.Label (new Rect(10,10,500,500),value1);
    14         } catch (System.Exception ex) {
    15             GUI.Label (new Rect(10,10,500,500),ex.ToString());
    16         }
    17         //方法二
    18         try {
    19             AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
    20             AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
    21             string value2=jo.Call<string> ("test");
    22             GUI.Label(new Rect(20,20,500,500),value2);
    23         } catch (System.Exception ex) {
    24             GUI.Label (new Rect(20,20,500,500),ex.ToString());
    25         }
    26 
    27     }
    28 }

     打包场景,搞定。

    Android模拟器运行结果:

    如果你按我上面的步骤进行的,或者看其他人写的教程,Unity在Build时都一样报错,那么恭喜你,你将终结这个噩梦。

    1、找到Android studio工程里的values/styles.xml

     

    2、打开后是这样子的

    3、同志们,重点来了,简单粗暴一点,将styles.xml里的东西统统删掉,只留下如下内容

    OK了,重新生成aar包,然后放心的扔到Unity了Build去吧,绝对不会再有问题了。

    求关注啊,同志们

    2017.11.3 Update

    现在只想优优雅雅的说声:“wo ca”

    突破我的认知的了,

    之前认为unity场景中存在多个 AndroidManifast.XML 时,会冲突

    之前认为unity场景中导入aar包的时候必须在/Plugins/Android路径下添加其AndroidManifast.XML

    今天测试发现,这两种问题都不存在了,当时可是折磨了半个月呀,难道是unity版本更新导致问题解决了?

    不过目测不能通过

    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); string value2=jo.Call<string> ("test");

    这种方法调用,报空。

    我是用下面的方法调用成功的

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 
     5 public class NewBehaviourScript : MonoBehaviour {
     6 
     7     void OnGUI()
     8     {
     9         try {
    10             AndroidJavaObject jc = new AndroidJavaObject ("com.hello.world.MainActivity");
    11             string value2=jc.Call<string> ("test");
    12             GUI.Label(new Rect(20,20,500,500),value2);
    13         } catch (System.Exception ex) {
    14             GUI.Label (new Rect(20,20,500,500),ex.ToString());
    15         }
    16     }
    17 }
  • 相关阅读:
    设置eclipse控制台上的信息输入到某个文件
    [HTML]去除li前面的小黑点,和ul、LI部分属性[转]
    fscanf函数的应用
    VC++中编译C出错:error C2143: syntax error : missing ';' before 'type'
    eclipse console输出有长度限制
    jstl之核心标签
    vmware esxi 6.0 开启嵌套虚拟化
    Proxmox如何进入单人维护模式(重置root密码)
    jstl错误排除:According to TLD or attribute directive in tag file, attribute value does not accept any expressions
    EL表达式
  • 原文地址:https://www.cnblogs.com/Jason-c/p/6743385.html
Copyright © 2020-2023  润新知