【问题标题】:how to change Unity Android plugin package name如何更改 Unity Android 插件包名称
【发布时间】:2015-02-27 18:25:46
【问题描述】:

我正在通过扩展 UnityPlayerNativeActivity 来制作我的第一个 Android 插件。 package 名称是 com.inno.myPlugin 并且该名称是 registered 在 Manifest.xml 在 Plugins/Android 文件夹。

扩展“com.inno.myPlugin”的类是“MyClass”。

插件编译为.jar文件,它使用Unity端的“AndroidJavaClass”和“AndroidJavaObject”来调用 功能并放置在 Plugins/Android 文件夹中。

每次编译我的示例时,在我的 android 设备上,应用程序 package name 始终是“com.inno.myPlugin”。即使我从 Unity 设置 更改包名,默认包名仍然是 jar 插件 中的 包名,即“com.inno.myPlugin”。 包名只能从jar文件的源代码重命名 ...

我想发布 插件 到 Unity Asset Store,但我有一个问题困扰着我。

如果包名称“com.inno.myPlugin”在 Android 商店中已使用,这是否会阻止我的插件的用户使用此插件上传他们的应用插件?

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

【问题讨论】:

    标签: java android plugins jar unity3d


    【解决方案1】:

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

    这里有几种可能性。使用下面的方法来获得正确的答案

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

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

    c) 以上都不是

    如果您对 (a) 的回答是肯定的,那么除了您自己以外的任何人都几乎不可能使用此插件,原因多种多样,从其他人无法调整您的代码到冲突的软件包.

    如果您对 (b) 的回答是肯定的,那么其他人很有可能可以使用它,但是如果 ANOTHER 他们就不能使用它> 插件也需要该权限

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

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

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

    1. 获取currentActivity(即UnityPlayer.currentActivity)
    2. 使用 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 制作插件的专业知识。

    【讨论】:

    • 感谢您的回复。关于你的回答,我有几个问题。我的班级名称是 MyClass 扩展 UnityPlayerNativeActivity。如果我不扩展 UnityPlayerNativeActivity,我能否在 C# 端使用 AndroidJavaObject.Call 调用 java 函数?我还可以使用 UnityPlayer.UnitySendMessage(arg0, arg1, arg2) 在 C# 端调用函数吗?我的清单文件应该是什么样的?目前,我在清单中的主要类是 MyClass。我应该删除它吗?
    • 有很多问题需要回答。我怀疑我可以在评论中回答他们,所以我要编辑我的答案。我很快就会把东西放在这里。
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多