12/08/2018, 13:33

Tìm hiểu về AssetBundle trong Unity

AssetBundles cho phép yêu cầu trực tuyến và tải các tài sản từ local hoặc một địa chỉ từ xa. Với AssetBundles, Asset có thể được lưu trữ từ xa và truy cập khi cần thiết, tăng tính linh hoạt của dự án và giảm kích thước ứng dụng ban đầu. AssetBundle là gì AssetBundles là các tập tin được tạo ...

AssetBundles cho phép yêu cầu trực tuyến và tải các tài sản từ local hoặc một địa chỉ từ xa. Với AssetBundles, Asset có thể được lưu trữ từ xa và truy cập khi cần thiết, tăng tính linh hoạt của dự án và giảm kích thước ứng dụng ban đầu.

  1. AssetBundle là gì

    AssetBundles là các tập tin được tạo ra bởi editor của Unity trong thời gian chính sửa, có thể được sử dụng sau này khi build một project tại thời gian chạy. AssetBundles có thể chứa các file asset như model, material, texture và scene. AssetBundles không thể chứa các script.

    Cụ thể, một AssetBundle là một bộ sưu tập các asset và / hoặc những scene từ một project được lưu trong một tập tin nhỏ gọn với mục đích được nạp riêng khi build cho các ứng dụng thực thi. AssetBundles có thể được nạp theo yêu cầu của một trò chơi hoặc ứng dụng được xây dựng trong Unity. Điều này cho phép truyền tải không đồng bộ và các nội dung như các model, texture, clip âm thanh, hoặc thậm chí toàn bộ scene. AssetBundles có thể được "pre-cache" và được lưu trữ tại local để tải ngay khi lần đầu tiên chạy ứng dụng. Mục đích chính của AssetBundles là để truyền tải nội dung theo yêu cầu từ một địa điểm từ xa, để được nạp vào các ứng dụng khi cần thiết. AssetBundles có thể chứa bất kỳ loại loại tài sản được công nhận bởi Unity, bao gồm dữ liệu tùy biến nhị phân. Ngoại lệ duy nhất là asset script.

    Có rất nhiều trường hợp sử dụng AssetBundles. Nội dung mới có thể được tự động load và unload từ một ứng dụng. Post-relase DLC có thể dễ dàng được thực hiện. "Dấu chân" của một ứng dụng hoặc kích thước có thể được giảm khi lần đầu tiên được triển khai, với asset đang được nạp sau khi cài đặt của ứng dụng và chỉ như những asset là cần thiết. Nền tảng và thiết bị cụ thể cho asset có thể được nạp mà không cần phải tải về hoặc lưu trữ asset dư thừa cho các nền tảng hoặc độ phân giải khác. Nội địa hóa các ứng dụng trở nên dễ dàng bằng cách tải về và cài đặt chỉ những asset cần thiết dựa trên vị trí, ngôn ngữ hay sở thích của người dùng. Ứng dụng có thể được cố định, thay đổi hoặc cập nhật nội dung mới mà không cần phải gửi lại các ứng dụng đã được chấp nhận.

    Cách tổ chức cụ thể các asset của bất kỳ dự án thành AssetBundles sẽ phụ thuộc nhiều vào nhu cầu của các dự án cụ thể. Tuy nhiên, một số nguyên lý cơ bản để hiểu về AssetBundles.

    • AssetBundle được tải về và lưu trữ trọn vẹn.
    • AssetBundle không cần phải được nạp trọn vẹn.
    • Asset trong AssetBundle có thể độc lập với các asset khác.
    • Mỗi AsssetBundle có một số chi phí kỹ thuật, cả về kích thước của các tập tin và sự cần thiết phải quản lý các tập tin đó.
    • AsssetBundle nên được build cho mỗi platform xác định.

    AssetBundles được tải một cách trọn vẹn. Nếu một AssetBundle chứa asset mà không cần thiết ngay lập tức, ngay cả khi họ không nhất thiết phải được nạp vào scene, họ sẽ mất cả băng thông để tải về và đĩa trống để lưu trữ.

    Nội dung của AssetBundle không cần phải được nạp toàn bộ. Khi một AssetBundle đã được tải về, asset có thể được chọn lọc tải từ AssetBundle.

    Asset có thể có phụ thuộc vào các asset khác. Ví dụ, một model có thể có nhiều phụ thuộc. Các model cuối cùng trong game không chỉ là lưới dữ liệu, nhưng nó là một GameObject với tất cả các thành phần của nó và tất cả các thành phần phụ thuộc.

    assetbund1.png

    Mô hình này là phụ thuộc vào một material asset trong Mesh Renderer của nó, và Material Asset kia phụ thuộc vào một Texture Asset cho Material’s Albedo Texture. Vì vậy thực tế, chiếc xe tăng này là phụ thuộc vào ba Material, không chỉ là một.

    assetbundle2.png chuỗi phụ thuộc asset của mô hình xe tăng: Model> Material> Texture

    Asset có thể chia sẻ phụ thuộc với các tài sản khác. Ví dụ, hai mô hình khác nhau có thể chia sẻ cùng một vật liệu, từ đó có thể phụ thuộc vào một Texture.

    assetbundle3.png

    Cả hai cột đá là các mô hình khác nhau nhưng chia sẻ các vật liệu tương tự.

    Mỗi AssetBundle có một số chi phí kỹ thuật. AssetBundles là những file bọc asset. Ưrapper này làm tăng thêm kích thước tổng thể của AssetBundle. Mặc dù đây không phải là một sự gia tăng đáng kể về kích thước, đó là đo lường. AssetBundles cũng đòi hỏi một số chi phí nhất định của quản lý để tổ chức, tạo, upload và maintain. Các AssetBundles đang được sử dụng tăng chi phí cho một dự án, cả về kỹ thuật và quản lý.

    Khi tổ chức AssetBundles, một sự cân bằng phải được đánh giữa quá nhiều AssetBundles nhỏ mà cần phải được theo dõi và tạo ra trên không, và quá ít AssetBundles lớn và chứa dữ liệu không cần thiết hoặc không cần thiết. Sự cân bằng chính xác sẽ phụ thuộc rất nhiều vào nhu cầu của dự án.

    Nội dung của một AssetBundle được biên soạn và tối ưu hóa cho target platform hiện hành theo Settings Import và target platform hiện tại. Bởi vì điều này, AssetBundles nên được xây dựng cho mỗi target platform.

  2. Manifest và quản lý phụ thuộc

    Có một số điểm quan trọng để hiểu về sự phụ thuộc và quản lý phụ thuộc.

    Asset dependency không bao giờ mất. Asset dependency sẽ được thêm vào AssetBundle tự động cùng với các asset được lựa chọn nếu có Asset dependency đã không được assign cho bất kỳ AssetBundle khi AssetBundles được xây dựng. Điều này rất thuận tiện và ngăn ngừa tổn thất Asset dependency. Tuy nhiên, điều này cũng có thể gây ra sự trùng lặp của các asset. Ví dụ, bằng cách sử dụng các cột hai tảng đá trên đó chia sẻ các vật liệu tương tự, nếu cả hai cột đá trong AssetBundles riêng biệt và các vật liệu không rõ ràng được giao cho một AssetBundle, liệu sẽ được thêm vào cả hai AssetBundles chứa các cột đá. Điều đáng chú ý là khi điều này xảy ra, cả tài sản trùng lặp được lưu trữ trong AssetBundles tương ứng của họ và sự phụ thuộc tài sản hiện nay được chia. Mỗi mô hình tài sản bây giờ sẽ phụ thuộc vào các bản sao local của các vật liệu asset, loại bỏ bất kỳ lợi thế của asset vật chất đã chia sẻ. Để ngăn chặn điều này xảy ra, các vật liệu cần phải được gán một cách rõ ràng với một AssetBundle. Đây có thể là một AssetBundle của riêng của mình, hoặc chia sẻ với tài sản khác. Trong cả hai trường hợp, các AssetBundles với các cột đá bây giờ sẽ phụ thuộc vào việc AssetBundle với những Material của tảng đá.

    Các phụ thuộc và các thông tin khác cho AssetBundles của một dự án được lưu trữ trong một Manifest. Các biểu hiện rất giống một "bảng nội dung" cho AssetBundles của dự án. Khi AssetBundles được xây dựng, Unity tạo ra một lượng lớn dữ liệu. Các chi tiết của dữ liệu này được lưu trong Manifest. Có một Manifest tạo cho mỗi target platform. Các danh sách Manifest tất cả các AssetBundles tạo ra từ dự án để xây dựng mục tiêu hiện tại, các store và theo dõi tất cả các phụ thuộc. Với Manifest, nó có thể truy vấn tất cả AssetBundles và tất cả các phụ thuộc.

    Có một thiết lập đặc biệt cho AssetBundles được gọi AssetBundle Variant. AssetBundle Variant được thiết kế để hỗ trợ một trường hợp sử dụng cụ thể - Remapping một sự lựa chọn của các asset khác nhau để đối tượng cá nhân trong một dự án. Điều này đặc biệt hữu ích khi làm việc với các dự án cần lựa chọn một asset từ một loạt các lựa chọn khác nhau có thể dựa trên các tiêu chí như độ phân giải, ngôn ngữ, local hóa, hoặc sở thích người dùng. AssetBundle Variant có thể giữ nhiều asset cần thiết để cover tất cả các tùy chọn hỗ trợ cho một đối tượng và các asset mong muốn có thể được ánh xạ đến đối tượng đó khi cần thiết từ các lựa chọn AssetBundle Variant.

  3. Tổng kết

    Trên đây đã giới thiệu sơ qua về AssetBundle trong Unity. Chúng to sẽ tìm hiểu sâu hơn về AssetBundle và các quản lý AssetBundle trong bài lần sau. Mong rằng nó sẽ hữu ích cho các bạn.

0