占位,有空补
原本打算周末更新,不过周末有事情了,今天开更
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创建一个实例,还可以调用实例化方法。
下面,其实就是各位自己进行测试了。
有问题欢迎提问,共同学习。