Unity与Android Studio✨之间那些不清不楚的小秘密✨(Android Studio与unity交互)

简介: Unity与Android Studio互相调用文章目录Unity与Android Studio互相调用前言一、Unity与安卓交互的参数整理1.(整理中)二、Unity与安卓交互的几种方法Unity调用安卓1.unity调用Android的非静态方法。继承UnityPlayerActivity2.unity调用Android的静态方法3.unity调用Android的非静态方法4.unity调用Android的非静态方法。自己的类写一个静态构造方法安卓调用Unity1.通过发消息UnitySendMessage的方式调用Unity2.通过代理AndroidJava

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中接口的,包名+接口名。看好不要写错

image.png

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进行交互。可以参考这篇文章,写得很完整哦


相关文章
|
1月前
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
244 1
|
1月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
239 2
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
64 5
|
2月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
135 3
|
3月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
57 1
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1343 0
Android Studio: 解决Gradle sync failed 错误
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
134 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
API 开发工具 Android开发
Android Studio:解决AOSP自编译framework.jar引用不到的问题
在Android Studio中解决AOSP自编译framework.jar引用问题的几种方法,包括使用相对路径、绝对路径和通过`${project.rootDir}`动态获取路径的方法,以避免硬编码路径带来的配置问题。
234 0
Android Studio:解决AOSP自编译framework.jar引用不到的问题
|
2月前
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
152 0