Tôi đang xây dựng một ứng dụng Android bao gồm trải nghiệm tương tác 3D Unity.Android UnityPlayerActivity Action Bar
Tôi đã nhập dự án Unity vào Android Studio nhưng khi khởi chạy hoạt động là toàn màn hình và không hiển thị thanh tác vụ Android.
Làm thế nào tôi có thể làm điều này?
Integration bước
- Tạo dự án Unity mới.
- Xuất "Dự án Android của Google" từ Unity.
- Nhập dự án vào Android Studio.
Solutions Đã cố gắng
- Thay đổi chủ đề trong biểu hiện.
- Đặt chủ đề trong lớp Java UnityPlayerActivity.
- Ghi đè Tệp kê khai Android thống nhất bằng cách đặt tệp kê khai có chủ đề được cập nhật trong thư mục Unity/Assets/Plugins/Android.
- Thay đổi UnityPlayerHoạt động để mở rộng AppCompatActivity. Điều này sẽ hiển thị thanh hành động nhưng có một khoảng trắng giữa nó và thanh trạng thái.
- Đặt "Screen.fullScreen = false;" trong Unity SceneManager. Thao tác này sẽ xóa chế độ nhập vai để thanh trạng thái Android hiển thị.
- Tắt "Thanh trạng thái bị ẩn" trong cài đặt trình phát. Xuất hiện để không có hiệu lực.
- Bao bọc UnityPlayer trong FrameLayout. Điều này cho phép tôi thay đổi kích thước Unity thành dạng xem.
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); }
}
Tôi đã viết bạn đã thay đổi chủ đề trong tệp kê khai nhưng trong ví dụ: có @android: style/Theme.NoTitleBar.Fullscreen. Đây có phải là chủ đề bạn đã thay đổi không? Nếu không thì nó là gì? – Lingviston
@Lingviston Mã tôi đăng hiển thị tích hợp ban đầu. Tôi đã thử thay đổi chủ đề thành 'android: theme =" @ android: style/Theme.Material.Light.DarkActionBar "' trên cả thẻ ứng dụng và hoạt động nhưng không thể hiển thị thanh hành động. – Morepork
@Morepork bạn đã tìm thấy giải pháp chưa? – Piotr