Asset Bundle ใน Unity 5 by

31
Jul
0

จากบทความที่แล้ว  เป็น Asset Bundle ใน Unity 4 มาวันนี้ Asset Bundle ได้ปรับรูปแบบวิธีการใช้งานแล้ว ผมจึงมา update วิธีใช้งานกันสักหน่อย

จากเดิมเราต้องเขียน Code ขึ้นมาใช้งานวนลูปหา file ที่ต้องการ ค่อนข้างยุ่งยาก และจะมีปัญหากรณีมี Bundle ตัวหนึ่งที่มี dependency เป็น asset ตัวเดียวกันก็อาจทำให้ต้องโหลด asset ตัวนั้นมาซ้ำกันได้ เช่น Bundle A มีรูปตัวละคร A ที่ต้องใช้ Background รูปหนึ่ง และ Bundle B มีรูปตัวละคร B ที่ต้องใช้ Background ตัวเดียวกัน แต่เดิมเพื่อตัดปัญหาความยุ่งยากเราอาจต้องใส่ Background ตัวนี้เข้าไปทั้งสอง Bundle แต่ถ้าเป็น Unity 5 จะไม่เป็นอย่างนั้นแล้วโดยเราสามารถระบุว่าอยากให้ไฟล์ไหนอยู่ใน Bundle อะไรแยกหมวดหมู่ได้ตั้งแต่อยู่ใน Editor ยังไม่ต้องเขียน Code เลย และในเคสนี้เราสามารถแบ่งเป็นสาม bundle คือ Bundle A, Bundle B, Bundle Background ได้อย่างสะดวก โดย Unity จะพิจารณาเอาเองว่าถ้าหนึ่งใน Bundle ที่เราสร้างมี dependency กับ Bundle อื่นๆ มันจะใส่ Bundle นั้นๆ เข้าไปซ้ำกันภายใน Bundle อื่นๆ อีกรอบ ส่งผลให้เราจัดการ dependency ได้ง่ายกว่าเดิมมาก เรามาดูขั้นตอนการสร้าง Bundle กันดีกว่า

1

  1. คลิกเลือก Resource ที่เราต้องการจะสร้าง Bundle สามารถ Multi Select ได้ตามรูป
  2. คลิกที่ช่อง None ใน Inspector ทางข้างล่าง ช่อง preview ตามรูป
    2 3
    4 5
  3. กด New และตั้งชื่อตามต้องการ โดยสามารถตั้งให้อยู่ใน directory ก็ได้เช่น crystal/form5 หรือ win เฉยๆ ก็จะไม่อยู่ภายใต้ folder ใดๆ
  4. สร้าง Folder Editor ขึ้นมา และสร้างไฟล์ C# เป็น Assets/Editor/AssetBundle.cs
  5. ระบุเนื้อหาภายใน Code เป็นดังนี้

    using UnityEngine;
    using UnityEditor;
    public class AssetBundle {
    [MenuItem("Assets/Build AssetBundle")]
    static void ExportResource () {
    BuildPipeline.BuildAssetBundles("bundle", BuildAssetBundleOptions.None, BuildTarget.Android); // เปลี่ยน Android เป็น Platform อื่นได้ตามใจชอบครับ
    }
    }
  6. สร้าง Folder ชื่อว่า “bundle” โดยอยู่ที่ folder project เลย (นอก Assets) เอาไว้เป็นที่เก็บไฟล์ bundle ที่สร้างจากข้อ 5 (parameter ตัวแรกนั่นแหละ สามารถตั้งเป็นชื่ออื่นแทนได้)
  7. จะมีเมนู “Build AssetBundle” ปรากฎภายใต้เมนู Assets ก็กดสร้างซะเลย
    6
  8. จะได้ผลลัพธ์ดังรูป
    7
  9. สำหรับ .manifest ลองเปิดไฟล์ win.manifest ด้วย Text Editor ใดๆ ก็จะพบดังนี้

    ManifestFileVersion: 0
    CRC: 2678385196
    Hashes:
    AssetFileHash:
    serializedVersion: 2
    Hash: 199d6df2d4882a014033858fb5748467
    TypeTreeHash:
    serializedVersion: 2
    Hash: 75957c18d05791510cbdd301a328d69f
    HashAppended: 0
    ClassTypes:
    - Class: 28
    Script: {instanceID: 0}
    - Class: 213
    Script: {instanceID: 0}
    Assets:
    - Assets/crystal_5_water/win_1.png
    Dependencies: []
  10. ตรงนี้อธิบายได้ดังนี้
    • ManifestFileVersion – เป็นเลขเวอร์ชั่น จะค่อยๆ ปรับขึ้นตามจำนวนการแก้ไขของเรา ตรงนี้ดีกว่า Unity4 มากๆ เพราะไฟล์ที่ไม่มีการเปลี่ยนแปลง Unity จะรู้โดยอัตโนมัติและไม่สร้างไฟล์ซ้ำ ทำให้ประหยัดเวลาสร้างขึ้นเยอะ
    • CRC – ใช้อ้างอิงเวลา load bundle หากมีการแก้ไขเลขนี้ ตัว unity จะสั่งโหลดใหม่จาก server ให้เอง หากไม่แก้ไขก็จะ load จาก cache ในเครื่อง
    • Hash (ดูที่ AssetFileHash ตัวเดียวพอ) – เลข Hash คล้ายๆ CRC ที่ใช้ตอน load bundle เพื่อว่ามี update ไหม แต่ต่างตรงที่สามารถกำหนดให้ไฟล์เวอร์ชั่น SD และ HD มี Hash เดียวกันได้เพื่อความสะดวกด้วยการกำหนดชื่อไฟล์ SD และ HD ให้เป็นชื่อเดียวกันในช่่องขวาของชื่อ Bundle
    • ClassTypes – อันนี้ไม่แน่ใจว่าคือไรครับ
    • Assets – ระบุว่า Bundle ตัวนี้มีไฟล์อะไรอยู่ด้านในบ้าง
    • Dependencies – Bundle ตัวนี้ต้องใช้คู่กับ Bundle ตัวอื่นหรือไม่

จบแต่เพียงเท่านี้ ขอให้ทำเกมให้สนุกนะครับ :)

[Unity3D] Asset Bundle คืออะไร? by

31
Jan
1

Screenshot_2015-01-31-13-35-02

ปกติเราเคยเล่นเกม แล้วเห็นเกมอื่นเขาสั่ง Download Content มาเพิ่มตอนเข้าเกมครั้งแรกไหม? แล้วทำไมเขาถึงไม่รวมเข้าไปให้ดาวน์โหลดตั้งแต่อยู่ใน Store เลยล่ะ? ทำไมต้องแยกให้ผู้เล่นรอโหลดสองรอบ? จริงๆ แล้วส่วนที่ Download เพิ่มก็คือ Asset Bundle นี่เองซึ่งเป็น Content เพิ่มเติมของเกมเช่น ตัวละครใหม่ ไอเท็มใหม่ ด่านใหม่ สำหรับสาเหตุที่จำเป็นต้องใช้ asset bundle คือ

  1. Google Play มีการจำกัดขนาดไฟล์ apk ที่จะให้เอาขึ้น Store ได้ 50 MB และส่วนที่เหลือต้องแยก expansion file ส่วน ios จะจำกัดที่ตัว .app ไม่เกิน 60MB ซึ่งจะทำให้ flow การทำงานไม่เหมือน ios และ android ไม่เหมือนกัน การใช้ Asset Bundle จะมาช่วยจัดการความต่างตรงนี้ได้
  2. เมื่อเรา update เกมเพื่อแก้ไข bug แต่ content รูปภาพต่างๆ ยังเหมือนเดิม ผู้เล่นจะต้อง download ใหม่แค่เพียงตัว app ไม่ต้อง Download content ใหม่ทั้งหมด เพียงเพื่อแก้ไขข้อผิดพลาดเล็กๆ น้อยๆ จาก 500 MB(app รวม content model 3 มิติ รูปภาพ) ลดเหลือ 50 MB (ตัว app อย่างเดียว) จะเป็นจุดต่างอย่างมาก
  3. สามารถเพิ่ม content ใหม่ๆ ได้โดยไม่ต้องเอาขึ้น app store/google play store ซึ่งปกติเวลา approve ของ app store จะเฉลี่ยที่ 7 วัน ทำให้ไม่ต้องรอเวลาตรงนี้ถึงจะปล่อย patch update เกมด่านใหม่ๆ ได้ เพิ่มความสะดวกเป็นอย่างมาก

จะเห็นได้ว่ามีประโยชน์มากจริงๆ ดังนั้นเรามาดูกันว่าจะสร้าง Asset Bundle มาใช้งานได้อย่างไร


// C# Example
// Builds an asset bundle from the selected objects in the project view.
// Once compiled go to "Menu" -> "Assets" and select one of the choices
// to build the Asset Bundle
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
   [MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]
   static void ExportResource () {
      // Bring up save panel
      string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
      if (path.Length != 0) {
         // Build the resource file from the active selection.
         Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
         BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
                      BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildAssetBundleOptions.CollectDependencies , BuildTarget.Android);
         Selection.objects = selection;
      }
   }
   [MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")]
   static void ExportResourceNoTrack () {
      // Bring up save panel
      string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
      if (path.Length != 0) {
         // Build the resource file from the active selection.
         BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path, BuildAssetBundleOptions.CollectDependencies , BuildTarget.Android);
      }
   }
}

ให้เรา Copy Code ข้างบนไปเซพไฟล์ใหม่ชื่อ AssetBundleCreator.cs (หรือชื่ออื่นก็ได้) แล้วสร้าง Folder ใหม่ใน Folder Assets ใน project ของเราชื่อว่า Editor นำไฟล์ AssetBundleCreator.cs ไปใส่ด้านใน จากนั้น ให้คลิกเลือก Resource รูปภาพที่จะนำมาสร้างใน tab project ด้านล่าง ต่อด้วยคลิกที่เมนู Asset จะเห็นดังภาพ

AssetBundleMenuOptions

1. Build AssetBundle From Selection – Track dependencies คือสร้าง asset bundle โดยพ่วงเอาทุกอย่างที่เลือกแถมมาด้วย เช่นเลือกรูปภาพ 1 รูปแล้วเลือกเมนูนี้จะได้ Texture2D และ Sprite มาทั้งคู่ใน bundle (แน่นอนว่าขนาดไฟล์ที่ได้จะใหญ่กว่า)
2. Build AssetBundle From Selection – No dependency tracking คือสร้าง asset bundle โดยสร้างแค่เฉพาะของที่ใส่ลงไปใน bundle เช่นเลือกรูปภาพ 1 รูปแล้วเลือกเมนูนี้จะได้ Texture2D อย่างเดียวมาใน bundle

สิ่งที่ต้องระวังในการใช้งาน asset bundle คือตอนสร้างเราจะต้องเลือกสร้างบน platform ใด platform หนึ่งเช่น สั่งสร้าง asset bundle for android ก็จะใช้ได้กับ android เท่านั้น ใช้กับ ios ไม่ได้ ดังนั้นหากต้องการ update content เกมทั้งสอง os จะต้องสร้าง bundle มา 2 ไฟล์แยกกัน โดยแก้ไขส่วนของ BuildTarget.Android เป็น BuildTarget.iPhone ตามแต่ os

สำหรับวิธีเรียกไปใช้งานก็ตาม code ด้านล่าง

using UnityEngine;
using System.Collections;
public class BundleLoader : MonoBehaviour{
    public string url;
    public int version;
    public IEnumerator LoadBundle(){
        using(WWW www = WWW.LoadFromCacheOrDownload(url, version){
            yield return www;
            AssetBundle assetBundle = www.assetBundle;
            GameObject gameObject = assetBundle.mainAsset as GameObject;
            Instantiate(gameObject );
            assetBundle.Unload(false);
        }
    }
    void Start(){
        StartCoroutine(LoadBundle());
    }
}

ขอให้สนุกกับการทำเกมนะครับ :)

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน