我通过扩展 UnityPlayerNativeActivity 来制作第一个 Android插件。 包名称为 com.inno.myPlugin ,该名称已注册 Manifest.xml 插件/ Android 文件夹。
扩展“ com.inno.myPlugin ”的类是“ MyClass ”。
该插件编译为 .jar 文件,它在Unity端使用“ AndroidJavaClass ”和“ AndroidJavaObject ”来调用功能,在插件/ Android文件夹中放置。
每次编译我的示例时,在我的Android设备上,应用包名称始终为“ com.inno.myPlugin ”。即使我从 Unity设置更改软件包名称,默认软件包名称仍然是 jar插件中的软件包名称,即“ com.inno.myPlugin ”。 包名称可以仅从 jar文件的源代码 重命名 ...
我想发布 插件到 Unity资源商店,但我有一个问题困扰着我。
如果Android商店中的包名“ com.inno.myPlugin ”已经使用,这会阻止我的插件用户上传他们的应用插件?
如何解决 包命名这个问题?
答案 0 :(得分:1)
这是Unity Android插件的一个较大问题。
这里有一些可能性。使用以下内容获得正确的答案
a)您的插件是否要求主要活动(即Launcher活动)为“com.inno.myPlugin.MyClass”?
b)你是否覆盖 MyClass 中的OnActivityResult?
c)以上都不是
如果您对(a)的回答是肯定的,那么除了您自己以外的任何人都可以使用此插件的可能性很小,原因有很多,其他原因包括其他人无法将您的代码调整为冲突的软件包
如果您对(b)的回答是肯定的,那么其他人可以使用它,但如果另一个他们就无法使用它>插件也需要该权限
如果您对(c)的回答是肯定的,那么您应该是好的。
最简单的测试方法是在新项目中使用您的插件,使用不同的包名称,并检查它是否有效。
另外,我建议您远离扩展UnityPlayerNativeActivity。扩展UnityPlayerNativeActivity的唯一原因是
你可以使用反射来获得这两个。 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 } );
}
对于Manifest,将其更改为您要调用的软件包名称。请注意,不要必须匹配插件的包!因此,例如,这里我们的插件的包名称为“ com.myCompany.myProduct ”,您可以使用包名称“ com.someOtherCompany.someNewProduct ”
如何测试此插件。
1.将上面的本机代码添加到“MyClass.java”,然后创建一个jar
2.将此jar复制到Unity项目的Assets / Plugins / Android文件夹中
3.确保包名称不是Unity中的默认包名称
4.将上面的Unity C#代码复制到新脚本中
5.输入一些OnGUI代码来调用“Init”&amp; C#中的“MakeToast”方法
来源 - 我为Unity制作插件的专长。