Unity与Android(安卓)Studio✨之间那些不清不楚的小秘密✨(Android(安卓)Studio与unity交互)
Unity与Android Studio互相调用
文章目录
-
- Unity与Android Studio互相调用
- 前言
- 一、Unity与安卓交互的参数整理
-
- 1.(整理中)
- 二、Unity与安卓交互的几种方法
-
- Unity调用安卓
-
- 1.unity调用Android的非静态方法。继承UnityPlayerActivity
- 2.unity调用Android的静态方法
- 3.unity调用Android的非静态方法
- 4.unity调用Android的非静态方法。自己的类写一个静态构造方法
- 安卓调用Unity
-
-
- 1.通过发消息UnitySendMessage的方式调用Unity
- 2.通过代理AndroidJavaProxy 的方式
-
- Unity调用安卓中的几种常用事件(Toast等)
-
- Unity简单实现安卓中Toast(吐司)
-
-
- 1.Unity端C#直接写代码调用(无需再AS中操作)
- 2.Unity端调用AS端写的Toast
-
- 总结
前言
前言:因为最近在学习Unity与安卓之间的交互,所以在网上搜寻了很多关于这方面的东西。因为自己在网上搜的时候,感觉大家的东西都有些零碎,该有的差不多都有了,但是都不够全面,所以自己写篇文章用来整理这些精华 Unity与Android Studio互相调用的知识给大家分享一下一、Unity与安卓交互的参数整理
1.(整理中)
代码如下(示例):
先介绍一下u3d中调用android的一些API UnityPlayer是unity3d自身的一个jar包,两端通信的关键, currentActivity是android需要的上下文,这两个东西你可以当作是调用某些android方法需要的参数,记下就行 AndroidJavaClass jc=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”); AndroidJavaObject jo=jc.GetStatic(“currentActivity”); jo.Call(method ,parameter );//调用实例方法 jo.Get(method ,parameter );//获取实例变量(非静态) jo.Set(method ,parameter );//设置实例 变量(非静态) jo.CallStatic(method ,parameter );//调用静态变量(非静态) jo.GetStatic (method ,parameter );//获取静态变量 jo.SetStatic (method ,parameter );//设置静态变量
该处使用的url网络请求的数据。
二、Unity与安卓交互的几种方法
Unity调用安卓
1.unity调用Android的非静态方法。继承UnityPlayerActivity
注意:使用这种方法的时候,你在Android Studio 中写的类要继承UnityPlayerActivity才能调到,但是只能有一个类继承它,写多个类都继承的时候,其他类也是调不到的
unity代码:
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");jo.Call ("login","");
Android代码:
package com.example.test;public class MainActivity extends UnityPlayerActivity { public void login( String str ) { // 写上自己的操作}}
2.unity调用Android的静态方法
注意:这里的AndroidJavaClass()里面的是自己的包名+类名
这样写的可以不用继承UnityPlayerActivity也可以用
unity代码:
AndroidJavaClass jc = new AndroidJavaClass ("com.example.test.Test");jc.GetStatic<AndroidJavaObject> ("login","");
Android代码:
package com.example.test;public class Test{ public static void login( String str ) { // 写上自己的操作 }}
3.unity调用Android的非静态方法
unity代码:
AndroidJavaObject jo = new AndroidJavaObject("com.example.test.Test"); //包名加类名 jo.Call("login","");
Android代码:
package com.example.test;public class Test{ public void login( String str ) { // 写上自己的操作}
4.unity调用Android的非静态方法。自己的类写一个静态构造方法
注意:这里的AndroidJavaClass()里面的是自己的包名+类名
这样写的可以不用继承UnityPlayerActivity也可以用
我这里是写了一个静态构造方法,先通过Unity拿到这个方法,然后通过这个方法来调用这个类里面写的非静态方法
说到底还是先用了静态方法获取的第一步
unity代码:
AndroidJavaClass jc = new AndroidJavaClass("com.hasee.librarydemo.Test"); //包名加类名 AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("getInstance"); jo.Call("login","");
Android代码:
public class Test{ public static Test_instance; public static Test getInstance(){ if(_instance==null){ _instance=new Test(); } return _instance; }public static void login( String str ) { // 写上自己的操作}
安卓调用Unity
1.通过发消息UnitySendMessage的方式调用Unity
//把消息发送给Unity场景中iFlytekASRController物体上的OnResult方法 UnityPlayer.UnitySendMessage("iFlytekASRController", "OnResultWake", resultString);
2.通过代理AndroidJavaProxy 的方式
安卓给Unity通讯可以通过这个AndroidJavaProxy 的方式,使用起来比通过发消息要麻烦些,但是能干的事多了,而且使用这个代理相当于给Unity 的回调,比发消息要靠谱点。发消息使用的反射的机制,字符串也容易写错,可能会有发送失败、延迟等可能,但是用这个回调自然就更稳定啦
下面我写一个Demo做通讯测试
AS端:
1.首先要在AS端写一个接口,接口中可以写一些需要给Unity调用的方法或参数等,等于用于传过去给Unity的回调
package com.example.test;public interface UnityasrEventCallback { public void Speechcontent(int a); public void Test1(String msg);}
2.写一个Activity用于与unity通讯,Unity端就调用这个方法(setCallback(UnityasrEventCallback callback))将代理传过来,然后通过传过来的代理,将AS接口中定义的方法和参数回调传给Unity端
private UnityasrEventCallback mCallback; //获取接口内容 public void setCallback(UnityasrEventCallback callback){ Log.d("@@@", "UnityBatteryEventCallback setCallback start "); mCallback = callback; Log.d("@@@", "UnityBatteryEventCallback setCallback end "); mCallback.Test1("连通成功了"); mCallback.Speechcontent(666); }
Unity端:
1.在一个cs脚本中写一个内部类,然后继承AndroidJavaProxy。然后写一个构造方法继承AS的 包名+接口名
然后实现这个接口,方法名一定要与AS中写的一样,再定义一个数值用于接收AS中传过来的数据即可
public class AsrEventCallback : AndroidJavaProxy { public AsrEventCallback() : base("com.example.test.UnityasrEventCallback") { } public void Speechcontent(int content){ int a = content;} public void Test1(string msg){ string b = msg;} }
base()里的是AS中接口的,包名+接口名。看好不要写错
2.然后在这个cs脚本的Start中new一个代理,然后通过 jo.Call(“setCallback”, asrEventCallback);将这个代理传到AS中,然后AS就可以调用这个代理给Unity返回数据了
void Start() { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); AsrEventCallback asrEventCallback = new AsrEventCallback(); // 设置语音识别回调函数接口 jo.Call("setCallback", asrEventCallback); }
Unity调用安卓中的几种常用事件(Toast等)
Unity简单实现安卓中Toast(吐司)
1.Unity端C#直接写代码调用(无需再AS中操作)
在需要使用Toast的地方,直接用这套代码,更改汉字为想要的使用即可
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast"); AndroidJavaObject context = jo.Call<AndroidJavaObject>("getApplicationContext"); jo.Call("runOnUiThread", new AndroidJavaRunnable(() => { toast.CallStatic<AndroidJavaObject>("makeText", context, "开始代理测试", toast.GetStatic<int>("LENGTH_SHORT")).Call("show"); }));
2.Unity端调用AS端写的Toast
Unity端:
public void OnClickAndroid() { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); jo.Call<int>("testToast", "吐司!"); }
AS端:
package com.test;import android.os.Bundle;import android.widget.Toast;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void testToast(final String msg) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show(); } }); }}
总结
以上简单整理了Unity与Android Studio交互的几种方式,当然还不够全面,目前就这几种了解的差不多。后边学到新的这方面知识还是会继续整理的。如果觉得有点用的话,点个赞再走呀<_> > >如果忘记了如何在Android打包成aar包来与Unity进行交互。可以参考这篇文章,写得很完整哦
在Android Studio中写代码导出aar包,在Unity中使用交互(小白完整篇)
更多相关文章
- Unity3D 调用Android的提供的接口
- Android(安卓)Development
- Android工作笔记:Android路径大全
- android与javascript交互(Binding JavaScript code to Android(安
- android完全退出应用程序
- Gradle sync failed: Could not GET 'https://dl.google.com/dl/
- Android实际分辨率(android:anyDensity="false"的情况下的获取方
- android 中发送短信
- Android(安卓)存储选项之 SQLiteDatabase 创建过程源码分析