题外话

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

写作背景

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


正题了啊!注意了!

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

在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,这个不能说错的,我觉得是不科学的,具体原因不细说了给你们资料里面说的挺清除,给你们转个链接就差不多明白了,这个链接国内可以打开。

Unity Android plugin tutorial (1/3) Fundamentals - eppz!?

eppz.eu
图标

我们给改成这样

代码到下面复制

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参数的作用
}

感谢有个小哥哥的代码参考,因为不是在自己电脑上看的找不到小哥哥的链接了

纯属????吧乱泡,看看就行了,有什么问题留言

推荐阅读:

相关文章