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

时间:2014-01-18 16:18:29

标签: android jar unity3d back

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

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

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

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

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

我现在在剧本中做的是

public void Update() {

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

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

也许是这样的。

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

或者

myActivity.onBackPressed() 

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

1 个答案:

答案 0 :(得分: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");
            }

    }

和你的Android lib

    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 lib并调用您想要的功能。

  3. 使用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操作系统以及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,