Wrapper Unity YouTube Playables Eksperimental

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

Paket Unity dapat didownload dari repositori contoh Ruang Game kami.

Penggunaan

  1. Pastikan Platform project Unity Anda disetel ke WebGL. Setelan ini dapat ditemukan di Build Settings.
  2. Gunakan WebGLTemplate untuk membangun game Anda untuk web, atau ikuti bagian Gunakan file index.html Anda sendiri dan pastikan Anda telah menyiapkan dan melakukan inisialisasi web SDK 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 bagian Menggunakan file index.html Anda sendiri 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 dengan yang ada di paket GoogleYTGameWrapper dan contoh yang menunjukkan cara menggunakan YouTube Playables SDK di C#.
  4. PENTING: Di adegan 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 adegan, pastikan untuk menambahkan DontDestroyOnLoad ke skrip YTGameWrapper.cs (catatan: versi baru skrip memiliki tombol DontDestroyOnSceneChange yang aktif secara default). Tindakan ini akan memastikan skrip dan GameObject tetap ada di sepanjang game Anda.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Komponen YTGameWrapper.cs dan GameObject YTGameWrapper digunakan untuk terhubung ke YouTube Playables SDK. Gunakan kredensial ini untuk terhubung ke YouTube. Menggunakan Skrip untuk menemukan objek dan komponen atau menambahkan objek dan komponen ini 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 diberikan, Anda harus menambahkan dua baris kode ke skrip pembuatan index.html Unity.

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

    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#, bukan daftar lengkap API yang tersedia. Untuk daftar lengkap API yang tersedia, lihat 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 contoh cara game 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 contoh cara menggunakan saveData, 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 contoh cara menggunakan loadData, 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 hasil terbaik, lakukan panggilan ini selama jeda 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.
    }
}

Cara menggunakan Template WebGL contoh YouTube

Kecuali jika Anda memiliki project Unity yang sangat berat, file .wasm dan .data yang Anda buat harus berada di bawah batas ukuran file masing-masing. Jika demikian, tidak ada kompresi tambahan yang harus dilakukan di pihak Anda untuk file ini karena file tersebut akan otomatis dikompresi saat pengiriman file yang Dapat Dimainkan. 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 yang dapat diputar 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. Bangun untuk WebGL di jendela Build Settings, lalu lanjutkan ke langkah 7 atau 5 berdasarkan kebutuhan project Anda.
  5. Hanya ikuti langkah 5 & 6 jika kompresi digunakan: Setelah project Anda di-build, buka lokasi folder build Anda dan buka folder Build. Temukan file .wasm atau .data project Anda yang perlu dikompresi agar sesuai dengan batas ukuran file masing-masing dan zip file tersebut. Pastikan untuk menghapus file .wasm/.data asli yang dikompresi karena Anda akan mengirimkan file *.wasm.zip dan *.data.zip.
    • 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 telah melakukan langkah 5: Perbarui file index.html yang dibuat dari YTGameWrapperTemplate untuk memuat file yang di-zip dan mendekompresinya.
    • Di dekat akhir file index.html, Anda akan menemukan Path 1 dan hapus tanda komentar pada baris berikut InitUnitySection();.
    • Di dekat akhir file index.html, Anda akan menemukan Path 2 dan hapus tanda komentar pada baris berikut loadResources(InitUnitySection);.
  7. Saat mengirimkan project untuk mendapatkan Sertifikasi, Anda harus mengirim semua file yang dibuat dari Unity ke lokasi build dari Langkah 4. Jika langkah 5 + 6 telah diikuti, sertakan file ini juga.

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

Salah satu kemajuan terbaru dengan Unity versi yang lebih baru adalah bahwa Unity 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 sampel akan siap untuk URP.

Cara memecah aset dalam project Unity Anda (Lazy Loading)

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 aset secara lambat adalah pengoptimalan yang sangat baik yang dapat Anda lakukan untuk proyek Anda karena Anda dapat memuat aset, level, dan data sesuai kebutuhan. Tim sertifikasi kami dapat mengabaikan batasan ukuran file secara 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 sejumlah cara untuk memisahkan 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 memberi tag pada aset ke dalam Addressable Groups. Detail selengkapnya dapat ditemukan melalui dokumentasi Unity.

Bundle Aset

Paket Aset berguna karena Anda dapat membagi project dan memuat elemen secara langsung. Hal ini berguna untuk DLC, paket level, karakter baru, dan lainnya. Paket Aset sangat cocok untuk pemuatan dan penggabungan konten yang dikelola sendiri. Hal ini dapat digunakan dengan memberi tag pada aset ke dalam paket tertentu, lalu memuat paket sesuai kebutuhan Anda. Detail selengkapnya dapat ditemukan dalam dokumentasi Paket Aset Unity.

Lihat referensi YT Playables API selengkapnya.