網(wǎng)站建設(shè)算什么專(zhuān)業(yè)北京seo包年
Unity打包的Android默認(rèn)都是全屏,如果想要在真機(jī)上顯示狀態(tài)欄,就需要額外設(shè)置,有兩種方式:
- 第一種,使用Android的Java代碼去控制,然后以插件的方式放到Unity中,被C#調(diào)用。
- 第二種,使用Unity封裝的C#代碼,直接調(diào)用Android上的Java代碼,去控制。
本文采用第二種方法,簡(jiǎn)單快捷,但會(huì)有幾個(gè)坑,全部避開(kāi)之后才能正確顯示,先給正確代碼,再指出踩坑點(diǎn)——只有一個(gè)函數(shù),直接運(yùn)行即可,內(nèi)部精確控制,可以自定義。
private void ShowStatusBar()
{#if UNITY_ANDROID && !UNITY_EDITORScreen.fullScreen = false;using var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");using var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>{// WINDOW_FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |// WINDOW_FLAG_FORCE_NOT_FULLSCREEN | // WINDOW_FLAG_LAYOUT_IN_SCREEN | // WINDOW_FLAG_TRANSLUCENT_STATUSvar flags = unchecked((int) 0x80000000) | 0x00000800 | 0x00000100 | 0x04000000;// VIEW_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |// SYSTEM_UI_FLAG_LIGHT_STATUS_BAR (black text and icons)var uiOptions = 0x00000400 | 0x00002000; // the outer unityPlayer and activity will be disposed by other threadusing var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");using var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); using var window = activity.Call<AndroidJavaObject>("getWindow");using var view = window.Call<AndroidJavaObject>("getDecorView");// 0xAARRGGBB// window.Call("setStatusBarColor", unchecked((int) 0xFF000000));window.Call("setFlags", flags, unchecked((int) 0xFFFFFFFF));view .Call("setSystemUiVisibility", uiOptions);}));#endif
}
需要注意的地方,在于:
-
Screen.fullScreen = false——需要設(shè)置,否則狀態(tài)欄會(huì)自動(dòng)隱藏。
-
runOnUiThread——需要控制Android UI的調(diào)用,在UI線(xiàn)程中執(zhí)行。
-
window.setFlags——設(shè)置布局,view.setSystemUiVisibility——設(shè)置外觀(guān)。
-
unchecked((int) 0x80000000)——這個(gè)越界int類(lèi)型了,C#向Java傳遞會(huì)有問(wèn)題,需要控制一下溢出。
-
unityPlayer和activity——在匿名函數(shù)中需要重新獲取,外部的會(huì)在外層函數(shù)結(jié)束時(shí)釋放資源,內(nèi)部的在UI線(xiàn)程中執(zhí)行,所以不能用閉包捕獲外層的使用。
-
setFlags的第二個(gè)mask參數(shù)——這個(gè)0xFFFFFFFF會(huì)越界int類(lèi)型,需要unchecked一下。
更多布局與外觀(guān)的控制,查看WINDOW_FLAG_與SYSTEM_UI_FLAG的設(shè)定,添加到flags與uiOptions即可,注意int類(lèi)型的越界處理。