Trình bao bọc Unity có thể phát thử nghiệm trên YouTube

Với trình bao bọc này, bạn có thể truy cập vào YouTube Playables SDK trong Unity C#. Trình bao bọc có một trình bổ trợ .jslib và một tệp C# để giúp tăng tốc quá trình phát triển của bạn. Ngoài ra, còn có một dự án mẫu cho biết cách bạn có thể sử dụng các dự án này trong dự án của mình.

Bạn có thể tải Unity Packages xuống từ kho lưu trữ mẫu Playables của chúng tôi.

Cách sử dụng

  1. Xác minh rằng Nền tảng dự án Unity của bạn được đặt thành WebGL. Bạn có thể tìm thấy chế độ cài đặt này trong phần Build Settings.
  2. Sử dụng WebGLTemplate để tạo trò chơi cho web hoặc làm theo phần Sử dụng tệp index.html của riêng bạn và xác minh rằng bạn đã thiết lập và khởi động SDK web trong tệp index.html.
    • Bạn có thể tìm thấy WebGLTemplate trong gói Google-WebGLTemplate-only.unitypackage hoặc GoogleYTGameWrapper-with-sample.unitypackage. Để thiết lập và sử dụng mẫu này, hãy làm theo các bước trong phần Mẫu WebGL.
    • Để sử dụng tệp Web và index.html của riêng mình, bạn sẽ cần thêm 2 dòng vào tập lệnh tạo index.html Unity. Hãy xem phần Sử dụng tệp index.html của riêng bạn để tích hợp.
  3. Mở dự án của bạn trong Unity, sau đó mở và nhập một trong hai gói vào dự án của bạn.
    • GoogleYTGameWrapper.unitypackage: Chứa trình bổ trợ JS để kết nối YouTube Playables SDK và một trình bao bọc C# để giúp kết nối trình bổ trợ này với sản phẩm của bạn.
    • GoogleYTGameWrapper-with-sample.unitypackage: Chứa nội dung tệp giống như nội dung trong gói GoogleYTGameWrapper và một mẫu cho biết cách sử dụng YouTube Playables SDK trong C#.
  4. QUAN TRỌNG: Trong cảnh chính, hãy tạo một đối tượng trò chơi mới và đặt tên là YTGameWrapper. Đối tượng trò chơi này được dùng để giao tiếp với cầu JS.
  5. QUAN TRỌNG: Thêm mã YTGameWrapper.cs đã nhập dưới dạng thành phần tập lệnh vào GameObject YTGameWrapper.
  6. Nếu dự án của bạn có nhiều cảnh, hãy nhớ thêm DontDestroyOnLoad vào tập lệnh YTGameWrapper.cs (lưu ý: các phiên bản mới của tập lệnh có nút bật/tắt DontDestroyOnSceneChange và nút này sẽ bật theo mặc định). Điều này sẽ đảm bảo tập lệnh và GameObject vẫn tồn tại trong suốt trò chơi của bạn.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Thành phần YTGameWrapper.cs và GameObject YTGameWrapper được dùng để kết nối với YouTube Playables SDK. Hãy dùng những thông tin này để kết nối với YouTube. Sử dụng Script để tìm đối tượng và thành phần hoặc thêm các đối tượng và thành phần này vào mã trò chơi theo cách thủ công thông qua Unity Editor.

  8. Kiểm tra để đảm bảo bạn tuân thủ các yêu cầu về kỹ thuật đối với dự án của mình.

Sử dụng tệp index.html của riêng bạn

Nếu không sử dụng ví dụ index.html được cung cấp, bạn sẽ cần thêm 2 dòng mã vào tập lệnh tạo index.html Unity.

Trước tiên, hãy thêm dòng này vào cùng vị trí mà dự án của bạn thiết lập các biến cho vùng chứa, canvas Unity, v.v.

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

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

    ...

Thứ hai, bên trong hàm createUnityInstance, hãy thêm dòng này.

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

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

    ...

Ví dụ

Phần này có một số ví dụ về cách sử dụng trình bao bọc C#, đây không phải là danh sách đầy đủ các API có sẵn. Để xem danh sách đầy đủ các API hiện có, hãy tham khảo YouTube Playables SDK.

sendScore

Ví dụ này minh hoạ cách triển khai sendScore(int points) trong 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

Đây là ví dụ về cách một trò chơi có thể theo dõi các sự kiện Pause đến từ YT Playables, để tạm dừng công cụ khi cần:

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

Đây là ví dụ về cách sử dụng saveData, gửi đến 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

Đây là ví dụ về cách sử dụng loadData, gửi đến 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

Đây là ví dụ về cách sử dụng requestInterstitialAd, cho biết đây là thời điểm thích hợp để hiển thị quảng cáo xen kẽ (nếu có). Để có kết quả tốt nhất, hãy gọi hàm này trong thời gian nghỉ giữa các lượt chơi, chẳng hạn như khi kết thúc một cấp độ.

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

Cách sử dụng WebGL Template mẫu của YouTube

Trừ phi bạn có một dự án Unity rất nặng, các tệp .wasm.data đã tạo của bạn phải nằm trong giới hạn kích thước tệp riêng lẻ của chúng tôi. Nếu bạn đang sử dụng phương thức này, bạn không nên nén thêm các tệp này vì chúng sẽ tự động được nén khi bạn gửi tệp có thể phát. Quá trình nén tự động này cũng sẽ xác minh rằng tệp .wasm của bạn phù hợp với yêu cầu về kích thước gói ban đầu. Ví dụ: tệp .wasm có kích thước khoảng 25 MiB sẽ được nén thành khoảng 7 MiB.

Nếu vì lý do nào đó mà tệp của bạn vượt quá giới hạn kích thước tối đa của từng tệp, thì tốt nhất bạn nên sử dụng phương pháp nén ZIP để xác minh rằng tệp nằm trong giới hạn này. Tính năng nén có thể phát sẽ không nén lại các tệp này.

Mẫu WebGL

  1. Làm theo hướng dẫn về gói Unity ở trên để thiết lập ban đầu. Hãy nhớ sử dụng Google-WebGLTemplate-only.unitypackage hoặc GoogleYTGameWrapper-with-sample.unitypackage và nhập tất cả các tệp trong thư mục WebGLTemplates/YTGameWrapperTemplate/.
    • Lưu ý: nếu chưa nhập YTGameWrapper.csUnityYTGameSDKLib.jslib, bạn cũng nên nhập những mã này.
  2. Đặt WebGL Template để sử dụng YTGameWrapperTemplate. Chế độ cài đặt này nằm trong phần Edit -> Project settings -> Player -> thẻ WebGL -> phần Resolution and Presentation.
    • Lưu ý: Chiều rộng và chiều cao mặc định của Canvas được đặt thành 100% trong mẫu, vì vậy, các chế độ cài đặt này của Unity sẽ không điều chỉnh bất cứ thứ gì.
  3. Đảm bảo bạn đã đặt Compression Format thành Đã tắt. Chế độ cài đặt này nằm trong phần Project settings -> Player -> thẻ WebGL -> mục Publishing Settings.
  4. Tạo cho WebGL trong cửa sổ Build Settings, sau đó chuyển đến bước 7 hoặc 5 tuỳ theo nhu cầu của dự án.
  5. Chỉ làm theo bước 5 và 6 nếu bạn sử dụng tính năng nén: Sau khi dự án được tạo, hãy chuyển đến vị trí thư mục bản dựng rồi mở thư mục Build. Tìm các tệp dự án .wasm hoặc .data cần nén để phù hợp với giới hạn kích thước tệp riêng lẻ và nén các tệp này. Nhớ xoá các tệp .wasm/.data gốc đã được nén vì bạn sẽ gửi các tệp *.wasm.zip*.data.zip thay thế.
    • Lưu ý: nếu đang dùng máy Mac, bạn có thể nhấp chuột phải vào tệp rồi chọn "Nén *". Trên máy tính, bạn có thể nhấp chuột phải vào tệp rồi chọn "Nén thành tệp ZIP".
  6. Chỉ làm theo nếu bạn đã thực hiện bước 5: Cập nhật tệp index.html được tạo từ YTGameWrapperTemplate để tải các tệp đã nén và giải nén các tệp đó.
    • Gần cuối tệp index.html, bạn sẽ thấy Path 1 và nhận xét dòng sau InitUnitySection();.
    • Gần cuối tệp index.html, bạn sẽ thấy Path 2 và nhận xét dòng sau loadResources(InitUnitySection);.
  7. Khi gửi dự án để được Chứng nhận, bạn sẽ cần gửi tất cả các tệp được tạo từ Unity đến vị trí bản dựng của bạn trong Bước 4. Nếu bạn đã làm theo bước 5 và 6, hãy thêm cả những tệp này.

Nâng cấp các mẫu được cung cấp để sử dụng Universal Render Pipeline (URP)

Một trong những tiến bộ mới nhất với các phiên bản Unity mới hơn là việc chúng sử dụng Universal Render Pipeline (URP). Để nâng cấp mẫu sao cho mọi thứ hiển thị chính xác.

  1. Bắt đầu bằng cách nhập gói GoogleYTGameWrapper-with-sample.unitypackage vào một dự án mới hoặc dự án hiện có.
  2. Chuyển đến cửa sổ Render Pipeline Converter: Window -> Rendering -> Render Pipeline Converter.
  3. Chọn Rendering Settings, Material UpgradeReadonly Material Converter.
  4. Tiếp theo, hãy chọn Initialize and Convert, đợi quá trình này hoàn tất và mẫu sẽ sẵn sàng cho URP.

Cách chia nhỏ các thành phần trong dự án Unity (Tải chậm)

Một trong những vấn đề chính mà nhà phát triển đã nêu bật khi sử dụng Unity là việc tuân thủ các yêu cầu về kích thước tệp riêng lẻ và yêu cầu về tổng kích thước gói.

Tải tài sản theo yêu cầu là một phương pháp tối ưu hoá tuyệt vời mà bạn có thể thực hiện cho dự án của mình vì bạn có thể tải tài sản, cấp độ và dữ liệu khi cần. Nhóm chứng nhận của chúng tôi có thể miễn các quy định hạn chế về kích thước tệp tổng thể nếu bạn thực hiện đúng cách, vì toàn bộ trò chơi của bạn sẽ không được tải trước mà chỉ tải khi người dùng điều hướng sản phẩm của bạn.

Để giúp tải đúng cách, Unity có một số cách để chia nhỏ các thành phần của bạn, xác minh rằng các nhóm thành phần riêng lẻ của bạn nằm trong giới hạn kích thước và bạn tải nội dung theo thời gian. Bạn nên sử dụng Addressables hoặc AssetBundles.

Addressable

Addressables cho phép bạn xác định các tệp khác nhau cần được tải cùng nhau và Unity sẽ xử lý hầu hết các hoạt động đóng gói cho bạn. Unity cũng cung cấp một số công cụ để quản lý kích thước tệp và giúp đảm bảo bạn không sao chép các thành phần.

Để sử dụng Addressables, bạn cần nhập gói Addressables thông qua Trình quản lý gói trong Unity, sau đó gắn thẻ tài sản vào Nhóm Addressables. Bạn có thể tìm thêm thông tin chi tiết thông qua tài liệu của Unity.

Gói tài sản

Asset Bundle rất hữu ích vì bạn có thể chia dự án của mình và tải các phần tử ngay lập tức. Những thông tin này rất hữu ích cho nội dung có thể tải xuống, gói cấp độ, nhân vật mới và nhiều nội dung khác. Gói tài sản rất phù hợp để tải và đóng gói nội dung tự quản lý. Bạn có thể sử dụng các nhóm này bằng cách gắn thẻ tài sản vào các gói cụ thể, sau đó tải các gói khi cần. Bạn có thể xem thêm thông tin chi tiết trong tài liệu về Gói tài sản của Unity.

Xem tài liệu tham khảo đầy đủ về YT Playables API.