我是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#脚本。如何在脚本中实现这一目标?
答案 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内部,您可以:
创建YourActivity扩展UnityPlayerNativeActivty
包含您的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操作系统以及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,
谢