因此,这是一种将UI本地化和AR渲染放在Unity中开发,然后将其集成在一起的好方法吗? 如果是,那么这种方法会带来多大的困难呢?
因此,这是一种将UI本地化和AR渲染放在Unity中开发,然后将其集成在一起的好方法吗? 如果是,那么这种方法会带来多大的困难呢?
Android与Unity之间的通信非常简单。我已经使用它三年了,一直运作得非常好 :)
重要提示:在开发Unity Android应用时,可以扩展标准的UnityPlayerActivity类(主要Java类,用于Unity Player在Android上,类似于Unity iOS上的AppController.mm)。应用程序可以覆盖Android操作系统和Unity Android应用程序之间的基本交互。
首先在Unity内部创建代码,然后从Unity调用Android函数
1. 首先在Unity编辑器中创建生成版本:
您需要从Unity中调用本机Android方法或反之亦然:例如:
public void OpenActivity()
{
var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity");
// Accessing the class to call a static method on it
var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
// Calling a Call method to which the current activity is passed
jc.CallStatic("Call", jo);
}
}
请使用您的活动和包名进行替换。
var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
在C#(调用者)中
jc.CallJavaFunc( "javaTestFunc", "UnityJavaJarTest" );
public void javaTestFunc(String strFromUnity) {
/* ... Do something here with java native api ... */
}
2. 然后将代码以开发模式导出,并在Android Studio中导入相同的代码:
在Android Studio中扩展/修改UnityPlayerActivity。文件名为UnityPlayerActivity.java。
在Android(调用者)中
UnityPlayer.UnitySendMessage("AndroidManager", "SetJavaLog", strFromUnity + "HelloWorld");
在C#(被调用者)中
void SetJavaLog(string strJavaLog)
{
strLog = strJavaLog;
_text.text = strLog;
}
创建一个新的Android清单,将新的活动设置为应用程序的入口点。
非常重要: 虽然此方法支持字符串,但为了可靠的输出,请使用指针/IntPtr。
以下是完整的示例代码:
Java:
public final class MyPlugin { //将类静态变量化以便将回调函数发送到此类的一个实例。 public static MyPlugin testInstance;
public static MyPlugin instance()
{
if(testInstance == null)
{
testInstance = new MyPlugin();
}
return testInstance;
}
string result = "";
public string UnitySendMessageExtension(string gameObject, string functionName, string funcParam)
{
UnityPlayer.UnitySendMessage(gameObject, functionName, funcParam);
string tempResult = result;
return tempResult;
}
//Receives result from C# and saves it to result variable
void receiveResult(string value)
{
result = "";//Clear old data
result = value; //Get new one
}}
C#:
class TestScript: MonoBehaviour
{
//Sends the data from PlayerPrefs to the receiveResult function in Java
void sendResultToJava(float value)
{
using(AndroidJavaClass javaPlugin = new AndroidJavaClass("com.company.product.MyPlugin"))
{
AndroidJavaObject pluginInstance = javaPlugin.CallStatic("instance");
pluginInstance.Call("receiveResult",value.ToString());
}
}
//Called from Java to get the saved PlayerPrefs
void testFunction(string key)
{
float value = PlayerPrefs.GetFloat(key) //Get the saved value from key
sendResultToJava(value); //Send the value to Java
}}
Java中的使用方法:
String str = UnitySendMessageExtension("ProfileLoad", "testFunction","highScore");