java - 如何更改Unity Android插件包名称

标签 java android plugins jar unity-game-engine

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

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

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

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

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

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

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

最佳答案

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

这里有几种可能性。使用以下内容获得正确答案

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

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

c) 以上都不是

如果您对 (a) 的回答是肯定的,那么除了您自己之外,任何人都不太可能使用这个插件,原因有很多,从其他人无法调整您的代码到包冲突.

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

如果您对 (c) 的回答是"is",那么您就可以了。

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

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

  1. 获取currentActivity(即UnityPlayer.currentActivity)
  2. 使用unitySendMessage

您可以使用反射获得这两者。 currentActivity 是一个字段,unitySendMessage 是一个方法。我不会在这里详细介绍,因为它与您的问题没有直接关系,但如果您需要一些详细信息,请随时 ping。


编辑 根据 OP 的要求添加一些示例代码

这是我在没有扩展 UnityPlayerActivity 或 UnityPlayerNativeActivity 的情况下制作的示例插件。请注意,我只是直接在此处键入此内容,因此代码中可能存在错误。我确定知道的一件事是 native 代码需要 try-catch block ,但是当您将代码粘贴进去时,任何 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代码来调用C#中的“Init”和“MakeToast”方法

来源 - 我的专长是为 Unity 制作插件。

关于java - 如何更改Unity Android插件包名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27724929/

相关文章:

grails - 如何在Grails中获取所有与插件相关的JAR?

java - Hadoop MapReduce 中数值数据集的分箱

java - jsp/servlet页面的问题

android - 将我的应用程序分享到 android 中另一个已安装的应用程序

android - 应用程序无法绑定(bind)服务

ios - 如何从我的自定义 CDVPlugin 类(Objective C 语言)调用 javascript 函数

c++ - Vim 不高亮某些单词

java - 发送对象和线程同步

Java:让 ExecutorService 产生可重复的行为?

android - super.onStart() 上的 NullPointerException