Wrapper Unity YouTube Playables Eksperimental

Dengan wrapper ini, Anda dapat mengakses YouTube Playables SDK di Unity C#. Wrapper memiliki plugin .jslib dan file C# untuk membantu mempercepat pengembangan Anda. Ada juga project contoh yang menunjukkan cara menggunakannya di project Anda.

Paket Unity dapat didownload dari repo contoh Playables kami.

Penggunaan

  1. Pastikan Platform project Unity Anda disetel ke WebGL. Setelan ini dapat ditemukan di Build Settings.
  2. Gunakan WebGLTemplate untuk membuat game Anda untuk web, atau ikuti bagian Menggunakan file index.html Anda sendiri dan pastikan Anda telah menyiapkan dan melakukan inisialisasi SDK web di file index.html Anda.
    • WebGLTemplate dapat ditemukan dalam paket Google-WebGLTemplate-only.unitypackage atau GoogleYTGameWrapper-with-sample.unitypackage. Untuk menyiapkan dan menggunakan template ini, ikuti langkah-langkah di bagian Template WebGL.
    • Untuk menggunakan file Web dan index.html Anda sendiri, Anda harus menambahkan dua baris ke skrip pembuatan Unity index.html, lihat Menggunakan file index.html Anda sendiri bagian untuk integrasi.
  3. Buka project Anda di Unity, lalu buka dan impor salah satu paket ke project Anda.
    • GoogleYTGameWrapper.unitypackage: Berisi Plugin JS untuk menghubungkan YouTube Playables SDK dan wrapper C# untuk membantu menghubungkannya ke produk Anda.
    • GoogleYTGameWrapper-with-sample.unitypackage: Berisi konten file yang sama seperti yang ditemukan dalam paket GoogleYTGameWrapper dan contoh yang menunjukkan cara menggunakan YouTube Playables SDK di C#.
  4. PENTING: Di scene utama, buat gameobject baru dan beri nama YTGameWrapper. Objek game ini digunakan untuk berkomunikasi dengan jembatan JS.
  5. PENTING: Tambahkan kode YTGameWrapper.cs yang diimpor sebagai komponen skrip ke GameObject YTGameWrapper.
  6. Jika project Anda memiliki beberapa scene, pastikan untuk menambahkan DontDestroyOnLoad ke skrip YTGameWrapper.cs (catatan: versi baru skrip memiliki tombol DontDestroyOnSceneChange yang diaktifkan secara default). Hal ini akan memastikan skrip dan GameObject tetap ada di seluruh game Anda.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Komponen YTGameWrapper.cs dan GameObject YTGameWrapper digunakan untuk terhubung ke YouTube Playables SDK. Gunakan komponen dan objek ini untuk terhubung ke YouTube. Anda dapat menggunakan Skrip untuk menemukan objek dan komponen atau menambahkannya secara manual ke kode game Anda melalui Unity Editor.

  8. Pastikan Anda mengikuti persyaratan teknis untuk project Anda.

Menggunakan file index.html Anda sendiri

Jika Anda tidak menggunakan contoh index.html yang disediakan, Anda harus menambahkan dua baris kode ke skrip pembuatan Unity index.html Anda.

Pertama, tambahkan baris ini di tempat yang sama dengan tempat project Anda menyiapkan variabel untuk container Unity, kanvas, dll.

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

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

    ...

Kedua, di dalam fungsi createUnityInstance, tambahkan baris ini.

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

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

    ...

Contoh

Bagian ini memiliki beberapa contoh cara menggunakan wrapper C#, tetapi bukan daftar lengkap API yang tersedia. Untuk daftar lengkap API yang tersedia, lihat ke YouTube Playables SDK.

sendScore

Contoh ini menunjukkan penerapan sendScore(int points) di 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

Berikut adalah contoh cara game dapat memproses peristiwa Pause yang berasal dari YT Playables, untuk menjeda mesinnya jika diperlukan:

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

Berikut adalah contoh cara menggunakan saveData, dan mengirimkannya ke YT Playables SDK:

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

Berikut adalah contoh cara menggunakan loadData, dan mengirimkannya ke YT Playables SDK:

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

Berikut adalah contoh cara menggunakan requestInterstitialAd, yang menunjukkan bahwa ini adalah waktu yang tepat untuk menampilkan Iklan interstisial, jika tersedia. Untuk mendapatkan hasil terbaik, lakukan panggilan ini selama jeda dalam gameplay, misalnya, di akhir level.

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

Berikut adalah contoh cara menggunakan requestRewardedAd. Fungsi ini digunakan saat pengguna memilih untuk melihat Iklan reward sebagai imbalan atas reward tertentu dalam game Anda. Jika Iklan tersedia, iklan akan ditampilkan kepada pengguna.

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

Cara menggunakan Template WebGL contoh YouTube

Kecuali jika Anda memiliki project Unity yang sangat besar, file .wasm dan .data yang Anda buat harus berada di bawah batas ukuran file individual kami. Jika demikian, tidak ada kompresi tambahan yang perlu dilakukan di pihak Anda untuk file ini karena file tersebut akan otomatis dikompresi saat pengiriman file Playable Anda. Kompresi otomatis ini juga akan memverifikasi bahwa file .wasm Anda sesuai dengan persyaratan ukuran paket awal. Sebagai contoh, file .wasm berukuran ~25 MiB akan dikompresi menjadi ~7 MiB.

Jika karena alasan tertentu file Anda melebihi batas ukuran file individual maksimum, sebaiknya gunakan kompresi ZIP untuk memverifikasi bahwa file tersebut sesuai dengan batas ini. Kompresi Playable tidak akan mengompresi ulang file ini.

Template WebGL

  1. Ikuti petunjuk paket Unity di atas untuk penyiapan awal. Pastikan untuk menggunakan Google-WebGLTemplate-only.unitypackage atau GoogleYTGameWrapper-with-sample.unitypackage dan mengimpor semua file di folder WebGLTemplates/YTGameWrapperTemplate/.
    • Catatan: jika Anda belum mengimpor YTGameWrapper.cs dan UnityYTGameSDKLib.jslib, Anda juga harus mengimpornya.
  2. Setel Template WebGL Anda untuk menggunakan YTGameWrapperTemplate. Setelan ini ada di Edit -> Project settings -> Player -> tab WebGL -> bagian Resolution and Presentation.
    • Catatan: Lebar dan Tinggi Kanvas Default ditetapkan ke 100% dalam template sehingga setelan Unity ini tidak akan menyesuaikan apa pun.
  3. Pastikan Compression Format Anda disetel ke Nonaktif. Setelan ini ada di Project settings -> Player -> tab WebGL -> bagian Publishing Settings.
  4. Buat untuk WebGL di jendela Build Settings, lalu buka langkah 7 atau 5 berdasarkan kebutuhan project Anda.
  5. Hanya ikuti langkah 5 &6 jika kompresi digunakan: Setelah project Anda dibuat, buka lokasi folder build Anda dan buka folder Build. Temukan file .wasm atau .data project Anda yang memerlukan kompresi agar sesuai dengan batas ukuran file individual dan gabungkan file ini ke dalam file ZIP. Pastikan untuk menghapus file .wasm/.data asli yang dikompresi karena Anda akan mengirimkan file *.wasm.zip dan *.data.zip sebagai gantinya.
    • Catatan: jika Anda menggunakan Mac, Anda dapat mengklik kanan file dan memilih "Compress *". Di PC, Anda dapat mengklik kanan file dan memilih "Compress to ZIP file".
  6. Hanya ikuti jika Anda melakukan langkah 5: Perbarui file index.html yang dibuat dari YTGameWrapperTemplate untuk memuat file yang di-zip dan mengekstraknya.
    • Di dekat akhir file index.html, Anda akan menemukan Path 1 dan mengomentari baris berikut InitUnitySection();.
    • Di dekat akhir file index.html, Anda akan menemukan Path 2 dan mengomentari baris berikut loadResources(InitUnitySection);.
  7. Saat mengirimkan project Anda untuk Sertifikasi, Anda harus mengirimkan semua file yang dibuat dari Unity ke lokasi build Anda dari Langkah 4. Jika langkah 5 + 6 diikuti, sertakan juga file ini.

Mengupgrade contoh yang disediakan untuk menggunakan Universal Render Pipeline (URP)

Salah satu kemajuan terbaru dengan versi Unity yang lebih baru adalah bahwa versi tersebut menggunakan Universal Render Pipeline (URP). Untuk mengupgrade contoh sehingga semuanya dirender dengan benar.

  1. Mulai dengan mengimpor paket GoogleYTGameWrapper-with-sample.unitypackage ke project baru atau yang sudah ada.
  2. Buka jendela Render Pipeline Converter: Window -> Rendering -> Render Pipeline Converter.
  3. Pilih Rendering Settings, Material Upgrade, dan Readonly Material Converter.
  4. Selanjutnya, pilih Initialize and Convert, tunggu hingga selesai, dan contohnya akan siap untuk URP.

Cara membagi aset di project Unity Anda (Pemuatan Lambat)

Salah satu masalah utama yang disoroti developer saat menggunakan Unity adalah tetap berada di bawah persyaratan ukuran file individual dan persyaratan ukuran paket total.

Pemuatan lambat aset adalah pengoptimalan yang bagus yang dapat Anda lakukan untuk project Anda karena Anda dapat memuat aset, level, dan data sesuai kebutuhan. Tim sertifikasi kami dapat mengabaikan batasan ukuran file keseluruhan jika hal ini dilakukan dengan benar, karena game lengkap Anda tidak akan dimuat di awal, tetapi saat pengguna menjelajahi produk Anda.

Untuk membantu pemuatan yang tepat, Unity memiliki beberapa cara untuk membagi aset Anda, memverifikasi bahwa setiap grup aset Anda berada di bawah batas ukuran dan Anda memuat konten dari waktu ke waktu. Sebaiknya gunakan Addressables atau Asset Bundles.

Addressables

Addressables memungkinkan Anda mengidentifikasi berbagai file yang harus dimuat bersama dan Unity akan menangani sebagian besar pengemasan untuk Anda. Unity juga menyediakan beberapa alat untuk mengelola ukuran file dan membantu memastikan Anda tidak menduplikasi aset.

Untuk menggunakan Addressables, Anda harus mengimpor paket Addressables melalui Package Manager di Unity, lalu menandai aset Anda ke dalam Addressable Groups. Detail selengkapnya dapat ditemukan melalui dokumentasi Unity.

Asset Bundles

Asset Bundles berguna karena Anda dapat membagi project dan memuat elemen dengan cepat. Hal ini berguna untuk DLC, paket level, karakter baru, dan lainnya. Asset Bundles sangat bagus untuk pemuatan dan penggabungan konten yang dikelola sendiri. Hal ini dapat digunakan dengan menandai aset Anda ke dalam paket tertentu, lalu memuat paket sesuai kebutuhan. Detail selengkapnya dapat ditemukan dalam dokumentasi Asset Bundle Unity.

Lihat referensi YT Playables API lengkap.