首页 > 解决方案 > dispatchKeyEvent 不会在 Unity 中触发 - 本机 Android 插件

问题描述

我想在Android中触发onKeyUp或者dispatchKeyEvent,给keyPress的Unity3D发送消息

我制作了一个Java原生插件:


public class VolumeKeyClass extends Activity {

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d("Unity","onKeyUp UP");
        int action = event.getAction();
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (action == KeyEvent.ACTION_DOWN) {
                    Log.d("test", "Volume UP pressed! " + event);
             UnityPlayer.UnitySendMessage("MainController","logStatus","Volume up!!");
                }
                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (action == KeyEvent.ACTION_DOWN) {
                    Log.d("test", "Volume DOWN pressed! " + event);
                    UnityPlayer.UnitySendMessage("MainController","logStatus","Volume Down!");
                }
                return true;
            default:
                return super.dispatchKeyEvent(event);
        }
    }

已经测试了Unity和插件之间的通信,可以正确登录消息,但是onKeyUp和dispatchKeyEvent都没有触发发送消息,Logcat也没有。(目标 API 15,冰淇淋三明治)

标签: javac#androidunity3dnative

解决方案


您必须像这样使用OnKeyListener

   public class VolumeKeyClass extends Activity {

        void InitializeKeyListener ()
        {
           OnKeyListener keyListener = new OnKeyListener() {
        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            Log.d("Unity","onKeyUp UP");
            int action = event.getAction();
            switch (keyCode) {
                case KeyEvent.KEYCODE_VOLUME_UP:
                    if (action == KeyEvent.ACTION_DOWN) {
                        Log.d("test", "Volume UP pressed! " + event);
                 UnityPlayer.UnitySendMessage("MainController","logStatus","Volume up!!");
                    }
                    return true;
                case KeyEvent.KEYCODE_VOLUME_DOWN:
                    if (action == KeyEvent.ACTION_DOWN) {
                        Log.d("test", "Volume DOWN pressed! " + event);
                        UnityPlayer.UnitySendMessage("MainController","logStatus","Volume Down!");
                    }
                    return true;
                default:
                    return super.dispatchKeyEvent(event);
            }
           };
        }
    }

推荐阅读