欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Unity与Android Studio✨之间那些不清不楚的小秘密✨(互相调用)

程序员文章站 2022-06-22 23:53:14
Unity与Android Studio✨之间那些不清不楚的小秘密✨(互相调用)文章目录Unity与Android Studio✨之间那些不清不楚的小秘密✨(互相调用)前言一、Unity与安卓交互的参数整理1.引入库二、Unity与安卓交互的几种方法Unity调用安卓1.unity调用Android的非静态方法。继承UnityPlayerActivity2.unity调用Android的静态方法3.1.unity调用Android的非静态方法。自己的类写一个静态构造方法安卓调用Unity通过发消息Uni...

Unity与Android Studio✨之间那些不清不楚的小秘密✨(互相调用)


前言

前言:因为最近在学习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

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
jo.Call ("login","");

Android代码:

public void login( String str ) {      
   // 写上自己的操作
}

2.unity调用Android的静态方法

AndroidJavaClass jc = new AndroidJavaClass ("com.hasee.librarydemo.Test");
jc.GetStatic<AndroidJavaObject> ("login","");

Android代码:

public static void login( String str ) {      
   // 写上自己的操作
}

3.unity调用Android的非静态方法。自己的类写一个静态构造方法

         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 的方式

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中接口的,包名+接口名。看好不要写错
Unity与Android Studio✨之间那些不清不楚的小秘密✨(互相调用)
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中操作)

       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交互的几种方式,当然还不够全面,目前就这几种了解的差不多。后边学到新的这方面知识还是会继续整理的。如果觉得有点用的话,点个赞再走呀<_> >

本文地址:https://blog.csdn.net/zhangay1998/article/details/114164271