1. Wprowadzenie
W tym ćwiczeniu dowiesz się, jak zoptymalizować grę na Androida w Unity pod kątem urządzeń z dużym ekranem i urządzeń składanych. Aby wdrożyć obsługę formatu obrazu, rozszerzyć wykorzystanie pełnego ekranu i reagować na stany urządzenia składanego, użyjesz przykładowego projektu Lost Crypt.
Wymagania wstępne
- Podstawowa znajomość Unity i programowania na Androida.
- urządzenia z Androidem z dużym ekranem, takie jak tablety lub telefony składane;
Czego się dowiesz
- Jak wdrożyć obsługę różnych formatów obrazu.
- Jak używać punktów zakotwiczenia w interfejsie gry i ustawieniach kamery, aby automatycznie dostosowywać się do rozmiaru ekranu.
- Jak używać Menedżera okien Jetpack na Androidzie do wykrywania pozycji złożenia urządzenia i dostosowywania układu.
Wymagania
- Unity Hub i edytor: zainstalowana wersja Unity 2020 LTS lub Unity 2022 z obsługą kompilacji na Androida.
- Sprzęt: urządzenia z Androidem z dużym ekranem, takie jak tablety lub telefony składane.
- Oparta na agentach platforma dla programistów, np. Google Antigravity, jeśli planujesz korzystać z umiejętności.
2. Umiejętności agenta
Opcjonalnie dostępna jest umiejętność agenta, która umożliwia ocenę projektu gry w Unity. Ta umiejętność pomaga dodać obsługę zmiany rozmiaru oraz obsługę urządzeń z dużym ekranem i urządzeń składanych. Więcej informacji znajdziesz w witrynie GitHub.
Aby skorzystać z tej umiejętności:
- Skopiuj plik SKILL.md do katalogu agenta. Więcej informacji o dodawaniu umiejętności znajdziesz w artykule Pierwsze kroki z Google Antigravity.
- Zadaj agentowi w środowisku IDE agenta, np. Antigravity, pytania dotyczące dużych ekranów, urządzeń składanych lub zmiany rozmiaru.
- Poproś agenta o dodanie obsługi dużych ekranów i urządzeń składanych.
3. Obsługa formatu obrazu
Aby mieć pewność, że gra wyświetla się prawidłowo na ekranach o różnych rozmiarach, zacznij od wdrożenia obsługi różnych formatów obrazu. Możesz dostosować format obrazu z kamery lub obszaru roboczego, aby lepiej pasował do różnych ekranów.
- Sprawdź, czy aplikacja korzysta z ustawienia pełnego ekranu z możliwością zmiany rozmiaru.
- W
AndroidManifest.xml(znajdującym się pod adresemAssets/Plugins/Android/AndroidManifest.xml):- Ustaw
android:resizeableActivity="true". - Ustaw
android:screenOrientation="fullSensor".
- Ustaw
Na przykład:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity.lostcryptlargescreenexample.LargeScreenPlayableActivity"
android:theme="@style/UnityThemeSelector"
android:screenOrientation="fullSensor"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
android:hardwareAccelerated="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
- Sprawdź ustawienia kompilacji w Unity pod kątem konfiguracji platformy Android.
Uwaga: obsługa różnych formatów obrazu to pierwszy krok do zapewnienia świetnego wyglądu gry na tabletach i urządzeniach składanych.
4. Wykorzystanie pełnego ekranu
Po dostosowaniu się do różnych formatów obrazu upewnij się, że gra wykorzystuje cały ekran, aby rozgrywka była bardziej wciągająca.
Aby korzystać z całego ekranu:
- Używaj punktów zakotwiczenia w interfejsie gry i ustawieniach kamery. Dzięki temu elementy interfejsu automatycznie dostosowują swoje położenie do rozmiaru ekranu.
- Otwórz scenę Anchoring w projekcie przykładowym, aby zobaczyć, jak skonfigurowane jest kotwiczenie obszaru roboczego interfejsu.
- W scenie Anchoring obszar roboczy jest aktualizowany, aby uwzględniać bezpieczną ramkę, a elementy sterujące ruchem są zakotwiczone w rogach ekranu.
Aby zachować format obrazu głównego aparatu, dynamicznie dostosuj pixelRect. Skrypt CameraAspectLock.cs pokazuje, jak reagować na zmiany orientacji i przycinać widok z kamery:
[SerializeField]
private float minAspectRatio = 4f / 3f;
[SerializeField]
private float maxAspectRatio = 21f / 9f;
public void MaintainAspectRatio() {
int viewWidth = Display.main.systemWidth;
int viewHeight = Display.main.systemHeight;
// 1. Calculate screen aspect ratio
float scaleScreen = viewWidth / (float)viewHeight;
Rect rect = _camera.pixelRect;
// 2. Scale to the fullest of the lower between width or height
if (scaleScreen > maxAspectRatio) {
// use height, lock width to max at aspect scale
rect.width = viewHeight * maxAspectRatio;
rect.height = viewHeight;
} else if (scaleScreen < minAspectRatio) {
// use width, lock height to min at aspect scale
rect.width = viewWidth;
rect.height = viewWidth / minAspectRatio;
} else {
// within allowed aspect ratio range, use full screen
rect.width = viewWidth;
rect.height = viewHeight;
}
// make sure to center the rect within the window
rect.x = Mathf.Floor((viewWidth - rect.width) * 0.5f);
rect.y = Mathf.Floor((viewHeight - rect.height) * 0.5f);
Debug.Log("camera view width = " + rect.width +
" height = " + rect.height +
" x = " + rect.x +
" y = " + rect.y);
// 3. Commit the new size to the camera so that it takes effect
_camera.pixelRect = rect;
}
5. Obsługa urządzeń składanych
W przypadku urządzeń składanych należy na bieżąco dostosowywać układ gry do pozycji złożenia urządzenia (np. HALF_OPENED, FLAT) i rozmiaru ekranu.
- Użyj Jetpack Window Manager na Androidzie, aby wykryć stan urządzenia.
- W przykładowym projekcie otwórz scenę HingeAware.
- Ta scena zawiera
ConfigurationManagerMonoBehaviour, który łączy zdarzenia Jetpack WindowManager na Androidzie z Unity i reaguje na stany składania za pomocą wywołań zwrotnychUnityEvent. HingeSensor.csodczytuje kąt zawiasu za pomocącom.unity.lostcryptlargescreenexample.HingeAngleSensorwtyczki Java.
Korzystanie z klasy ConfigurationManager
ConfigurationManager.cs komunikuje się z niestandardową aktywnością na Androidzie i analizuje ciągi JSON reprezentujące stan. Nasłuchuje wywołań zwrotnych onConfigurationChanged i onFoldChanged z aktywności Androida.
[System.Serializable]
public class FoldInfo {
public string orientation;
public string state;
public int isSeparating;
public int boundsLeft;
public int boundsTop;
public int boundsRight;
public int boundsBottom;
}
public void onFoldChanged(string strFoldInfo) {
FoldInfo info = JsonUtility.FromJson<FoldInfo>(strFoldInfo);
// Always call the refresh from the main Unity thread
StartCoroutine(ExecuteOnMainUnityThread(ActionOnFoldChange, info));
}
Możesz też synchronicznie wysyłać zapytania o stan za pomocą właściwości getFoldableState:
public static string getFoldableState {
get {
if (Application.platform == RuntimePlatform.Android) {
var foldingFeatureObject = foldablePlayerActivity.Call<AndroidJavaObject>("getFoldingFeature");
if (foldingFeatureObject != null) {
var state = foldingFeatureObject.Call<AndroidJavaObject>("getState");
return state.Call<string>("toString");
}
}
return "NONE";
}
}
6. Korzystanie z HingeSensor
Niektóre urządzenia składane mają fizyczny czujnik zawiasu, który podaje dokładny kąt zgięcia (od 0 do 360 stopni). Możesz go używać do sterowania mechaniką rozgrywki lub dostosowywania kamery.
W HingeSensor.cs inicjowana jest wtyczka Androida, która odczytuje dane z czujnika sprzętowego. Możesz też sprawdzić, czy zawias jest włączony:
public class HingeSensor : IDisposable {
AndroidJavaObject plugin;
public static HingeSensor Start() {
if (Application.platform == RuntimePlatform.Android) {
return OnPlayer.Run(p => {
var context = p.GetStatic<AndroidJavaObject>("currentActivity");
var plugin = new AndroidJavaClass("com.unity.lostcryptlargescreenexample.HingeAngleSensor")
.CallStatic<AndroidJavaObject>("getInstance", context);
if (plugin != null) {
plugin.Call("setupSensor");
return new HingeSensor(plugin);
}
return null;
});
}
return null;
}
public float GetHingeAngle() {
return (Application.platform == RuntimePlatform.Android && plugin != null) ? plugin.Call<float>("getHingeAngle") : -1.0f;
}
public bool IsHingeEnabled() {
return Application.platform == RuntimePlatform.Android && plugin != null && plugin.Call<int>("isHingeEnabled") > 0;
}
}
Uwaga: gdy aplikacja zostanie wstrzymana lub zamknięta, wywołaj funkcję Dispose() lub StopSensing() w instancji HingeSensor, aby zapobiec rozładowaniu baterii.
7. Tworzenie pliku AAB
Aby utworzyć plik AAB w edytorze Unity, wykonaj te czynności:
- W edytorze Unity kliknij File > Build settings (Plik > Ustawienia kompilacji).
- Kliknij Build App Bundle (Google Play) (Utwórz pakiet aplikacji (Google Play)). Więcej informacji znajdziesz w informacjach o ustawieniach kompilacji na Androida.
- Kliknij Utwórz.
- Pobierz plik AAB z Edytora Unity.
Tworzenie wersji testu wewnętrznego
Aby utworzyć wersję testu wewnętrznego i dodać testerów w Konsoli Play:
- W Konsoli Google Play wybierz grę.
- Otwórz stronę Testuj i publikuj (Testowanie> Test wewnętrzny).
- Kliknij Prześlij i wybierz plik AAB.
- W polu Szczegóły wersji wpisz nazwę.
- Kliknij Dalej i sprawdź szczegóły wydania.
- Kliknij Zapisz i opublikuj.
8. Kompilowanie i uruchamianie projektu
Możesz teraz skompilować projekt i przetestować go na urządzeniu.
- Upewnij się, że gra jest otwarta.
- W Konsoli Play kliknij Plik > Utwórz profil (lub Ustawienia kompilacji).
- Jeśli chcesz przesłać pakiet aplikacji do Konsoli Play, upewnij się, że pole Build App Bundle (Google Play) jest zaznaczone. Możesz też kliknąć Build and Run (Skompiluj i uruchom), aby wdrożyć aplikację bezpośrednio na podłączonym urządzeniu.
- W przypadku urządzeń składanych należy dostosowywać układ gry na bieżąco w zależności od pozycji złożenia urządzenia (np. HALF_OPENED, FLAT) i rozmiaru ekranu.
9. Gratulacje
Gratulacje! Poznałeś(-aś) zasady dostosowywania gier na Androida w Unity do dużych i składanych ekranów.
Ankieta
Twoja opinia na temat tego ćwiczenia w Codelabs jest dla nas bardzo cenna. Poświęć kilka minut na wypełnienie naszej ankiety.