Intereting Posts
Firebase: при срабатывании события onDisconnect? Как сделать резервную копию всего приложения в android? Услуга пробуждения непосредственно из AlarmManager Как сделать фотографию и отправить запрос HTTP POST с Android? Я не хочу, чтобы Android автоматически менял размер растрового изображения Как правильно Выровнять изображение на панели инструментов в Android Не удалось получить доступ к jarfile lib \ archquery.jar Как заставить PreferenceActivity работать с моими SharedPreferences? Пользовательская панель оценки на пряничных устройствах Приложение Android для приостановки / возобновления музыки другого приложения музыкального плеера (Android Layout) Решение для кнопки «Место» поверх изображения неправильной формы или обнаружения касания (осязаемая область) определенной области изображения? Android AVD на Eclipse показывает «Пустой экран» без активности Как я могу печатать / записывать все содержимое тела MultiPartEntity, которое используется HTTPRequest? Удалить Logcat с точки зрения Java VerifyError в инструментах для сборки тестовых проектов android v17

Панель действий Android UnityPlayerActivity

Я создаю приложение для Android, которое включает интерактивный интерфейс Unity 3d.

Я импортировал проект Unity в Android Studio, но при запуске активность полностью в полноэкранном режиме и не отображается панель действий Android.

Как я могу это сделать?

Шаги интеграции

  • Создайте новый проект Unity.
  • Экспортируйте «Google Android Project» из Unity.
  • Импортируйте проект в Android Studio.

Попытки решения

  • Изменение темы в манифесте.
  • Настройка темы в классе Java UnityPlayerActivity.
  • Переопределение манифеста Unity Android, помещая манифест с обновленной темой в каталог Unity / Assets / Plugins / Android.
  • Изменение UnityPlayerActivity для расширения AppCompatActivity. Это покажет панель действий, но между ней и статусной полосой есть белый промежуток.
  • Установка "Screen.fullScreen = false;" В Unity SceneManager. Это удаляет режим погружения, чтобы отображалась панель состояния Android.
  • Отключение «Строка состояния скрыта» в настройках проигрывателя. Кажется, не имеет никакого эффекта.
  • Объединение UnityPlayer в FrameLayout. Это позволяет мне изменять размеры Unity как вида.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.unity.test" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0"> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true" /> <application android:banner="@drawable/app_banner" android:debuggable="false" android:icon="@drawable/app_icon" android:isGame="true" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <activity android:name="com.company.unity.test.UnityPlayerActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="fullSensor"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" /> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest> 

UnityPlayerActivity.java

 package com.company.unity.test; import android.app.Activity; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Window; import com.unity3d.player.UnityPlayer; public class UnityPlayerActivity extends Activity { protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code // Setup activity layout @Override protected void onCreate (Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy mUnityPlayer = new UnityPlayer(this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); } // Quit Unity @Override protected void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); } // This ensures the layout will be correct. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } // Notify Unity of the focus change. @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mUnityPlayer.windowFocusChanged(hasFocus); } // For some reason the multiple keyevent type is not supported by the ndk. // Force event injection by overriding dispatchKeyEvent(). @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE) return mUnityPlayer.injectEvent(event); return super.dispatchKeyEvent(event); } // Pass any events not handled by (unfocused) views straight to UnityPlayer @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } } 

Solutions Collecting From Web of "Панель действий Android UnityPlayerActivity"

Кажется, я нашел решение.
Измените эту строку:

 mUnityPlayer = new UnityPlayer(this); 

Поэтому он создает собственный подкласс UnityPlayer , который переопределяет метод setFullscreen (немного взломанный):

 public class UnityPlayerWrapper extends UnityPlayer { public UnityPlayerWrapper(ContextWrapper contextWrapper) { super(contextWrapper); } @Override protected void setFullscreen(boolean b) { super.setFullscreen(false); } } 

Кроме того, удалите эту строку: requestWindowFeature(Window.FEATURE_NO_TITLE);

Для Unity версии 5.5 лучший способ избежать Immersive Mode в Android – это передать конструктору не Activity, а cast of ApplicationContext в контекст Wrapper.

 mUnityPlayer = new UnityPlayer((ContextWrapper) getApplicationContext()); 

Это работает, потому что в запутанном UnityPlayer.class (в unity-classes.jar) есть проверка экземпляра.

  private void h() { if(this.h instanceof Activity) { ((Activity)this.h).getWindow().setFlags(1024, 1024); } } 

Так что если это не Activity, UnityPlayer.class не устанавливает флаг.

Ответ Петра работает на более старую версию, и ответ Лоренцо Д.М. также действителен, но

 mUnityPlayer = new UnityPlayer((ContextWrapper) getApplicationContext()); 

Не работает на некоторых устройствах. Итак, наконец, я изменяю UnityPlayerActivity, вот новое решение

 public class UnityPlayerActivity extends AppCompatActivity { protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code ActionBar actionBar; private Toolbar toolbar; private FrameLayout unityContainer; // Setup activity layout @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); mUnityPlayer = new UnityPlayer(this); setContentView(R.layout.activity_unity_player); mappingWidgets(); init(); } void mappingWidgets(){ toolbar = (Toolbar) findViewById(R.id.toolbar); unityContainer = (FrameLayout) findViewById(R.id.unity_container); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); unityContainer.addView(mUnityPlayer.getView(), 0, layoutParams); mUnityPlayer.requestFocus(); } void init(){ setSupportActionBar(toolbar); actionBar = getSupportActionBar(); if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); onDestroy(); } }); setTitle(getString(R.string.app_name)); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); } // Quit Unity @Override protected void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); } // Low Memory Unity @Override public void onLowMemory() { super.onLowMemory(); mUnityPlayer.lowMemory(); } // Trim Memory Unity @Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == TRIM_MEMORY_RUNNING_CRITICAL) { mUnityPlayer.lowMemory(); } } // This ensures the layout will be correct. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } // Notify Unity of the focus change. @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mUnityPlayer.windowFocusChanged(hasFocus); } // For some reason the multiple keyevent type is not supported by the ndk. // Force event injection by overriding dispatchKeyEvent(). @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE) return mUnityPlayer.injectEvent(event); return super.dispatchKeyEvent(event); } // Pass any events not handled by (unfocused) views straight to UnityPlayer //@Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } // Pass any events not handled by (unfocused) views straight to UnityPlayer @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { finish(); onDestroy(); return true; } return mUnityPlayer.injectEvent(event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } }