# Getting started

[Getting started with Addressable Assets | Package Manager UI website (unity3d.com)](https://docs.unity3d.com/Packages/com.unity.addressables@0.8/manual/AddressableAssetsGettingStarted.html)

### Yêu cầu

- Unity 2018.3 hoặc mới hơn.

### Đánh dấu asset là addressable

<span style="white-space: pre-wrap;">Có 2 cách để đánh dấu đối tượng là addressable asset. Khi package Addressable Assets được cài đặt bạn có thể đánh dấu một asset là addressable trong </span>****Inspector****<span style="white-space: pre-wrap;"> hoặc kéo thả vào cửa sổ </span>****Addressables****.

<span style="white-space: pre-wrap;">Trong cửa sổ </span>****Inspector****<span style="white-space: pre-wrap;"> của đối tượng. Chọn Address và nhập tên để định danh Asset.</span>![](https://docs.thanhdv.com/wp-content/uploads/2024/02/image.png)

<span style="white-space: pre-wrap;">Để mở </span>****Addressables****<span style="white-space: pre-wrap;"> chọn </span>****Window &gt; Asset Management &gt; Addressable Assets****.  
Kéo đối tượng từ folder Asset trong cửa sổ Project vào một nhóm trong tab Asset của cửa sổ Addressables.

![](https://docs.thanhdv.com/wp-content/uploads/2024/02/image-3.png)

<span style="white-space: pre-wrap;">Địa chỉ mặc định của asset là đường dẫn đến asset trong dự án. Ví dụ </span>**Assets/images/myImage.png**<span style="white-space: pre-wrap;">. Bạn có thể sử dụng </span>****Addressables****<span style="white-space: pre-wrap;"> để thay đổi địa chỉ thành bất kỳ tên unique nào.</span>

Để thay đổi địa chỉ, double click vào address của asset và nhập địa chỉ mới.

<span style="white-space: pre-wrap;">Trong lần đầu sử dụng Addressable Asset, hệ thống lưu lại một số dữ liệu asset edit-time và run-time cho project trong </span>`<span class="editor-theme-code">Assets/AddressableAssetsData</span>`<span style="white-space: pre-wrap;"> (nên được thêm vào version control).</span>

### Build Game

Addressables cần build nội dung của bạn vào file mà game có thể chạy trước khi bạn build game. Bước này không được thực hiện tự động. Bạn cần build nội dung thông qua UI hoặc API.

- UI: Mở Addressables. Chọn Build &gt; Build Player Content
- <span style="white-space: pre-wrap;">API: </span>`<span class="editor-theme-code">AddressableAssetSettings.BuildPlayerContent()</span>`

### Load hoặc Instantiate bằng địa chỉ

Bạn có thể Load hoặc Instantiate một asset trong run-time. Load một asset sẽ load toàn bộ các ràng buộc vào bộ nhớ (bao gồm cả dữ liệu Asset Bundle nếu có). Nó cho phép bạn sử dụng Asset khi cần. Instantiate tải asset và ngay lập tức thêm nó vào scene.

Truy cập một asset trong script sử dụng địa chỉ dạng string:  
Addressables.LoadAssetAsync&lt;GameObject&gt;(“AssetAddress”);  
hoặc  
Addressables.InstantiateAsync(“AssetAddress”);

**`<strong class="editor-theme-bold editor-theme-code">LoadAssetAsync</strong>`**<span style="white-space: pre-wrap;"> and </span>**`<strong class="editor-theme-bold editor-theme-code">InstantiateAsync</strong>`**<span style="white-space: pre-wrap;"> là xử lý bất đồng bộ. Bạn có thể gọi một callback để làm việc với asset ngay khi n được tải xong. Xem </span>[AsyncOperationHandle](https://docs.unity3d.com/Packages/com.unity.addressables@0.8/manual/AddressableAssetsAsyncOperationHandle)<span style="white-space: pre-wrap;"> để biết thêm về hoàn thành chờ.</span>

![](https://docs.thanhdv.com/wp-content/uploads/2024/02/image-4.png)

#### Sub-Assets và Component

Sub-Assets và Component là các trường hợp đặc biệt đáng để xem xét cho load asset.

- Component – bạn không thể load game object thông qua các component của nó. Bạn phải load/instantiate GameObject và sau đó lấy component bạn cần.
- <span style="white-space: pre-wrap;">Sub-Assets – Load sub-asset được hỗ trợ nhưng thông qua cú pháp đặc biệt. Ví dụ sub-asset là sprite trong sprite sheet hoặc animation clip trong một FBX. Cú pháp sẽ là: </span>`<span class="editor-theme-code">Addressables.LoadAssetAsync<IList<Sprite>>("MySpriteSheetAddress");</span>`

### Sử dụng AssetReference

****AssetReference**** cung cấp cơ chết để truy cập asset mà không cần đến địa chỉ dạng string.

Để truy cập Addressable Asset sử dụng AssetReference:

1. Chọn 1 asset.
2. Trong Inspector, thêm script bạn cần.
3. Trong script thêm`<span class="editor-theme-code"> public AssetReference assetReference;</span>`
4. Quay lại Inspector. Thêm asset vào script trên.

![](https://docs.thanhdv.com/wp-content/uploads/2024/02/image-8.png)

![](https://docs.thanhdv.com/wp-content/uploads/2024/02/image-6.png)

### Load Addressable Asset bằng object reference

Để load AssetReference bằng object reference:  
`<span class="editor-theme-code">AssetRefMember.LoadAssetAsync<GameObject>();</span>`  
Hoặc  
`<span class="editor-theme-code">AssetRefMember.InstantiateAsync(pos, rot);</span>`

**`<strong class="editor-theme-bold editor-theme-code">LoadAssetAsync</strong>`**<span style="white-space: pre-wrap;"> and </span>**`<strong class="editor-theme-bold editor-theme-code">InstantiateAsync</strong>`**<span style="white-space: pre-wrap;"> là xử lý bất đồng bộ. Bạn có thể gọi một callback để làm việc với asset ngay khi n được tải xong. Xem </span>[AsyncOperationHandle](https://docs.unity3d.com/Packages/com.unity.addressables@0.8/manual/AddressableAssetsAsyncOperationHandle)<span style="white-space: pre-wrap;"> để biết thêm về hoàn thành chờ.</span>

### Dữ liệu cục bộ trong StreamingAssets

<span style="white-space: pre-wrap;">Addressables cần một số file trong run-time để biết load cái gì và load như thế nào. File này được sinh ra khi build Addressable data và lưu trong folder </span>****StreamingAssets****<span style="white-space: pre-wrap;">. Đây mà một folder đặc biệt vì tất cả file trong thư mục này đều được thêm vào build. File không được thêm vào folder này ngay lập tức trong khi build. Thay vào đó chúng được lưu trong </span>****Library****. Khi build game file đươc chuyển qua để build xong đó bị xóa đi. Điều này được thực hiện để người dùng có thể build đa nền tảng. Nhưng yên tâm nó chỉ bao gồm những dữ liệu liên quan đến build đó.

<span style="white-space: pre-wrap;">Ngoài dữ liệu Addressables cụ thể, bất kỳ nhóm nào build dữ liệu để sử dụng local cũng sẽ sử dụng vị trí tổ chức sắp xếp cụ thể cho nền tảng của thư viện đó. Để đảm bảo điều này hoạt động, đường dẫn build game nên được đặt thành biến bắt đầu bằng </span>**`<strong class="editor-theme-bold editor-theme-code">[UnityEngine.AddressableAssets.Addressables.BuildPath]</strong>`**<span style="white-space: pre-wrap;"> và đường dẫn load nên bắt đầu bằng </span>**`<strong class="editor-theme-bold editor-theme-code">{UnityEngine.AddressableAssets.Addressables.RuntimePath}</strong>`**.****

### Tải xuống trước

Gọi phương thức`<span class="editor-theme-code"> Addressables.DownloadDependenciesAsync()</span>`<span style="white-space: pre-wrap;"> để load các phụ thuộc cho địa chỉ (address) hoặc nhãn (label). Tiêu biểu là asset bundle.</span>

<span style="white-space: pre-wrap;">Cấu trúc </span>`<span class="editor-theme-code">AsyncOperationHandle </span>`<span style="white-space: pre-wrap;">được trả về bao gồm cả thuộc tính </span>`<span class="editor-theme-code">PercentComplete</span>`<span style="white-space: pre-wrap;"> – có thể được sử dụng để hiển thị quá trình tải xuống. Bạn có thể sử dụng </span>`<span class="editor-theme-code">PercentComplete</span>`<span style="white-space: pre-wrap;"> để hiển thị thanh trạng thái và chờ đến khi nội dung được tải xong.</span>

<span style="white-space: pre-wrap;">Nếu bạn muốn hỏi người dùng có bằng lòng tải xuống hay không. Bạn có thể sử dụng </span>`<span class="editor-theme-code">Addressables.GetDownloadSize()</span>`. Nó sẽ cho bạn biết dung lượng dữ liệu cần tải xuống. Dung lượng này bao gồm tất cả các gói đã được tải về trước đó (kể cả khi gói đó vẫn được lưu trong cache).

Mặc dù việc tải xuống trước có thể có lợi. Nhưng trong nhiều trường hợp bạn có thể chọn không tải trước. Ví dụ:

- Ứng dụng bao gồm rất nhiều nội dung online, và người dùng thường chỉ tương tác với một phần nội dung đó.
- Bạn có một ứng dụng phải kết nối mạng để hoạt động. Ví dụ như game online. Nếu tất cả dữ liệu của ứng dụng nằm trong một gói nhỏ, bạn có thể chọn chờ và tải xuống khi cần.

<span style="white-space: pre-wrap;">Bạn cũng có thể chọn sử dụng một phần của chức năng này. Thay vì sử dụng </span>`<span class="editor-theme-code">PercentComplete</span>`<span style="white-space: pre-wrap;"> và chờ đến khi tải xong. Bạn có thể tải xuống sau đó tiếp tục ứng dụng. Bạn nên tạo màn hình chờ khi dữ liệu thực sự được tải xuống. Nếu không ứng dụng sẽ vẫn phải chờ cho đến khi tải xuống hoàn tất.</span>

### Build đa nền tảng

Khi build nội dung cho Addressable, Asset Bundles được tạo bao gồm Addressable Assets. Asset Bundles phụ thuộc vào nền tảng nên bạn sẽ cần build lại cho mỗi nền tảng mà bạn nhắm tới.

Mặc định, khi Addressable được build dữ liệu cho nền tảng sẽ được lưu vào các thư mục con của đường dẫn Addressable. Đường dẫn runtime sẽ tính đến các folder nền tảng này và trỏ đến dữ liệu được chỉ định.

****Chú ý****<span style="white-space: pre-wrap;">: Khi trong Play Mode trên Editor. Nếu sử dụng script </span>****Addressable Packed Play Mode****, Addressable sẽ tải dữ liệu cho nền tảng mục tiêu bạn đang chọn. Có nghĩa là nếu dữ liệu không tương thích với nền tảng mục tiêu trên editor thì rất có thể vẫn đề này cũng xảy ra trên thiết bị.