zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    与众不同 windows phone (15) Media(媒体)之后台播放音频
    与众不同 windows phone (14) Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成
    与众不同 windows phone (10) Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息
    与众不同 windows phone (17) Graphic and Animation(画图和动画)
    与众不同 windows phone (5) Chooser(选择器)
    与众不同 windows phone (26) Contacts and Calendar(联系人和日历)
    与众不同 windows phone (7) Local Database(本地数据库)
    与众不同 windows phone (19) Device(设备)之陀螺仪传感器, Motion API
    与众不同 windows phone (16) Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成
  • 原文地址:https://www.cnblogs.com/Jason-c/p/6743385.html
Copyright © 2011-2022 走看看