普通人物怨 发表于 2021-1-13 17:52

Unity 与Android交互-调用 Android 打包 SDK

题外话

我本来不想写这篇文章的,但是我特么忍无可忍了,在baidu上搜啊,出现的文章都是一个人写的,你们复制粘贴能不能敬业点,最起码改个路径啥的也对的起来搜索的小伙伴们吧,然后就是用eclipse来搞的,都3000年了啊,现在谁不用Android studio啊。逼的我没有办法了最近万里长城还格外坚固村里围栏屹立不倒,联系了下国外的小姐姐开个远程控制才寻找到了很多有用的小知识。
写作背景

有个需求就是在unity里面调用外面的各种硬件设备,所以解决各种问题就只能在android下来解决,unity里面调用来,之前搜索的都是获取什么wifi信号手机电量的,好像并没有什么卵用参考价值,这里不讲其他设备怎么在android上跑通,只说unity与android交互的桥梁,桥梁架通你调用原子弹都没人管你。
正题了啊!注意了!

首先你得有Android studio可以有一个unity(主要是用到里面的一个jar包,到时候心情好我共享一下)要非常虔诚的读下面的内容


在Android studio上建一个新的项目


项目建好了就是这个目录
项目建立完成
然后在当前的项目里面新建一个module,注意注意!选择Android Library
准备新建module
选择android library
全凭爱好起名
创建完成后现在目录是这个 额样
里面多了一个noyaoface的module
然后我们把里面那个app的module给删掉吧,没什么 8用。
删这个应该知道怎么删除吧,算了,我还是截图吧
我这个版本的Android studio可能在我写这篇文章的时候比较新,是3.4.1的
点完OK然后在目录上右击删除
好了,这个app已经离我们而去了
开始搞代码了
我们现在看到我们新建的这个module里面跟平常app里面的目录结构没啥区别,就是里面少一个mainActivity,没有事情,我们也新建一个,这里我要说的就是,这个新建的activity就相当于我们在unity里面调用的一个入口,说了这么多,看图就行。
注意!这个给取消,我们不需要layout布局
创建好后就是这样的结构了,下面开始说重点 重点 重点
因为是unity与Android交互,里面需要用到一个unity的一个jar包,这个jar包一般都在这里
/Unity/Hub/Editor/2019.2.0b1/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar
/Unity/Hub/Editor/2019.2.0b1/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar
这个我得提一下,要不你们光知道有这个东西不知道在哪里,这个jar包好说,等会我传一下子,要是写完的时候忘了,你们联系我再给你们发,我为了这个jar包现安装了一个unity,很烦。
我们把这个jar包放到libs里面然后导入一下
开始写代码了
开这啊!这是重点!你们不管在哪里查找的资料都是说要继承这个activity,这个不能说错的,我觉得是不科学的,具体原因不细说了给你们资料里面说的挺清除,给你们转个链接就差不多明白了,这个链接国内可以打开。
我们给改成这样
代码到下面复制
package com.fornb.noyaoface;

import android.app.Fragment;
import android.os.Bundle;

import com.unity3d.player.UnityPlayer;

public class NoYaoMoney extends Fragment {

    private static final String TAG = "NoYaoMoney";
    private String mGameObjectName;
    private static NoYaoMoney instance;

    public static NoYaoMoney getInstance(String gameObject) {

      if (instance == null) {
            instance = new NoYaoMoney();
            instance.mGameObjectName = gameObject;
            UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(instance, TAG).commit();
      }

      return instance;
    }

    public void send(){

      UnityPlayer.UnitySendMessage(mGameObjectName, "XMessageCallBack", "NoYaoMoney");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
    }
}这里我要说一下UnitySendMessage这个方法,就像我在图片里说的,之前我是用广播一秒一发送UnitySendMessage这个方法,这个方法用大白话解释就是说我在这边调用一次,unity那边就有反馈一次,跟接口作用差不多,并不是说我调用了这个方法,那边没有反馈,需要那边持续更新读取这个方法。
UnitySendMessage(参数1,参数2,参数3)
参数1不用管
参数2是在unity那边的接收方法名(在unity代码中就明白了)
参数3是传递的信息
现在表面更能就这样,可以测试了,就是在unity调用send方法,看看unity能不能读取到NoYaoMoney这个字符串。
下面就是打包,这个baidu上基本没有正确的
首先知道as打完的是XXX.arr的包,不是jar包,现在unity里面是支持arr的,而且非常方便不需要什么目录结构直接导入就能用。
我们写完这个功能让unity调用,如果是测试就没必要混淆了,要是写些不想让人看见的东西就要混淆,这里我就不写怎么混淆了,需要的小伙伴可以留言,非常简单。
这里注意重点我们在打包的时候不能把libs里面那个class.jar包打进去,因为这样会在unity里冲突,这里怎么剔除,有些人说打完包改后缀zip然后删除lib里面这个jar,我只想说qnmd,你看过arr打完包是啥样吗。都在一个jar里面了,这里只需要在build.gradle里面改下即可
这样打包的时候就不会打到里面
点一下,打包开始
successful。打包成功!
现在这个arr包就可以当sdk给unity的小伙伴发过去了,可以用gui看一下jar里面的样子,因为是没混淆的,都可以看到
现在把arr传给小伙伴了,然后告诉他这样用就可以了

public string className="com.fornb.noyaoface.NoYaoMoney";
public Text callbackText=null;
public Text resultText=null;
private AndroidJavaObject pluginObject=null;

void Start()
{
#if UNITY_ANDROID&&!UNITY_EDITOR
pluginObject=new AndroidJavaClass(className).CallStatic<AndroidJavaObject>("getInstance",gameObject.name);
pluginObject.Call("send");


#endif
}

public void XMessageCallBack(string str){
    //str会接收NoYaoMoney这个字符串
   //UnityPlayer.UnitySendMessage(mGameObjectName, "XMessageCallBack", "NoYaoMoney");
   //比较一下UnitySendMessage参数的作用
}

感谢有个小哥哥的代码参考,因为不是在自己电脑上看的找不到小哥哥的链接了
纯属吧乱泡,看看就行了,有什么问题留言
页: [1]
查看完整版本: Unity 与Android交互-调用 Android 打包 SDK