Deneysel YouTube Hazır Oyunlar Unity Sarmalayıcı

Bu sarmalayıcıyla Unity C#'ta YouTube Hazır Oyunlar SDK'sına erişebilirsiniz. Sarmalayıcıda, geliştirme sürecinizi hızlandırmaya yardımcı olacak bir .jslib eklentisi ve bir C# dosyası bulunur. Ayrıca, bunları projenizde nasıl kullanabileceğinizi gösteren örnek bir proje de vardır.

Unity paketleri, Hazır Oyunlar örnek depomuzdan indirilebilir.

Kullanım

  1. Unity projenizin Platform ayarının WebGL olarak belirlendiğini doğrulayın. Bu ayar Build Settings bölümünde bulunur.
  2. Web için oyununuzu oluşturmak üzere WebGLTemplate kullanın veya Kendi index.html dosyanızı kullanın bölümündeki talimatları uygulayın ve index.html dosyanızda web SDK'sını kurup başlattığınızı doğrulayın.
    • WebGLTemplate, Google-WebGLTemplate-only.unitypackage veya GoogleYTGameWrapper-with-sample.unitypackage paketinde bulunabilir. Bu şablonu ayarlamak ve kullanmak için WebGL Şablonu bölümündeki adımları uygulayın.
    • Kendi Web ve index.html dosyanızı kullanmak için index.html Unity oluşturma komut dosyanıza iki satır eklemeniz gerekir. Entegrasyon için Kendi index.html dosyanızı kullanma bölümüne bakın.
  3. Projenizi Unity'de açın, ardından paketlerden birini açıp projenize aktarın.
    • GoogleYTGameWrapper.unitypackage: YouTube Hazır Oyunlar SDK'sını bağlamak için JS eklentisi ve bunu ürününüze bağlamanıza yardımcı olacak bir C# sarmalayıcı içerir.
    • GoogleYTGameWrapper-with-sample.unitypackage: GoogleYTGameWrapper paketinde bulunan dosyalarla aynı dosyaları ve C# dilinde YouTube Hazır Oyunlar SDK'sının nasıl kullanılacağını gösteren bir örneği içerir.
  4. ÖNEMLİ: Ana sahnenizde yeni bir oyun nesnesi oluşturun ve bu nesneyi YTGameWrapper olarak adlandırın. Bu oyun nesnesi, JS köprüsüyle iletişim kurmak için kullanılır.
  5. ÖNEMLİ: İçe aktarılan YTGameWrapper.cs kodunu, YTGameWrapper GameObject'e bir komut dosyası bileşeni olarak ekleyin.
  6. Projenizde birden fazla sahne varsa DontDestroyOnLoad simgesini YTGameWrapper.cs komut dosyasına eklediğinizden emin olun (Not: Komut dosyasının yeni sürümlerinde varsayılan olarak etkin olan bir DontDestroyOnSceneChange açma/kapatma düğmesi bulunur). Bu, komut dosyasının ve GameObject'in oyununuz boyunca kalmasını sağlar.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. YTGameWrapper.cs bileşeni ve YTGameWrapper GameObject, YouTube Hazır Oyunlar SDK'sına bağlanmak için kullanılır. YouTube'a bağlanmak için bunları kullanın. Nesneyi ve bileşeni bulmak için komut dosyası kullanabilir veya bunları Unity Düzenleyici aracılığıyla oyun kodunuza manuel olarak ekleyebilirsiniz.

  8. Projeniz için teknik koşullara uyduğunuzu doğrulayın.

Kendi index.html dosyanızı kullanma

index.html örneğini kullanmıyorsanız index.html Unity oluşturma komut dosyanıza iki satır kod eklemeniz gerekir.

Öncelikle bu satırı, projenizin Unity kapsayıcısı, tuval vb. için değişkenleri ayarladığı yere ekleyin.

    var container = document.querySelector("#unity-container");
    var canvas = document.querySelector("#unity-canvas");

    var unityGameInstance = null; // <-- Add this line >

    ...

İkinci olarak, createUnityInstance işlevinin içine şu satırı ekleyin.

    createUnityInstance(canvas, config, (progress) => {
        progressBarFull.style.width = 100 * progress + "%";
    }).then((unityInstance) => {

        unityGameInstance = unityInstance; // <-- Add this line >

    ...

Örnekler

Bu bölümde, C# sarmalayıcısının nasıl kullanılacağına dair bazı örnekler verilmiştir. Bu örnekler, mevcut API'lerin tam listesi değildir. Kullanılabilen API'lerin tam listesi için YouTube Hazır Oyunlar SDK'sına bakın.

sendScore

Bu örnekte, C# dilinde sendScore(int points) uygulaması gösterilmektedir:

...
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

Aşağıda, bir oyunun gerektiğinde motorunu duraklatmak için YT Playables'den gelen Pause etkinliklerini nasıl dinleyebileceğine dair bir örnek verilmiştir:

...
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

saveData öğesini YT Playables SDK'sına göndermek için nasıl kullanacağınızla ilgili bir örnek:

...
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

loadData öğesini YT Playables SDK'sına göndermek için nasıl kullanacağınızla ilgili bir örnek:

...
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

Bu, requestInterstitialAd kullanımına ilişkin bir örnektir. Bu örnek, varsa geçiş reklamı göstermek için uygun bir zaman olduğunu belirtir. En iyi sonuçlar için bu aramayı oyun sırasında bir ara verdiğinizde (ör. bir bölümün sonunda) yapın.

...
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.
    }
}

requestRewardedAd

Bu, requestRewardedAd kullanımına ilişkin bir örnektir. Bu, bir kullanıcı oyununuzda ödül karşılığında ödüllü reklam görüntülemeyi seçtiğinde kullanılır. Reklam varsa kullanıcıya gösterilir.

...
using YTGameSDK;
...

public YTGameWrapper ytGameWrapper;

...

public void RequestRewardedAd()
{
    // Register callback for Rewarded Ads. If an Ad is available one will be
    //  shown. Pause Game Callback should be called. Any ID is fine as long as
    //  its identifyable for your game.
    ytGameWrapper.RequestRewardedAd("my-reward-ad-id-123", (rewardEarned) => {
        if (rewardEarned) {
            // Rewarded Ad is earned, reward the user.
        } else {
            // Rewarded Ad not earned, take the appropriate action
        }
    });
}

YouTube'un örnek WebGL şablonunu kullanma

Çok büyük bir Unity projeniz yoksa oluşturduğunuz .wasm ve .data dosyaları, dosya boyutu sınırımız içinde olmalıdır. Bu durumda, oynanabilir dosyalarınızı gönderdiğinizde otomatik olarak sıkıştırılacakları için bu dosyalar için sizin tarafınızdan ek sıkıştırma işlemi yapılmamalıdır. Bu otomatik sıkıştırma işlemi, .wasm dosyanızın ilk paket boyutu şartına uygun olup olmadığını da doğrular. Örneğin, ~25 MiB boyutundaki bir .wasm dosyası ~7 MiB boyutuna sıkıştırılır.

Dosyalarınızın herhangi bir nedenle maksimum dosya boyutu sınırını aştığını düşünüyorsanız bu sınıra uyduklarını doğrulamak için ZIP sıkıştırması kullanmanız önerilir. Oynatılabilir sıkıştırma, bu dosyaları yeniden sıkıştırmaz.

WebGL Şablonu

  1. İlk kurulum için yukarıdaki Unity paketi talimatlarını uygulayın. Google-WebGLTemplate-only.unitypackage veya GoogleYTGameWrapper-with-sample.unitypackage kullanıp WebGLTemplates/YTGameWrapperTemplate/ klasöründeki tüm dosyaları içe aktardığınızdan emin olun.
    • Not: YTGameWrapper.cs ve UnityYTGameSDKLib.jslib öğelerini henüz içe aktarmadıysanız bunları da içe aktarmanız gerekir.
  2. WebGL şablonunuzu YTGameWrapperTemplate kullanacak şekilde ayarlayın. Bu ayar, Edit -> Project settings -> Player -> WebGL sekmesi -> Resolution and Presentation bölümünde yer alır.
    • Not: Varsayılan tuval genişliği ve yüksekliği şablonda% 100 olarak ayarlandığından bu Unity ayarları herhangi bir şeyi düzenlemez.
  3. Compression Format ayarının devre dışı olarak ayarlandığından emin olun. Bu ayar, Project settings -> Player -> WebGL sekmesi -> Publishing Settings bölümünde yer alır.
  4. Build Settings penceresinde WebGL için derleme yapın, ardından projelerinizin ihtiyaçlarına göre 7. veya 5. adıma gidin.
  5. Yalnızca sıkıştırma kullanılıyorsa 5. ve 6. adımları uygulayın: Projeniz oluşturulduktan sonra derleme klasörünüzün konumuna gidin ve Build klasörünü açın. Her bir dosya boyutu sınırına uymak için sıkıştırılması gereken .wasm veya .data dosyalarınızı bulun ve bu dosyaları sıkıştırın. *.wasm.zip ve *.data.zip dosyalarını göndereceğiniz için sıkıştırılmış orijinal .wasm/.data dosyalarını sildiğinizden emin olun.
    • Not: Mac kullanıyorsanız dosyayı sağ tıklayıp "* sıkıştır"ı seçebilirsiniz. PC'de ise dosyayı sağ tıklayıp "ZIP dosyasına sıkıştır"ı seçebilirsiniz.
  6. Yalnızca 5. adımı uyguladıysanız devam edin: Sıkıştırılmış dosyaları yüklemek ve bunları açmak için YTGameWrapperTemplate'dan oluşturulan index.html dosyasını güncelleyin.
    • index.html dosyalarının sonuna doğru Path 1 ifadesini bulup aşağıdaki satırda InitUnitySection(); yorum satırı oluşturun.
    • index.html dosyalarının sonuna doğru Path 2 ifadesini bulup aşağıdaki satırda loadResources(InitUnitySection); yorum satırı oluşturun.
  7. Projenizi sertifikalandırma için gönderirken Unity'de oluşturulan tüm dosyaları 4. adımda belirtilen derleme konumunuza göndermeniz gerekir. 5. ve 6. adımlar uygulandıysa bu dosyaları da ekleyin.

Universal Render Pipeline'ı (URP) kullanmak için sağlanan örnekleri yükseltin

Unity'nin yeni sürümlerindeki en son gelişmelerden biri, Universal Render Pipeline (URP) kullanmalarıdır. Her şeyin doğru şekilde oluşturulması için örneği yükseltin.

  1. GoogleYTGameWrapper-with-sample.unitypackage paketini yeni veya mevcut bir projeye aktararak başlayın.
  2. Render Pipeline Converter penceresine gidin: Window -> Rendering -> Render Pipeline Converter.
  3. Rendering Settings, Material Upgrade ve Readonly Material Converter'yi seçin.
  4. Ardından Initialize and Convert seçeneğini belirleyin, işlemin tamamlanmasını bekleyin. Örnek, URP için hazır olmalıdır.

Unity projenizdeki öğeleri bölme (Lazy Loading)

Geliştiricilerin Unity'yi kullanırken vurguladığı temel sorunlardan biri, tek tek dosya boyutu şartlarına ve toplam paket boyutu şartlarına uymaktır.

Öğelerin geç yüklenmesi, öğeleri, seviyeleri ve verileri gerektiğinde yükleyebileceğiniz için projeniz için yapabileceğiniz harika bir optimizasyondur. Tam oyununuz önceden yüklenmeyeceği, kullanıcı ürününüzde gezinirken yükleneceği için sertifika ekibimiz, bu işlem doğru şekilde yapıldığında genel dosya boyutu kısıtlamalarını kaldırabilir.

Unity, öğelerinizi düzgün bir şekilde yüklemenize yardımcı olmak için çeşitli yöntemler sunar. Bu yöntemler, tek tek öğe gruplarınızın boyut sınırlarının altında olduğunu ve içeriği zaman içinde yüklediğinizi doğrular. Addressables veya Asset Bundles'ı kullanmanızı öneririz.

Addressables

Addressables, birlikte yüklenmesi gereken farklı dosyaları tanımlamanıza olanak tanır ve Unity, paketleme işlemlerinin çoğunu sizin için halleder. Unity ayrıca dosya boyutlarını yönetmek ve öğeleri kopyalamadığınızdan emin olmanıza yardımcı olmak için bazı araçlar sunar.

Addressables'ı kullanmak için Unity'deki Paket Yöneticisi aracılığıyla Addressables paketini içe aktarmanız ve ardından öğelerinizi Addressable Grupları'na etiketlemeniz gerekir. Daha fazla bilgi için Unity belgelerine göz atın.

Öğe paketleri

Projenizi bölüp öğeleri anında yükleyebildiğiniz için öğe paketleri faydalıdır. Bu bilgiler; indirilebilir içerikler, seviye paketleri, yeni karakterler ve daha fazlası için faydalıdır. Öğe paketleri, kendi kendine yönetilen içerik yükleme ve paketleme için idealdir. Öğelerinizi belirli paketlere etiketleyip paketleri gerektiğinde yükleyerek bu özelliklerden yararlanabilirsiniz. Daha fazla bilgiyi Unity'nin Asset Bundle belgelerinde bulabilirsiniz.

YT Playables API referansının tamamına bakın.