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 SDK Chơi game trên YouTube trong Unity C#. Trình bao bọc này có một trình bổ trợ .jslib và một tệp C# để giúp bạn phát triển nhanh hơ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 tệp này trong dự án của mình.

Bạn có thể tải Gói Unity xuống từ kho lưu trữ mẫu Playables sample repo.

Cách sử dụng

  1. Xác minh rằng Nền tảng dự án Unity được đặt thành WebGL. Bạn có thể tìm thấy chế độ cài đặt này trong Build Settings (Cài đặt bản dựng).
  2. Bạn có thể 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 chạy SDK web trong tệp index.html của mình.
    • WebGLTemplate có thể được tìm thấy 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 bạn, bạn cần thêm hai dòng vào tập lệnh tạo Unity index.html. Hãy xem phần Sử dụng tệp index.html của riêng bạn để biết cách tích hợp.
  3. Mở dự á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 Chơi game trên YouTube SDK và 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ư trong gói GoogleYTGameWrapper và một mẫu cho biết cách sử dụng SDK Chơi game trên YouTube trong C#.
  4. QUAN TRỌNG: Trong cảnh chính, hãy tạo một gameobject 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 nối JS.
  5. QUAN TRỌNG: Thêm mã đã nhập YTGameWrapper.cs làm 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 chuyển DontDestroyOnSceneChange được 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.

    GameObject.DontDestroyOnLoad(this.gameObject);
    
  7. Thành phần YTGameWrapper.cs và GameObject YTGameWrapper được dùng để kết nối với SDK Chơi game trên YouTube. Hãy sử dụng các thành phần này để kết nối với YouTube. Bạn có thể sử dụng Tập lệnh để tìm đối tượng và thành phần hoặc thêm các thành phần này vào mã trò chơi theo cách thủ công thông qua Trình chỉnh sửa Unity.

  8. Xác minh rằng bạn đang tuân thủ các yêu cầu 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 cần thêm 2 dòng mã vào tập lệnh tạo Unity index.html.

Trước tiên, hãy thêm dòng này vào cùng một vị trí mà dự án của bạn thiết lập các biến cho vùng chứa Unity, canvas, 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 hiện có. Để xem danh sách đầy đủ các API hiện có, hãy tham khảo YouTube Playables SDK.

sendScore

Ví dụ này cho thấy 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ể nghe các sự kiện Pause đến từ YT Playables để tạm dừng công cụ của trò chơi 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 dữ liệu đó đế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 dữ liệu đó đế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 thực hiện lệnh gọi này trong thời gian nghỉ giữa trò chơi, chẳng hạn như ở cuối 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.
    }
}

requestRewardedAd

Đây là ví dụ về cách sử dụng requestRewardedAd. Lệnh này được dùng khi người dùng chọn xem Quảng cáo có tặng thưởng để đổi lấy phần thưởng trong trò chơi của bạn. Nếu có quảng cáo, người dùng sẽ thấy quảng cáo đó.

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

Cách sử dụng Mẫu WebGL 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 đúng như vậy, bạn không cầ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 Playable. 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 ~25 MiB sẽ nén thành ~7 MiB.

Nếu vì lý do nào đó mà các tệp của bạn vượt quá giới hạn kích thước tệp riêng lẻ tối đa, thì tốt nhất là bạn nên sử dụng tính năng nén ZIP để xác minh rằng các tệp đó phù hợp với giới hạn này. Tính năng nén Playable 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 bạn chưa nhập YTGameWrapper.csUnityYTGameSDKLib.jslib, bạn cũng nên nhập các tệp đó.
  2. Đặt Mẫu WebGL để sử dụng YTGameWrapperTemplate. Bạn có thể tìm thấy chế độ cài đặt này trong Edit (Chỉnh sửa) -> Project settings (Cài đặt dự án) -> Player (Trình phát) -> thẻ WebGL -> phần Resolution and Presentation (Độ phân giải và bản trình bày).
    • Lưu ý: Chiều rộng và chiều cao của Canvas mặc định được đặt thành 100% trong mẫu, vì vậy, các chế độ cài đặt Unity này sẽ không điều chỉnh bất kỳ thông tin nào.
  3. Đảm bảo rằng Compression Format (Định dạng nén) được đặt thành Tắt. Bạn có thể tìm thấy chế độ cài đặt này trong Project settings (Cài đặt dự án) -> Player (Trình phát) -> thẻ WebGL -> phần Publishing Settings (Cài đặt xuất bản).
  4. Tạo bản dựng cho WebGL trong cửa sổ Build Settings (Cài đặt bản dựng), sau đó chuyển đến bước 7 hoặc 5 dựa trên nhu cầu của dự án.
  5. Chỉ làm theo các bước 5 và 6 nếu bạn sử dụng tính năng nén: Sau khi tạo dự án, hãy chuyển đến vị trí thư mục bản dựng và mở thư mục Build. Tìm các tệp .wasm hoặc .data của dự án 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. Hã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 bạn đang sử dụng máy Mac, bạn có thể nhấp chuột phải vào tệp rồi chọn "Compress *" (Nén *). Trên PC, bạn có thể nhấp chuột phải vào tệp rồi chọn "Compress to ZIP file" (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ủa bạn để được Chứng nhận, bạn 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 từ Bước 4. Nếu bạn đã làm theo các bước 5 và 6, hãy thêm cả các 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 của các phiên bản Unity mới hơn là 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 hiện có.
  2. Chuyển đến cửa sổ Render Pipeline Converter (Trình chuyển đổi quy trình kết xuất): Window (Cửa sổ) -> Rendering (Kết xuất) -> Render Pipeline Converter (Trình chuyển đổi quy trình kết xuất).
  3. Chọn Rendering Settings (Cài đặt kết xuất), Material Upgrade (Nâng cấp thành phần) và Readonly Material Converter (Trình chuyển đổi thành phần chỉ đọc).
  4. Tiếp theo, hãy chọn Initialize and Convert (Khởi chạy và chuyển đổi), đợi quá trình này hoàn tất và mẫu sẽ sẵn sàng cho URP.

Cách chia nhỏ thành phần trong dự án Unity (Tải từng phần)

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à tuân thủ các yêu cầu về kích thước tệp riêng lẻ và tổng kích thước gói.

Tính năng tải từng phần thành phần 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 thành phầ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 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à sẽ tải khi người dùng di chuyển trong sản phẩm của bạn.

Để giúp tải đúng cách, Unity có một số cách để chia nhỏ thành phầ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 Addressable hoặc Gói thành phần.

Addressable

Addressable 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 việc đó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 thành phần.

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

Gói thành phần

Gói thành phần rất hữu ích vì bạn có thể chia nhỏ dự án và tải các phần tử ngay lập tức. Các gói này hữu ích cho Nội dung có thể tải xuống (DLC), gói cấp độ, nhân vật mới, v.v. Gói thành phầ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 gói này bằng cách gắn thẻ thành phần của bạn vào các gói cụ thể, sau đó tải các gói khi cần. Bạn có thể tìm thêm thông tin chi tiết trong tài liệu về Gói thành phần của Unity.

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