这是 Unity Android 插件的较大问题之一。
这里有几种可能性。使用下面的方法来获得正确的答案
a) 您的插件是否要求 Main Activity(即 Launcher Activity)为“com.inno.myPlugin.MyClass”?
b) 您是否覆盖 MyClass 中的 OnActivityResult?
c) 以上都不是
如果您对 (a) 的回答是肯定的,那么除了您自己以外的任何人都几乎不可能使用此插件,原因多种多样,从其他人无法调整您的代码到冲突的软件包.
如果您对 (b) 的回答是肯定的,那么其他人很有可能可以使用它,但是如果 ANOTHER 他们就不能使用它> 插件也需要该权限
如果您对 (c) 的回答是肯定的,那么您应该很好。
测试它的最简单方法是在一个新项目中使用您的插件,使用不同的包名称,然后检查它是否有效。
另外,我建议您不要扩展 UnityPlayerNativeActivity。扩展 UnityPlayerNativeActivity 的唯一原因是
- 获取currentActivity(即UnityPlayer.currentActivity)
- 使用 unitySendMessage
您可以使用反射来获得这两者。 currentActivity 是一个字段,而 unitySendMessage 是一个方法。我不会在这里详细介绍,因为它与您的问题没有直接关系,但如果您需要一些详细信息,请随时 ping。
编辑应 OP 要求添加一些示例代码
这是我在没有扩展 UnityPlayerActivity 或 UnityPlayerNativeActivity 的情况下制作的示例插件。请注意,我只是在此处直接输入,因此代码中可能存在错误。我肯定知道的一件事是本机代码需要 try-catch 块,但是任何 IDE 在您粘贴代码时都应该显示错误。
原生 Android 代码
package com.myCompany.myProduct;
public class MyClass {
private Class<?> unityPlayerClass;
private Field unityCurrentActivity;
private Method unitySendMessage;
public void init () {
//Get the UnityPlayer class using Reflection
unityPlayerClass = Class.forName("com.unity3d.player.UnityPlayer");
//Get the currentActivity field
unityCurrentActivity= unityPlayerClass.getField("currentActivity");
//Get the UnitySendMessage method
unitySendMessage = unityPlayerClass.getMethod("UnitySendMessage", new Class [] { String.class, String.class, String.class } );
}
//Use this method to get UnityPlayer.currentActivity
public Activity currentActivity () {
Activity activity = (Activity) unityCurrentActivity.get(unityPlayerClass);
return activity;
}
public void unitySendMessageInvoke (String gameObject, String methodName, String param) {
//Invoke the UnitySendMessage Method
unitySendMessage.invoke(null, new Object[] { gameObject, methodName, param} );
}
public void makeToast (final String toastText, final int duration) {
currentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), toastText, duration).show();
}
});
}
}
Unity C# 代码
AndroidJavaObject myClass = null;
public void Init () {
if(myClass == null)
myClass = new AndroidJavaObject("com.myCompany.myProduct.MyClass");
if(myClass != null)
myClass.Call("init", new object[0]);
}
public void MakeToast (string toastText, int duration) {
if(myClass != null)
myClass.Call("makeToast", new object[] { toastText, duration } );
}
对于清单,将其更改为您要调用的包名称。请注意,它不必须与插件的包相匹配!因此,例如,这里我们插件的包名是“com.myCompany.myProduct”,您可以使用类似“com.someOtherCompany.someNewProduct”这样的包名
如何测试这个插件。
1.将上面的原生代码添加到“MyClass.java”中,并创建一个jar。
2. 将此 jar 复制到 Unity 项目的 Assets/Plugins/Android 文件夹中。
3.确保包名不是Unity中默认的包名
4. 将上面的 Unity C# 代码复制到一个新脚本中
5. 放入一些OnGUI代码来调用C#中的“Init”和“MakeToast”方法
来源 - 我为 Unity 制作插件的专业知识。