AssetBundle ช่วยให้เราสามารถ import prefabs จากบน server เข้ามารวมใน Unity ซึ่งจะช่วยให้คุณประหยัดเวลา และขนาดไฟล์ พร้อมจัดการ GameObject ที่ซับซ้อนได้อีกด้วย
บางครั้งพอเรา Build App ที่พัฒนาขึ้นบน Unity แล้วได้ขนาดไฟล์ที่ใหญ่มากจน User ไม่กล้าโหลด วิธีการเราอาจจะต้อง Patch บางส่วนไปบน Server แล้วค่อยให้ Unity เราไปดาวน์โหลดมา หากนึกไม่ออกให้นึกถึงขั้นตอนการดวน์โหลดแอปพลิเคชันเกม เสร็จในขนาด 50mb แล้วพอเปิดเกมมาเกมก็จะไปดาวน์โหลด Assets ต่ออีกประมาณ 21 GB ฮ่าๆๆๆ
นั่นแหละ Concept การทำงานของ AssetBundle เอาล่ะเราลองมาทำดูกันหน่อยดีกว่า เปิด Unity ขึ้นมาสร้าง Scene ใหม่หลังจากนั้นไปดาวน์โหลด Model ที่เราต้องการมาใช้งาน
สร้าง Create Empty ขึ้นมาตั้งค่าอยู่ตำแหน่งตรงกลางหน้าจอ
นี่คือ sample file 3D ของเรา https://www.models-resource.com/3ds/cookingmama5bonappetit/model/32375/
ดาวน์โหลดแล้วไปวางใน Project โฟลเดอร์ ลากไปตั้งค่ามุมมอง บน SceneView
ถ้าจัดตำแหน่งได้พอใจแล้วให้สร้างเจ้า HotDog นี่เป็น Prefab โดยการลากไปไว้ที่ folder Prefabs ให้เรียบร้อย
หลังจากนั้นให้เราสร้าง Folder ชื่อ Editors ขึ้นมา แล้วสร้าง C# Script ชื่อ CreateAssetBundles
เขียนคำสั่งต่อไปนี้ลงไป:
using UnityEditor; public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles by daydev")] static void BuildAllAssetBundles() { BuildPipeline.BuildAssetBundles("AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
จริงๆ คำสั่งนี้ใน Unity Doument มีเยอะแยะเลยนะ
เมื่อเสร็จขั้นตอนนี้แล้วก็ให้ไปสร้าง Folder ตำแหน่งเดียวกับโฟลเดอร์ Assets ตั้งชื่อว่า AssetBundles ตามภาพข้างล่าง
กลับไปที่ Folder ชื่อ Prefabs ที่เราทำการสร้าง Prefab ชื่อ “HotDog” ให้เราไปคลิกที่ Prefab ตัวนั้น แล้วมองไปที่ Inspector ที่ Preview ด้านล่าง
ไปเพิ่มชื่อให้กับ AssetBundle ในตัวอย่างตั้งชื่อว่า “hotdog”
สร้างเสร็จแล้วให้เราไปที่เมนู Assets เลือก “Build AssetBundles by daydev” (ตั้งชื่อเอาฮาเฉยๆ ไม่มีความหมายอะไร)
ระบบจะทำการ Pack ตัว AssetBundle ให้เราซึ่งใช้เวลาประมาณหนึ่ง เสร็จแล้วลองกลับไปที่ Folder ชื่อ AssetBundle ข้างนอก
ให้เราเอาแค่ไฟล์ hotdog แค่ไฟล์เดียวไปอัพโหลดไว้บน Server ผ่าน FTP (แค่ hotdog ไฟล์เดียว)
ที่นี่เรากลับมาที่ Assets ของเราให้เราลบ โฟลเดอร์ Hotdog ที่เอาเข้ามาออกไปจาก Project และบย Prefab ของเราที่สร้างด้วยออกไปเช่นกัน
ลบ Folder ที่นำเข้ามาออกไป
ลบ Prefab ที่สร้าง
ไปที่ Hierarchy แล้วคลิกที่ Empty Game Object ถ้าไม่มีให้สร้างขึ้นมานะ สร้าง Script C# ว่า AppController ขึ้นมา:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class AppController : MonoBehaviour { public string url, dataPath; public string assetBundleName; private AssetBundle assetBundle; void Start() { StartCoroutine(DownloadModel()); url = dataPath + "/AssetBundles/" + assetBundleName; } IEnumerator DownloadModel() { string url = dataPath + "/AssetBundles/" + assetBundleName; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url, 0); yield return request.Send(); AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request); GameObject temple = bundle.LoadAsset<GameObject>(assetBundleName); Instantiate(temple); } }
ไปที่ Inspector ของเจ้า AppController ใส่ ข้อมูล Server ของเราและชื่อ AssetBundle ให้ถูกต้อง (ใส่ hotdog)
ทดสอบแอปพลิเคชันของเราหน่อย ต่ออินเตอร์เน็ตด้วยนะ
เราจะเห็นว่า เราได้โหลด AssetBundle จากอินเทอร์เน็ต มาแสดงผลที่ แอปพลิเคันของเราอีกที นั่นคือตัวอย่างกของการทำงานที่ซับซ้อนหากว่าเราต้องมีการดาวน์โหลด Patch เสริมในรูปของ Bundle มาใช้งาน ซึ่งนั่นจะทำให้เราลดขนาดไฟล์ของเราได้มากด้วยครับ