【问题标题】:Can't pass back event from Unity to android library jar无法将事件从 Unity 传递回 android 库 jar
【发布时间】:2014-01-18 16:18:29
【问题描述】:

我是 Unity 的新手,我正在尝试为 Android 库 jar 创建一个 Unity 插件,但我面临以下问题:

我找不到将后退按钮事件传递给 Android 库的方法。 Unity 似乎阻止将此事件传递给库层。我设法做的是通过设置以下行将触摸事件传递给Android端的活动

<meta-data android:name="unityplayer.ForwardNativeEventsToDal vik" android:value="true" />

在 AndroidManifest 中的&lt;activity android:name="com.unity3d.player.UnityPlayerProxyActivity" ... &gt;

但是我不能以不需要更改库中代码的方式传递后退按钮事件

我现在在脚本中所做的是

public void Update() {

if(Input.GetKeyDown(KeyCode.Escape))
Application.Quit();
} 

但是,我需要选择将我捕获的返回事件传递给库,而不是在 Unity 层处理它。

也许是这样的。

myActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 

或者这个

myActivity.onBackPressed() 

但通过 C# 脚本。如何在脚本中实现这一点?

【问题讨论】:

    标签: android jar unity3d back


    【解决方案1】:

    C# 脚本:

            void Update ()
        {
                if (Input.GetKeyUp (KeyCode.Escape)) {
    
                        AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); 
                        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); 
                        jo.Call ("yourBackEventFunction");
                }
    
        }
    

    还有你的 Android 库

        public class YourActivity extends
            com.unity3d.player.UnityPlayerNativeActivity {
    …
    
        public void yourBackEventFunction() {
            // Do something here
        }
    …
        }
    

    ==========================

    编辑:

    如果你想调用 onBackPressed,你可以这样做:

    在 YourActivity.java 中

    @Override
    public void onBackPressed() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(UnityPlayerNativeActivity.this,
                        "on Back Pressed", Toast.LENGTH_SHORT)
                        .show();
            }
        });
        super.onBackPressed();
    }
    

    在 C# 脚本中:

        void Update ()
        {
                if (Input.GetKeyUp (KeyCode.Escape)) {
                        Debug.Log ("onResume Received");
                        AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); 
                        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); 
                        jo.Call ("onBackPressed");
                }
    
        }
    

    或者在 YourActivity 中你可以:

    1. 创建 YourActivity 扩展 UnityPlayerNativeActivty

    2. 包含你的 Jar 库并调用你想要的函数。

    使用 C# 脚本调用您的 Activity。

    请注意,在 Unity 中,只有 1 个 Activity,它必须是 UnityPlayerNativeActivity 或者它必须是从 UnityPlayerNativeActivity 扩展的 Activity。如果没有 UnityPlayerNativeActivity 的扩展,您将无法使用 Jar 中的任何其他活动。

    如果 JAR 中的 YourActivity 类扩展了 UnityPlayerNativeActivity。并且您不想更改 JAR,然后创建一个新的 Activity 类扩展 YourActivity。创建一个新 Jar + 旧 Jar 并制作一个新插件。

    ==========================

    如果你想直接从C#调用一个函数到Java类,你仍然可以使用Android NDK来构建一个JNI lib

    此示例演示如何使用 Java 代码与 Android 操作系统以及 C++ 如何在 C# 和 Java 之间架起一座桥梁。这 包中的场景显示一个按钮,单击该按钮会获取 应用程序缓存目录,由 Android 操作系统定义。请注意 您将需要 JDK 和 Android NDK 来编译 插件。

    参考这里:http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html

    此处示例:http://docs.unity3d.com/Documentation/Images/manual/AndroidJavaPlugin.zip

    但我不确定您是否可以使用自己的 Activity。并且我建议从 UnityPlayerNativeActivty 创建一个新的 Activity Extends,因为这种方式比这种方式更简单且不可靠。

    兄弟,

    弗兰克

    【讨论】:

    • 感谢您的响应,但我所拥有的是一个 jar,它将活动作为引用并相应地处理它。您描述的方式仅在我更改 jar 文件时才有效。反正不就是通过C#脚本把back key事件传给activity层吗?
    • 好的,看看我更新的答案。希望对解决您的问题有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2015-12-18
    • 2021-11-07
    • 2021-02-27
    相关资源
    最近更新 更多