Intereting Posts
Как получить доступ к buildConfigField в другом месте внутри файла сборки градиента Как я могу отслеживать внутренние местоположения? Внедрение собственных объявлений в android с помощью Admob? Является ли это возможным? Android Maps Library V2 zoom управляет настраиваемой позицией Android: PopupWindow.showAtLocation () Сохранить позицию прокрутки с каждым обновлением в режиме просмотра списка Android: использует setContentView несколько раз плохо при изменении раскладок? Как создать прозрачную активность на Android? XMPP FileTransfer – Почему протокол bytestreams не работает? Android – Преобразование классов с Multidexlist для отладки – Instagram JSON Parser Объект пользовательского интерфейса, созданный с помощью XML, не обрабатывается в Android Marshmallow Цвет подсветки Android Spinner Как отключить breadcrumps в Android-Studio? Android ListView's setOnItemClickListener из PopupWindow не вызывается Обнаружение скрытого / не видимого устройства Bluetooth на мобильных устройствах

Панель действий 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); } }