如何更改Unity Android插件包名称

时间:2014-12-31 18:28:11

标签: java android plugins jar unity3d

我通过扩展 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 已经使用,这会阻止我的插件用户上传他们的应用插件?

如何解决 包命名这个问题?

1 个答案:

答案 0 :(得分:1)

这是Unity Android插件的一个较大问题。

这里有一些可能性。使用以下内容获得正确的答案

a)您的插件是否要求主要活动(即Launcher活动)为“com.inno.myPlugin.MyClass”?

b)你是否覆盖 MyClass 中的OnActivityResult?

c)以上都不是

如果您对(a)的回答是肯定的,那么除了您自己以外的任何人都可以使用此插件的可能性很小,原因有很多,其他原因包括其他人无法将您的代码调整为冲突的软件包

如果您对(b)的回答是肯定的,那么其他人可以使用它,如果另一个他们就无法使用它>插件也需要该权限

如果您对(c)的回答是肯定的,那么您应该是好的。

最简单的测试方法是在新项目中使用您的插件,使用不同的包名称,并检查它是否有效。

另外,我建议您远离扩展UnityPlayerNativeActivity。扩展UnityPlayerNativeActivity的唯一原因是

  1. 获取currentActivity(即UnityPlayer.currentActivity)
  2. 使用unitySendMessage
  3. 你可以使用反射来获得这两个。 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制作插件的专长。