Ten wrapper umożliwia dostęp do pakietu SDK Pokoju gier w YouTube w Unity C#. Zawiera on wtyczkę .jslib i plik C#, które przyspieszają proces tworzenia. Dostępny jest też przykładowy projekt, który pokazuje, jak można ich używać w swoim projekcie.
Pakiety Unity można pobrać z naszego repozytorium z przykładowymi grami.
Wykorzystanie
- Sprawdź, czy platforma projektu Unity jest ustawiona na
WebGL
. To ustawienie znajdziesz wBuild Settings
. - Użyj ikony
WebGLTemplate
, aby utworzyć grę na potrzeby internetu, lub postępuj zgodnie z instrukcjami w sekcji Używanie własnego pliku index.html i upewnij się, że w plikuindex.html
masz skonfigurowany i zainicjowany pakiet SDK na potrzeby internetu.WebGLTemplate
można znaleźć w pakiecieGoogle-WebGLTemplate-only.unitypackage
lubGoogleYTGameWrapper-with-sample.unitypackage
. Aby skonfigurować i używać tego szablonu, wykonaj czynności opisane w sekcji Szablon WebGL.- Aby użyć własnego pliku Web i
index.html
, musisz dodać 2 wiersze do skryptu tworzeniaindex.html
w Unity. Informacje o integracji znajdziesz w sekcji Używanie własnego pliku index.html.
- Otwórz projekt w Unity, a następnie otwórz i zaimportuj do niego jeden z pakietów.
GoogleYTGameWrapper.unitypackage
: zawiera wtyczkę JS do łączenia pakietu SDK do gier w YouTube i otoczkę C# ułatwiającą połączenie z Twoją usługą.GoogleYTGameWrapper-with-sample.unitypackage
: zawiera te same pliki i treści co pakiet GoogleYTGameWrapper oraz przykład pokazujący, jak używać pakietu SDK do gier w YouTube w języku C#.
- WAŻNE: w scenie głównej utwórz nowy obiekt gry i nadaj mu nazwę
YTGameWrapper
. Ten obiekt gry służy do komunikacji z mostem JS. - WAŻNE: dodaj zaimportowany kod
YTGameWrapper.cs
jako komponent skryptu do obiektuYTGameWrapper
GameObject. Jeśli Twój projekt ma wiele scen, dodaj
DontDestroyOnLoad
do skryptuYTGameWrapper.cs
(uwaga: nowe wersje skryptu mają przełącznikDontDestroyOnSceneChange
, który jest domyślnie włączony). Dzięki temu skrypt i obiekt GameObject będą dostępne w całej grze.GameObject.DontDestroyOnLoad(this.gameObject);
Komponent
YTGameWrapper.cs
i obiektYTGameWrapper
GameObject służą do łączenia się z pakietem SDK YouTube Playables. Użyj ich, aby połączyć się z YouTube. Możesz użyć skryptu, aby znaleźć obiekt i komponent, lub ręcznie dodać je do kodu gry w edytorze Unity.Sprawdź, czy spełniasz wymagania techniczne dotyczące Twojego projektu.
Używanie własnego pliku index.html
Jeśli nie używasz podanego index.html
przykładu, musisz dodać 2 wiersze kodu do index.html
skryptu tworzenia w Unity.
Najpierw dodaj ten wiersz w tym samym miejscu, w którym projekt konfiguruje zmienne dla kontenera Unity, obszaru roboczego itp.
var container = document.querySelector("#unity-container");
var canvas = document.querySelector("#unity-canvas");
var unityGameInstance = null; // <-- Add this line >
...
Po drugie, w funkcji createUnityInstance
dodaj ten wiersz.
createUnityInstance(canvas, config, (progress) => {
progressBarFull.style.width = 100 * progress + "%";
}).then((unityInstance) => {
unityGameInstance = unityInstance; // <-- Add this line >
...
Przykłady
Ta sekcja zawiera przykłady użycia otoki C#. Nie jest to pełna lista dostępnych interfejsów API. Pełną listę dostępnych interfejsów API znajdziesz w pakiecie SDK do gier na YouTube.
sendScore
Ten przykład pokazuje implementację sendScore(int points)
w C#:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public int battleScore = 0;
...
// Update the total score and send this to the YouTube Game Wrapper.
public void UpdateScores(int scoreAmt)
{
battleScore += scoreAmt;
// ytGameWrapper should be a reference to your YTGameWrapper component.
ytGameWrapper.SendGameScore(battleScore);
}
onPause
Oto przykład, jak gra może nasłuchiwać zdarzeń Pause
pochodzących z YT Playables, aby w razie potrzeby wstrzymać działanie silnika:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
public bool gameIsPaused = false;
...
void Start()
{
// Sets the OnPause callback with the YT Playables SDK
ytGameWrapper.SetOnPauseCallback(PauseTheGameCallback);
}
// Pause game callback, will pause the game when called.
public void PauseTheGameCallback()
{
gameIsPaused = true;
}
saveData
Oto przykład użycia parametru saveData
i przesłania go do pakietu SDK do gier na YouTube:
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// Saves the current score of the game and converts it to a JSON format.
public void SaveScore(int scoreAmt)
{
SaveGameData("{\"BestScore\": \"" + scoreAmt.ToString() + "\"}");
}
public void SaveGameData(string saveString)
{
if (string.IsNullOrEmpty(saveString)) return;
// Sends save data to the YT Playables SDK
ytGameWrapper.SendGameSaveData(saveString);
}
loadData
Oto przykład użycia parametru loadData
i przesłania go do pakietu SDK do gier na YouTube:
...
using UnityEngine;
using YTGameSDK;
...
[Serializable]
public class LoadedScores
{
public int BestScore;
public float BestTime;
}
public YTGameWrapper ytGameWrapper;
...
void Start()
{
ytGameWrapper.LoadGameSaveData(LoadSaveGameDataReturned);
}
public void LoadSaveGameDataReturned(string data)
{
if (!string.IsNullOrEmpty(data))
{
LoadedScores loadedScores = JsonUtility.FromJson<LoadedScores>(data);
Debug.Log("LoadSaveGameDataReturned > Score <" + loadedScores.BestScore.ToString()
+ "> Time <" + loadedScores.BestTime.ToString("0.00"));
}
}
requestInterstitialAd
To przykład użycia funkcji requestInterstitialAd
, która wskazuje, że jeśli jest dostępna reklama pełnoekranowa, to jest to dobry moment na jej wyświetlenie. Aby uzyskać najlepsze wyniki, wywołaj tę funkcję podczas przerwy w grze, np. na końcu poziomu.
...
using YTGameSDK;
...
public YTGameWrapper ytGameWrapper;
...
// At the end of a round send a request to show an interstitial Ad, if one is
// available an Ad will be shown and Pause Game Callback should be called.
// EXAMPLE: send and forget
public void RequestInterstitialAd()
{
ytGameWrapper.RequestInterstitialAd();
}
// EXAMPLE: send and react to if an Ad was shown
public void RequestInterstitialAd()
{
int status = ytGameWrapper.RequestInterstitialAd();
if (status == 0)
{
// Ad request was successful, do some action.
}
}
Jak korzystać z przykładowego szablonu WebGL w YouTube
Jeśli nie masz bardzo dużego projektu w Unity, utworzone pliki .wasm
i .data
powinny mieścić się w limicie rozmiaru pliku. W takim przypadku nie należy dodatkowo kompresować tych plików, ponieważ zostaną one automatycznie skompresowane podczas przesyłania plików z reklamą interaktywną.
Automatyczna kompresja sprawdzi też, czy plik .wasm spełnia wymagania dotyczące rozmiaru pakietu początkowego. Na przykład plik o rozmiarze około 25 MB.wasm
zostanie skompresowany do około 7 MB.
Jeśli z jakiegoś powodu Twoje pliki przekraczają maksymalny limit rozmiaru pojedynczego pliku, najlepiej użyć kompresji ZIP, aby sprawdzić, czy mieszczą się w tym limicie. Kompresja z możliwością odtwarzania nie spowoduje ponownej kompresji tych plików.
Szablon WebGL
- Aby przeprowadzić konfigurację początkową, postępuj zgodnie z instrukcjami dotyczącymi pakietu Unity podanymi powyżej.
Użyj symbolu
Google-WebGLTemplate-only.unitypackage
lubGoogleYTGameWrapper-with-sample.unitypackage
i zaimportuj wszystkie pliki z folderuWebGLTemplates/YTGameWrapperTemplate/
.- Uwaga: jeśli nie masz jeszcze zaimportowanych
YTGameWrapper.cs
iUnityYTGameSDKLib.jslib
, zaimportuj je również.
- Uwaga: jeśli nie masz jeszcze zaimportowanych
- Ustaw szablon WebGL na
YTGameWrapperTemplate
. To ustawienie znajduje się w sekcjiEdit
–>Project settings
–>Player
–> kartaWebGL
–> sekcjaResolution and Presentation
.- Uwaga: domyślna szerokość i wysokość obszaru roboczego są ustawione w szablonie na 100%, więc te ustawienia Unity nie będą niczego zmieniać.
- Upewnij się, że
Compression Format
jest ustawione na Wyłączone. To ustawienie znajduje się na karcieProject settings
–>Player
–>WebGL
w sekcjiPublishing Settings
. - W oknie
Build Settings
kliknijWebGL
, a potem przejdź do kroku 7 lub 5 w zależności od potrzeb projektu. - Kroki 5 i 6 wykonaj tylko wtedy, gdy używasz kompresji: po utworzeniu projektu przejdź do folderu kompilacji i otwórz folder
Build
. Znajdź pliki projektów.wasm
lub.data
, które musisz skompresować, aby zmieściły się w limitach rozmiaru pliku, i skompresuj je. Pamiętaj, aby usunąć oryginalne pliki.wasm
/.data
, które zostały skompresowane, ponieważ zamiast nich prześlesz pliki*.wasm.zip
i*.data.zip
.- Uwaga: jeśli używasz komputera Mac, możesz kliknąć plik prawym przyciskiem myszy i wybrać „Kompresuj *”. Na komputerze PC możesz kliknąć plik prawym przyciskiem myszy i wybrać „Kompresuj do pliku ZIP”.
- Wykonaj tylko wtedy, gdy wykonano krok 5: zaktualizuj plik
index.html
utworzony na podstawieYTGameWrapperTemplate
, aby wczytywać spakowane pliki i je dekompresować.- Pod koniec plików
index.html
znajdzieszPath 1
i zakomentujesz ten wiersz:InitUnitySection();
. - Pod koniec plików
index.html
znajdzieszPath 2
i zakomentujesz ten wiersz:loadResources(InitUnitySection);
.
- Pod koniec plików
- Podczas przesyłania projektu do certyfikacji musisz wysłać wszystkie pliki utworzone w Unity do lokalizacji kompilacji z kroku 4. Jeśli wykonano kroki 5 i 6, dołącz również te pliki.
Uaktualnij podane przykłady, aby korzystać z uniwersalnego potoku renderowania (URP)
Jednym z najnowszych osiągnięć w nowszych wersjach Unity jest to, że korzystają one z Universal Render Pipeline (URP). Aby ulepszyć próbkę, tak aby wszystko było renderowane prawidłowo.
- Zacznij od zaimportowania pakietu
GoogleYTGameWrapper-with-sample.unitypackage
do nowego lub istniejącego projektu. - Otwórz okno
Render Pipeline Converter
:Window
->Rendering
->Render Pipeline Converter
. - Wybierz
Rendering Settings
,Material Upgrade
iReadonly Material Converter
. - Następnie wybierz
Initialize and Convert
, poczekaj na zakończenie tego procesu i sprawdź, czy próbka jest gotowa do użycia w URP.
Jak podzielić zasoby w projekcie Unity (leniwe wczytywanie)
Jednym z głównych problemów, na które zwracają uwagę deweloperzy korzystający z Unity, jest utrzymanie rozmiaru pliku poniżej określonego limitu oraz spełnienie wymagań dotyczących łącznego rozmiaru pakietu.
Leniwe wczytywanie zasobów to świetna optymalizacja, którą możesz wprowadzić w projekcie, ponieważ umożliwia wczytywanie zasobów, poziomów i danych w miarę potrzeb. Nasz zespół ds. certyfikacji może odstąpić od ogólnych ograniczeń rozmiaru pliku, jeśli zostanie to prawidłowo wykonane, ponieważ pełna wersja gry nie będzie ładowana z góry, ale w miarę poruszania się użytkownika po produkcie.
Aby ułatwić prawidłowe wczytywanie, Unity oferuje kilka sposobów dzielenia zasobów. Sprawdź, czy poszczególne grupy zasobów nie przekraczają limitów rozmiaru i czy wczytujesz treści z upływem czasu. Zalecamy używanie adresowalnych zasobów lub pakietów zasobów.
Adresowalne
Adresy umożliwiają identyfikowanie różnych plików, które powinny być ładowane razem, a Unity zajmie się większością pakowania. Unity udostępnia też narzędzia do zarządzania rozmiarami plików i zapobiegania duplikowaniu zasobów.
Aby korzystać z Addressables, musisz zaimportować pakiet Addressables za pomocą Menedżera pakietów w Unity, a następnie otagować komponenty w grupach Addressables. Więcej informacji znajdziesz w dokumentacji Unity.
Pakiety zasobów
Pakiety zasobów są przydatne, ponieważ możesz podzielić projekt i ładować elementy w trakcie działania aplikacji. Przydadzą się one w przypadku DLC, pakietów poziomów, nowych postaci i innych elementów. Pakiety zasobów świetnie sprawdzają się w przypadku samodzielnego zarządzania wczytywaniem i grupowaniem treści. Możesz je wykorzystać, tagując komponenty w określonych pakietach, a następnie wczytując pakiety w miarę potrzeb. Więcej informacji znajdziesz w dokumentacji pakietów zasobów Unity.
Zobacz pełną dokumentację interfejsu YT Playables API.