无法将事件从Unity传递回android库jar

and*_*asv 6 android jar back unity-game-engine

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

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

<meta-data android:name="unityplayer.ForwardNativeEventsToDal vik" android:value="true" />
Run Code Online (Sandbox Code Playgroud)

<activity android:name="com.unity3d.player.UnityPlayerProxyActivity" ... >AndroidManifest中

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

我现在在剧本中做的是

public void Update() {

if(Input.GetKeyDown(KeyCode.Escape))
Application.Quit();
} 
Run Code Online (Sandbox Code Playgroud)

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

也许不知何故这样.

myActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
Run Code Online (Sandbox Code Playgroud)

或这个

myActivity.onBackPressed() 
Run Code Online (Sandbox Code Playgroud)

但是通过C#脚本.我怎样才能在脚本中实现这一目标?

Fra*_*yen 8

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");
            }

    }
Run Code Online (Sandbox Code Playgroud)

还有你的Android库

    public class YourActivity extends
        com.unity3d.player.UnityPlayerNativeActivity {
…

    public void yourBackEventFunction() {
        // Do something here
    }
…
    }
Run Code Online (Sandbox Code Playgroud)

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

编辑:

如果你想调用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();
}
Run Code Online (Sandbox Code Playgroud)

在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");
            }

    }
Run Code Online (Sandbox Code Playgroud)

或者在YourActivity内部,您可以:

  1. 创建YourActivity扩展UnityPlayerNativeActivty

  2. 包括你的Jar lib并调用你想要的功能.

使用C#脚本调用您的活动.

请注意,在Unity中,只有1个Activity,它必须是UnityPlayerNativeActivity,或者它必须是来自UnityPlayerNativeActivity的Activity EXTENDS.如果没有UnityPlayerNativeActivity的扩展,您不能使用Jar中的任何其他活动.

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

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

如果要直接从C#调用函数到Java类,您仍然可以使用Android NDK构建JNI库来实现

此示例演示了如何使用Java代码与Android OS进行交互以及C++如何在C#和Java之间建立桥梁.包中的场景显示一个按钮,当按下该按钮时,将获取Android OS定义的应用程序缓存目录.请注意,您将需要JDK和Android NDK来编译插件.

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

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

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

BR,

坦率