关于Unity和Android交互的那些坑

占位,有空补

原本打算周末更新,不过周末有事情了,今天开更

Unity和Android的交互,我们先从AndroidJavaClass和AndroidJavaObject说起。

我们官网的交互方法是这样的

而网上给的通常的Unity调用Android的方法是这样的

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

 

最致命的坑,恐怕就在这里了。

我们并不知道AndroidJavaClass和AndroidJavaObject的具体作用是什么,就迷迷糊糊的按照网络上的方法进行尝试,可能偶尔成功,可能偶尔有不成功了,只知其然,而不知其所以然。

现在我们来了解一下AndroidJavaClass和AndroidJavaObject这两个类,在调用交互的时候,是起到一个什么样的角色。

java和C#都是高级语言,有类和对象的说法。那么,在调用静态方法的时候,我们是这样做的:class.静态方法名

调用实例方法是这样做的class c = new class(); c.xxxx。这都是大家熟悉的,就不多论述了。

那么,在交互的时候,我们调用的方法,也是要遵守这个原则的。下面具体解释AndroidJavaClass和AndroidJavaObject的作用。

AndroidJavaClass 可以通过该类,获取Android原生java的一个类,仅仅是获取类,不做任何操作。

AndroidJavaClass jc = new AndroidJavaClass("xxx.xxx.xxx.具体类"); 其中,xxx.xxx.xxx 是包名。获取到这个类之后,我们可以调用该类的静态方法。

例如 jc.GetStatic("xxxx");, 就是调用静态方法xxx。

jc.GetStatic<AndroidJavaObject>("currentActivity"); 则是获取该类的一个静态变量,变量名为currentActivity

不可以调用实例方法,因为该类没有被创建。

AndroidJavaObject 可以通过该类,创建实例。相当于在C#l里创建一个新的变量。

AndroidJavaObject  jo = new AndroidJavaObject ("xxx.xxx.xxx.具体类");其中,xxx.xxx.xxx 是包名。这样就可以创建一个java实例,并获取到实例引用。

在创建新类之后,实例方法和静态方法都可以调用。

例如 jo.GetStatic("xxx"); 是调用静态方法。

jo.Get("xxx"); 是调用实例方法。

好了,啰嗦这么多,主要就是说明AndroidJavaClass和AndroidJavaObject这两个类。

下面,来说交互包。

在网上给的方案里,大多数都是需要继承于UnityPlayerActivity,然而,并不是非要继承于UnityPlayerActivity才可以起交互作用的。仅仅是写一个普通类,也是可以进行交互的。下面贴上Android Studio源码

package com.josing.servertest;

import android.app.Fragment;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;

public class MyActivity extends Fragment {

    public static String Stest = "no init";//定义静态变量

    public MyActivity()//无参构造函数
    {
        Stest = "init";//这个构造函数重新给静态变量赋值
    }

    public static void ShowDialog(String msg)//静态方法(需要传过来一个String变量)然后把String变量展示出来
    {
        Toast.makeText(UnityPlayer.currentActivity.getApplicationContext(), msg, Toast.LENGTH_LONG).show();
    }

    public static void SendMessageToUnity()//静态方法
    {
        UnityPlayer.UnitySendMessage("Ctrl","UnityReceiver","SendMessageToUnity");
        //这是调用Unity里面的方法,三个参数依次是 Unity中挂在交互脚本的对象、需要调用的方法、方法里需要传递的参数(这个是String字符串)
    }

}
package com.josing.servertest;

import android.widget.Toast;

import com.unity3d.player.UnityPlayer;

public class MyActivity{

    public static String Stest = "no init";//定义静态变量

    public MyActivity()//无参构造函数
    {
        Stest = "init";//这个构造函数重新给静态变量赋值
    }

    public static void ShowDialog(String msg)//静态方法(需要传过来一个String变量)然后把String变量展示出来
    {
        Toast.makeText(UnityPlayer.currentActivity.getApplicationContext(), msg, Toast.LENGTH_LONG).show();
    }

    public static void SendMessageToUnity()//静态方法
    {
        UnityPlayer.UnitySendMessage("Ctrl","UnityReceiver","SendMessageToUnity");
        //这是调用Unity里面的方法,三个参数依次是 Unity中挂在交互脚本的对象、需要调用的方法、方法里需要传递的参数(这个是String字符串)
    }

}

 

其实,在这两段代码中,选择继承或者不继承,都是可以的,是没有区别的。

使用AndroidJavaObject创建一个实例,还可以调用实例化方法。

下面,其实就是各位自己进行测试了。

有问题欢迎提问,共同学习。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值