ผสานรวมการนำส่งเนื้อหา (Unity)

เกม Unity เมื่อผสานรวมการนำส่งเนื้อหา จะเข้าถึง Asset Pack ได้โดยใช้ Addressables หรือ AssetBundles สิ่งที่ระบุได้คือ โซลูชันการนำส่งเนื้อหาล่าสุดที่แนะนำสำหรับเกมที่สร้างด้วย Unity 2019.4 ขึ้นไป ในขณะที่ AssetBundles จะรองรับ Asset Pack ใน Unity 2017.4 และ 2018.4

Unity Addressables

เกมที่สร้างด้วย Unity 2019.4 ขึ้นไปควรใช้ ที่อยู่ สำหรับการนําส่งเนื้อหาบน Android Unity ให้บริการ API การนำส่งเนื้อหา Play (PAD) ในการจัดการ Asset Pack ของ Android โดยใช้ Addressables สำหรับข้อมูลเกี่ยวกับการใช้ ข้อมูลที่อยู่ โปรดดูข้อมูลต่อไปนี้

ใช้ไฟล์ AssetBundle

เกมที่สร้างด้วย Unity 2017.4 และ 2018.4 สามารถใช้ไฟล์ AssetBundle สำหรับเนื้อหาได้ ใน Android เอกภาพ AssetBundle จะมีเนื้อหาที่ต่อเนื่องกันซึ่งเครื่องมือ Unity สามารถโหลดได้ในขณะที่ ที่กำลังทำงาน ไฟล์เหล่านี้เป็นไฟล์เฉพาะแพลตฟอร์ม (เช่น สร้างขึ้นสำหรับ Android) และใช้ร่วมกับ Asset Pack ได้ โดยทั่วไปแล้ว ไฟล์ AssetBundle 1 ไฟล์รวมอยู่ใน Asset Pack เดียวพร้อมกับแพ็กเก็ต โดยใช้ชื่อเดียวกับ AssetBundle หากคุณต้องการความยืดหยุ่นมากขึ้นในการสร้าง Asset Pack กำหนดค่า Asset Pack โดยใช้ API

ใช้ Play Asset Delivery สำหรับ Unity ขณะรันไทม์ เพื่อเรียกข้อมูล AssetBundle ที่อยู่ใน Asset Pack ก็ได้

สิ่งที่ต้องมีก่อน

  1. ดาวน์โหลดปลั๊กอิน Play Asset Delivery Unity รุ่นล่าสุดจากแพ็กเกจ Google สำหรับ Unity

  2. สร้าง AssetBundles ใน Unity

กำหนดค่า AssetBundles โดยใช้ UI

  1. กำหนดค่า AssetBundle แต่ละรายการใน Asset Pack ดังนี้

    1. เลือก Google > Android App Bundle > การตั้งค่าการนำส่งเนื้อหา
    2. หากต้องการเลือกโฟลเดอร์ที่มีไฟล์ AssetBundle โดยตรง ให้คลิกเพิ่ม โฟลเดอร์

  2. ในแต่ละแพ็กเกจ ให้เปลี่ยนโหมดการนำส่งเป็นเวลาติดตั้งและรวดเร็ว ติดตามหรือออนดีมานด์ แก้ไขข้อผิดพลาดหรือทรัพยากร Dependency แล้วปิด

  3. เลือก Google > สร้าง Android App Bundle เพื่อสร้าง App Bundle

  4. (ไม่บังคับ) กำหนดค่า App Bundle ให้รองรับพื้นผิวต่างๆ รูปแบบการบีบอัด

กำหนดค่า Asset Pack โดยใช้ API

คุณสามารถกำหนดค่าการนำส่งเนื้อหาผ่านสคริปต์ของเครื่องมือแก้ไขที่ทำงานเป็นส่วนหนึ่งของได้ ของระบบบิลด์อัตโนมัติ

ใช้เมนู AssetPackConfig เพื่อกำหนดว่าจะรวมเนื้อหาใดไว้ในบิลด์ Android App Bundle เป็นวิธีการแสดงโฆษณาของเนื้อหา Asset Pack เหล่านี้ไม่จำเป็นต้องมี AssetBundle

public void ConfigureAssetPacks {
   // Creates an AssetPackConfig with a single asset pack, named
   // examplePackName, containing all the files in path/to/exampleFolder.
   var assetPackConfig = new AssetPackConfig();
   assetPackConfig.AddAssetsFolder("examplePackName",
                                   "path/to/exampleFolder",
                                   AssetPackDeliveryMode.OnDemand);

   // Configures the build system to use the newly created assetPackConfig when
   // calling Google > Build and Run or Google > Build Android App Bundle.
   AssetPackConfigSerializer.SaveConfig(assetPackConfig);

   // Alternatively, use BundleTool.BuildBundle to build an App Bundle from script.
   BuildBundle(new buildPlayerOptions(), assetPackConfig);
}

คุณยังสามารถใช้ BuildBundle ในคลาส Bundletool เพื่อสร้าง Android App Bundle ที่มีเนื้อหา แพ็กที่มอบให้ ตัวเลือกบิลด์เพลเยอร์ และ AssetPackConfig

สำหรับบทแนะนำแบบมีคำแนะนำ โปรดดูที่ การใช้ Play Asset Delivery ใน Unity Games Codelab

ผสานรวมกับ Play Asset Delivery Unity API

Play Asset Delivery Unity API มีฟังก์ชันสำหรับการขอ Asset Pack การจัดการการดาวน์โหลด และ การเข้าถึงชิ้นงาน อย่าลืมเพิ่มปลั๊กอิน Unity ลงในโปรเจ็กต์ก่อน

ฟังก์ชันที่คุณใช้ใน API จะขึ้นอยู่กับวิธีสร้าง Asset Pack ก็ได้

หากคุณ สร้าง Asset Pack โดยใช้ UI ของปลั๊กอิน เลือก Asset Pack ที่กำหนดค่าปลั๊กอิน

หากคุณ สร้าง Asset Pack โดยใช้ API (หรือ UI ของปลั๊กอิน) เลือก Asset Pack ที่กำหนดค่า API

API จะคล้ายคลึงกัน ไม่ว่าคุณจะต้องการส่งข้อมูลประเภทไหนของ Asset Pack ก็ตาม สิทธิ์การเข้าถึง ขั้นตอนเหล่านี้จะแสดงในโฟลว์ชาร์ตต่อไปนี้

แผนภาพโฟลว์ของ Asset Pack สำหรับ API

รูปที่ 1 แผนภาพสำหรับการเข้าถึง Asset Pack

ดึงข้อมูล Asset Pack

นำเข้า ไลบรารีการนำส่งเนื้อหา Play และเรียกใช้ RetrieveAssetPackAsync() วิธีดาวน์โหลด Asset Pack หากยังไม่มีเวอร์ชันล่าสุด ที่ใช้ได้ในดิสก์

using Google.Play.AssetDelivery;

// After download, the assets and/or AssetBundles contained in the asset pack
// are not loaded into memory.
PlayAssetPackRequest request = PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName);

การนำส่งเวลาติดตั้ง

Asset Pack ที่กำหนดค่าเป็น install-time จะพร้อมใช้งานในแอปทันที แต่คุณต้องโหลดเนื้อหาลงในหน่วยความจำ โปรดดู โหลดเนื้อหาลงในหน่วยความจำ

นำส่งสินค้าตามคำสั่งซื้ออย่างรวดเร็ว

ส่วนเหล่านี้มีผลกับ Asset Pack fast-follow และ on-demand

ตรวจสอบสถานะ

Asset Pack แต่ละรายการจะเก็บไว้ในโฟลเดอร์แยกกันในที่จัดเก็บข้อมูลภายในของแอป ใช้เมนู isDone() ในการพิจารณาว่า Asset Pack ได้รับการดาวน์โหลดแล้วหรือไม่และ พร้อมใช้งาน หรือเกิดข้อผิดพลาด

ตรวจสอบการดาวน์โหลด

ค้นหาข้อมูล PlayAssetPackRequest ในการตรวจสอบ สถานะ ของคำขอ:

// Download progress of request, between 0.0f and 1.0f. The value will always be
// 1.0 for assets delivered as install-time.
// NOTE: A value of 1.0 does not mean that the request has completed, only that
// the DOWNLOADING stage is finished.
float progress = request.DownloadProgress;

// Returns the status of the retrieval request.
// If the request completed successfully, this value should be AssetDeliveryStatus.Available.
// If an error occurred, this value should be AssetDeliveryStatus.Failed.

AssetDelivery status = request.Status;
switch(status) {
    case AssetDeliveryStatus.Pending:
        // Asset pack download is pending - N/A for install-time assets.
    case AssetDeliveryStatus.Retrieving:
        // Asset pack is being downloaded and transferred to app storage.
        // N/A for install-time assets.
    case AssetDeliveryStatus.Available:
        // Asset pack is downloaded on disk but NOT loaded into memory.
        // For PlayAssetPackRequest(), this indicates that the request is complete.
    case AssetDeliveryStatus.Failed:
        // Asset pack retrieval failed.
    case AssetDeliveryStatus.WaitingForWifi:
        // Asset pack retrieval paused until either the device connects via Wi-Fi,
        // or the user accepts the PlayAssetDelivery.ShowConfirmationDialog dialog.
    case AssetDeliveryStatus.RequiresUserConfirmation:
        // Asset pack retrieval paused until the user accepts the
        // PlayAssetDelivery.ShowConfirmationDialog dialog.
    default:
        break;
}

// Returns true if status is AssetDeliveryStatus.Available or AssetDeliveryStatus.Failed.
bool done = request.IsDone;

// If AssetDeliveryStatus.Failed, find more info about the error.
AssetDeliveryErrorCode error = request.Error;

การดาวน์โหลดขนาดใหญ่

Asset Pack ที่มีขนาดใหญ่กว่า 200 MB จะดาวน์โหลดได้โดยอัตโนมัติ เฉพาะในกรณีที่อุปกรณ์ เชื่อมต่อกับ Wi-Fi อยู่ หากผู้ใช้ไม่ได้ใช้ Wi-Fi ระบบจะดำเนินการPlayAssetPackRequest ตั้งค่าสถานะเป็น AssetDeliveryStatus.WaitingForWifi และการดาวน์โหลดจะหยุดชั่วคราว ในกรณีนี้ ให้รอจนกว่าอุปกรณ์จะเชื่อมต่อ ผ่าน Wi-Fi, ดาวน์โหลดต่อ หรือแจ้งให้ผู้ใช้อนุมัติให้ดาวน์โหลด ผ่านการเชื่อมต่อเครือข่ายมือถือ

ต้องมีการยืนยันผู้ใช้

หากแพ็กมีสถานะ AssetDeliveryStatus.RequiresUserConfirmation ระบบจะดำเนินการ การดาวน์โหลดจะไม่ดำเนินการต่อจนกว่าผู้ใช้จะยอมรับกล่องโต้ตอบที่ปรากฏพร้อมกับ PlayAssetDelivery.ShowConfirmationDialog() สถานะนี้อาจเกิดขึ้นหากแอป Play ไม่รู้จัก โปรดทราบว่าการโทร PlayAssetDelivery.ShowConfirmationDialog() ในกรณีนี้ทำให้แอป มีการอัปเดต หลังจากอัปเดตแล้ว ให้ขอชิ้นงานอีกครั้ง

if(request.Status == AssetDeliveryStatus.RequiresUserConfirmation
   || request.Status == AssetDeliveryStatus.WaitingForWifi) {
    var userConfirmationOperation = PlayAssetDelivery.ShowConfirmationDialog();
    yield return userConfirmationOperation;

    switch(userConfirmationOperation.GetResult()) {
        case ConfirmationDialogResult.Unknown:
            // userConfirmationOperation finished with an error. Something went
            // wrong when displaying the prompt to the user, and they weren't
            // able to interact with the dialog.
        case ConfirmationDialogResult.Accepted:
            // User accepted the confirmation dialog--an update will start.
        case ConfirmationDialogResult.Declined:
            // User canceled or declined the dialog. It can be shown again.
        default:
            break;
    }
}

ยกเลิกคำขอ (ตามคำขอเท่านั้น)

หากต้องการยกเลิกคำขอก่อนที่จะมีการดาวน์โหลด Asset Pack ให้โทร เวลา AttemptCancel() ในออบเจ็กต์ PlayAssetPackRequest

// Will only attempt if the status is Pending, Retrieving, or Available; otherwise
// it will be a no-op.
request.AttemptCancel();

// Check to see if the request was successful by checking if the error code is Canceled.
if(request.Error == AssetDeliveryErrorCode.Canceled) {
    // Request was successfully canceled.
}

โหลดเนื้อหาลงในหน่วยความจำ

เมื่อคำขอเสร็จสมบูรณ์แล้ว ให้ใช้ฟังก์ชันใดฟังก์ชันหนึ่งต่อไปนี้เพื่อโหลดเนื้อหาไปยัง หน่วยความจำ:

  • ใช้ PlayAssetPackRequest.GetAssetLocation() เพื่อรับ AssetLocation ออบเจ็กต์ เพื่อระบุเส้นทาง ออฟเซ็ต และขนาดของเนื้อหาเพื่อให้ โหลดจากดิสก์ได้
  • หากเนื้อหาเป็น AssetBundle คุณสามารถใช้วิธีที่สะดวก PlayAssetPackRequest.LoadAssetBundleAsync(assetPath) เส้นทางชิ้นงานที่คุณส่งควรสอดคล้องกับเส้นทางไปยัง AssetBundle จากภายใน Asset Pack ได้ การดำเนินการนี้จะแสดงผล AssetBundleCreateRequest

ขอ Asset Pack แบบไม่พร้อมกัน

ในกรณีส่วนใหญ่ คุณควรใช้ Coroutines ให้กับ ขอ Asset Pack แบบไม่พร้อมกันและตรวจสอบความคืบหน้าตามที่แสดงใน ดังต่อไปนี้:

private IEnumerator LoadAssetPackCoroutine(string assetPackName) {

    PlayAssetPackRequest request =
        PlayAssetDelivery.RetrieveAssetPackAsync(assetPackName);

    while (!request.IsDone) {
        if(request.Status == AssetDeliveryStatus.WaitingForWifi) {
            var userConfirmationOperation = PlayAssetDelivery.ShowConfirmationDialog();

            // Wait for confirmation dialog action.
            yield return userConfirmationOperation;

            if((userConfirmationOperation.Error != AssetDeliveryErrorCode.NoError) ||
               (userConfirmationOperation.GetResult() != ConfirmationDialogResult.Accepted)) {
                // The user did not accept the confirmation. Handle as needed.
            }

            // Wait for Wi-Fi connection OR confirmation dialog acceptance before moving on.
            yield return new WaitUntil(() => request.Status != AssetDeliveryStatus.WaitingForWifi);
        }

        // Use request.DownloadProgress to track download progress.
        // Use request.Status to track the status of request.

        yield return null;
    }

    if (request.Error != AssetDeliveryErrorCode.NoError) {
        // There was an error retrieving the pack. For error codes NetworkError
        // and InsufficientStorage, you may prompt the user to check their
        // connection settings or check their storage space, respectively, then
        // try again.
        yield return null;
    }

    // Request was successful. Load the asset pack into memory.
    AssetBundleCreateRequest assetBundleCreateRequest = request.LoadAssetBundleAsync(path/to/exampleBundle);
    yield return assetBundleCreateRequest;
    AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาด โปรดดูรายการ รหัสข้อผิดพลาด

เมธอด API ของ Play Core อื่นๆ

เมธอด API เพิ่มเติมบางส่วนที่คุณอาจต้องการใช้ในแอปมีดังนี้

ดึงข้อมูล Asset Pack หลายรายการ

หากต้องการเรียกข้อมูล Asset Pack หลายรายการพร้อมกัน ให้ใช้ฟังก์ชันต่อไปนี้

// assetPackNames is an array of strings corresponding to asset packs.
PlayAssetPackBatchRequest batchRequest = PlayAssetDelivery.RetrieveAssetPackBatchAsync(<IListstring> assetPackNames);

ตรวจสอบสถานะของคำขอแต่ละรายการโดยตรวจสอบDictionaryของรัฐต่างๆ ดังนี้

// Dictionary of AssetPackStates, with the asset pack name as the key.
Dictionary<string, PlayAssetPackRequest> requests = batchRequest.Requests;

// Returns true if all requests are complete.
bool requestComplete = batchRequest.IsDone;

ตรวจสอบขนาดการดาวน์โหลด

ตรวจสอบขนาดของ Asset Pack โดยเรียกใช้ Google Play แบบไม่พร้อมกัน และตั้งค่า Method ของ Callback เมื่อการดำเนินการเสร็จสมบูรณ์:

public IEnumerator GetDownloadSize() {
   PlayAsyncOperation<long> getSizeOperation =
   PlayAssetDelivery.GetDownloadSize(assetPackName);

   yield return getSizeOperation;
   if(operation.Error != AssetDeliveryErrorCode.NoError) {
       // Error while retrieving download size.
    } else {
        // Download size is given in bytes.
        long downloadSize = operation.GetResult();
    }
}

นำ AssetBundles ออก

คุณนํา Asset Pack แบบรวดเร็วและออนดีมานด์ออกได้ ลงในหน่วยความจำ ทำการเรียกแบบไม่พร้อมกันต่อไปนี้และตั้งค่าการติดต่อกลับ ดำเนินการเมื่อเสร็จสมบูรณ์

PlayAsyncOperation<string> removeOperation = PlayAssetDelivery.RemoveAssetPack(assetBundleName);

removeOperation.Completed += (operation) =>
            {
                if(operation.Error != AssetDeliveryErrorCode.NoError) {
                    // Error while attempting to remove AssetBundles.
                } else {
                    // Files were deleted OR files did not exist to begin with.
                }
            };

ขั้นตอนถัดไป

ทดสอบการส่งเนื้อหาภายในเครื่องและจาก Google Play