Java 如何更改Unity Android插件包名称
我通过扩展UnityPlayerActivity来制作我的第一个Android插件。包的名称是com.inno.myPlugin,该名称在Plugins/Android文件夹的Manifest.xml中注册 扩展的类是“MyClass”com.inno.myPlugin” 该插件编译为.jar文件,在Unity端使用“AndroidJavaClass”和“AndroidJavaObject”调用函数,并放置在插件/Android文件夹中 每次我在android设备上编译我的示例时,应用程序包名总是“com.inno.myPlugin”。即使我从Unity settings更改包名,默认包名仍然是jar插件的包名,即“com.inno.myPlugin”。包名只能从jar文件的源代码重命名 我想将插件发布到Unity Asset store,但我有一个问题困扰着我 如果软件包名“com.inno.myPlugin”已经在Android应用商店中使用了,这是否会阻止我的插件用户使用此插件上传应用程序Java 如何更改Unity Android插件包名称,java,android,plugins,jar,unity3d,Java,Android,Plugins,Jar,Unity3d,我通过扩展UnityPlayerActivity来制作我的第一个Android插件。包的名称是com.inno.myPlugin,该名称在Plugins/Android文件夹的Manifest.xml中注册 扩展的类是“MyClass”com.inno.myPlugin” 该插件编译为.jar文件,在Unity端使用“AndroidJavaClass”和“AndroidJavaObject”调用函数,并放置在插件/Android文件夹中 每次我在android设备上编译我的示例时,应用程序包名总
我如何解决包命名的问题?这是Unity Android插件的一个较大问题 这里有一些可能性。使用下面的答案获得正确答案 a) 您的插件是否要求主活动(即启动器活动)为“com.inno.myPlugin.MyClass” b) 您是否在MyClass中重写OnActivityResult c) 以上两者都不是 如果您对(a)的回答是肯定的,那么除了您自己之外,任何人都不可能使用此插件,原因有很多,从其他人无法调整您的代码到相互冲突的软件包 如果你对(b)的回答是肯定的,那么其他人很有可能使用它,但是如果另一个插件也需要该特权,他们就不能使用它 如果你对(c)的回答是肯定的,那么你应该表现得很好 最简单的测试方法是在一个新项目中使用插件,使用不同的包名,然后检查它是否有效 另外,我建议您不要扩展UnityPlayerActivity。扩展UnityPlayerActivity的唯一原因是
编辑根据OP的要求添加一些示例代码 下面是一个示例插件,我没有扩展UnityPlayerActivity或UnityPlayerActiveActivity。注意,我刚刚在这里直接输入了这个,所以代码中可能有错误。我可以肯定的是,本机代码需要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();
}
});
}
}
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制作插件的专业知识。谢谢回复。关于你的回答我有几个问题。我的类名是MyClass扩展的UnityPlayerActivity。如果我不扩展UnityPlayerActiveActivity,我能在C端使用AndroidJavaObject.call调用java函数吗?我还能够使用UnityPlayer.UnitySendMessage(arg0、arg1、arg2)在C端调用函数吗?我的清单文件应该是什么样子?目前,清单中我的主要类是MyClass。我应该把它去掉吗?有很多问题要回答。我怀疑我能否在评论中回答他们,所以我将编辑我的答案。我很快会把东西放在这里。