ultima - No se puede pasar el evento de Unity a la biblioteca de Android
sdk tools (1)
Soy bastante nuevo en Unity y estoy tratando de crear un complemento de Unity para un archivo jar de la biblioteca de Android y me enfrentan los siguientes problemas:
No puedo encontrar una forma de pasar el evento del botón Atrás a la biblioteca de Android. Parece que Unity evita que este evento pase a la capa de la biblioteca. Lo que he logrado hacer es pasar eventos táctiles a la actividad en el lado de Android configurando la siguiente línea
<meta-data android:name="unityplayer.ForwardNativeEventsToDal vik" android:value="true" />
at <activity android:name="com.unity3d.player.UnityPlayerProxyActivity" ... >
en el AndroidManifest
Sin embargo, no puedo pasar el evento del botón Atrás de una manera que no tenga que cambiar el código en la biblioteca
Lo que hago por ahora en mi script es
public void Update() {
if(Input.GetKeyDown(KeyCode.Escape))
Application.Quit();
}
Sin embargo, necesito la opción de pasar ese evento reverso que capturo a la biblioteca y no manejarlo en la capa de Unity.
Quizás de alguna manera así.
myActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
o esto
myActivity.onBackPressed()
pero a través de un script de C #. ¿Cómo puedo lograr eso dentro de un script?
Script 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");
}
}
Y tu lib Android
public class YourActivity extends
com.unity3d.player.UnityPlayerNativeActivity {
…
public void yourBackEventFunction() {
// Do something here
}
…
}
========================
Editar:
Si desea llamar aBackPressed, puede hacerlo:
En 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();
}
Y en el script 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");
}
}
O dentro de YourActivity puedes:
Cree su YourActivity Extiende UnityPlayerNativeActivty
Incluya su lib lib y llame a la función que desee.
Use la secuencia de comandos C # para llamar a su actividad.
Tenga en cuenta que en Unity, solo hay 1 Activity, y debe ser UnityPlayerNativeActivity O debe ser una Activity EXTENDS FROM UnityPlayerNativeActivity. No puede usar ninguna otra actividad de su Jar sin extender desde UnityPlayerNativeActivity.
Si su clase de actividad dentro de JAR extiende UnityPlayerNativeActivity. y no desea cambiar su JAR, luego crea una nueva clase de actividad que amplía YourActivity. Crea un Jar Jar viejo y nuevo y crea un nuevo plugin.
========================
Si desea llamar a una función directamente desde C # a la clase Java, aún puede hacerlo utilizando Android NDK para crear una lib JNI
Este ejemplo demuestra cómo se puede usar el código Java para interactuar con el sistema operativo Android y cómo C ++ crea un puente entre C # y Java. La escena en el paquete muestra un botón que al hacer clic obtiene el directorio de caché de la aplicación, tal como lo define el sistema operativo Android. Tenga en cuenta que necesitará el JDK y el Android NDK para compilar los complementos.
Referencia aquí: http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html
Ejemplo aquí: http://docs.unity3d.com/Documentation/Images/manual/AndroidJavaPlugin.zip
Pero no estoy seguro de si puedes usar tu propia actividad o no. Y recomiendo crear una nueva actividad que se extienda desde UnityPlayerNativeActivty, porque de esa manera es más simple e inmanejable.
Br,
Franco