Unity 3D

การทำ AssetBundle บน Unity สำหรับโหลด Prefabs ผ่าน HTTP

บางครั้งเราจำเป็นต้อง Host ไฟล์ 3D หรือตัวละครไว้บน Server ดังนั้นไปหาวิธีดึงมาแสดงกัน

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 มาใช้งาน ซึ่งนั่นจะทำให้เราลดขนาดไฟล์ของเราได้มากด้วยครับ

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน