# DOTS and DinoHerdSurvival

Một dự án game endless run nhỏ để học về DOTS và UIToolkit

# Chuẩn bị

### Unity

<span style="white-space:pre-wrap;">Dự án được thực hiện trên phiên bản Unity </span>****2022.3.59f1 LTS****<span style="white-space:pre-wrap;"> vì phiên bản này hiện tại (08/2025) đang hỗ trợ rất tốt các thư viện tracking, quảng cáo.</span>

### Các thư viện cho DOTS

Trong Unity cần cài thêm các thư viện cho phục vụ cho DOTS

- ****Entities:**** Đây là thư viện cốt lõi cung cấp nền tảng cho kiến trúc ECS.
- ****Entities Graphics:**** Thư viện phục vụ cho việc hiển thị các entities.
- ****Burst:****<span style="white-space:pre-wrap;"> Trình biên dịch hiệu suất cao, giúp tối ưu hóa C# với từng nền tảng.</span>

### Khái niệm cơ bản về trong DOTS

- ****Entity:**** Entity có thể hiểu là mã định danh. Nó không chứa dữ liệu hay hành vi. Nó chỉ báo cho hệ thống biết là "có cái gì đó đang tồn tại"
- ****Component:**** Không giống như component thường dùng trong lập trình OOP với Game Object. Component ở đây chứa dữ liệu thô không chứa các logic xử lý.
- ****System:****<span style="white-space:pre-wrap;"> Đây là nơi cho các logic và hành vi (behaviour). System sẽ tìm kiếm tất cả các Entity nào có một bộ Component nhất định để thực thi logic với các dữ liệu trong các component đó.</span>
- ****Baking:**** <span style="white-space:pre-wrap;"> là quá trình chuyển đổi dữ liệu từ GameObject sang ECS. Đây là cầu nối giữa thiết kế trực quan và ECS hiệu năng cao.</span>
    - Baking được bắt đầu khi dev nhấn nút Play trên Editor.
    - Với product, baking được xử lý ngay trong lúc build game. Bản build không cần xử lý bake lại nữa.
- ****SubScene:**** Là một scene phụ được đặt bên trong scene chính chứa các authoring (gameObject). Các gameObject trong subscene sẽ được bake thành các entity.

### Lưu ý

- <span style="white-space:pre-wrap;">Trong DOTS vẫn cần phải sử dụng đến </span>****MonoBehaviour.**** MonoBehaviour sẽ không còn là nơi chứa logic game mà sẽ đảm nhiệm việc:
    - *****Cầu nối***** ****để thiết kế và cấu hình****. Unity Editor được thiết kế xoay quanh các gameObject. Dev không thể kéo một Entities lên scene cũng không thể thấy component trong Inspector.
    - ****Xử lý các hệ thống cũ của Unity**** <span style="white-space:pre-wrap;">(ví dụ như </span>`<span class="editor-theme-code">Input.GetKey(),</span>`<span style="white-space:pre-wrap;"> UGUI, Animation...)</span>

# Tạo Entity đầu tiên với ECS

### `<span class="editor-theme-code">DinoTag.cs</span>`

<span style="white-space:pre-wrap;">Tạo một struct trống kế thừa </span>`<span class="editor-theme-code">IComponentData</span>`. Struct này chỉ có tác dụng đánh dấu entity là Dino nên không cần data.

```c#
using Unity.Entities;

public struct DinoTag : IComponentData { }
```

### `<span class="editor-theme-code">MovementData.cs</span>`

<span style="white-space:pre-wrap;">Tạo một </span>`<span class="editor-theme-code">IComponentData</span>`<span style="white-space:pre-wrap;"> chứa dữ liệu cần thiết cho việc di chuyển.</span>

```c#
using Unity.Entities;
using Unity.Mathematics;

public struct MovementData : IComponentData
{
    public float Speed;
    public float3 Direction;
}
```

### `<span class="editor-theme-code">DinoAuthoring.cs</span>`

<span style="white-space:pre-wrap;">Authoring đóng vai trò như một bản thiết kế trên gameObject. Khi chạy game quá trình </span>****baking**** sẽ đọc thông tin từ file này để bake data từ một gameObject tành một Entity

```c#
using Unity.Entities;
using UnityEngine;

public class DinoAuthoring : MonoBehaviour
{
    [SerializeField] private float speed; public float Speed => speed;
}

class DinoAuthoringBaker : Baker<DinoAuthoring>
{
    public override void Bake(DinoAuthoring authoring)
    {
        Entity entity = GetEntity(TransformUsageFlags.Dynamic);
        MovementData movementData = new()
        {
            Speed = authoring.Speed,
            Direction = new Unity.Mathematics.float3(0, 0, 1)
        };
        AddComponent<DinoTag>(entity);
        AddComponent(entity, movementData);
    }
}
```

<span style="white-space:pre-wrap;">Trong Editor: </span>

- <span style="white-space:pre-wrap;">Tạo một Sub Scene bằng cách chuột phải trong của số </span>`<span class="editor-theme-code">Hierarchy</span>`<span style="white-space:pre-wrap;"> chuột phải chọn </span>`<span class="editor-theme-code">New Sub Scene > Empty Scene</span>`
- <span style="white-space:pre-wrap;">Tạo một GameObject </span>`<span class="editor-theme-code">_DinoArchetype</span>`<span style="white-space:pre-wrap;"> thêm component DinoAuthoring và thiết lập thông số. </span>
- <span style="white-space:pre-wrap;">Kéo </span>`<span class="editor-theme-code">_DinoArchetype</span>`<span style="white-space:pre-wrap;"> vào sub scene vừa tạo bên trên.</span>

<details id="bkmrk-t%E1%BA%A1o-sub-scenec%C5%A9ng-c%C3%B3"><summary>Tạo sub scene</summary>

<span style="white-space:pre-wrap;">Cũng có thể tạo sub scene bằng cách chọn các gameObject cần đưa vào sub scene sau đó chuột phải chọn </span>`<span class="editor-theme-code">New Sub Scene > From Selection</span>`

Như thế các gameObject được chọn sẽ tự động được thêm vào sub scene vừa tạo.

</details><details id="bkmrk-ki%E1%BB%83m-tra-entity-v%E1%BB%ABa-"><summary>Kiểm tra Entity vừa tạo</summary>

\- Nếu tạo đúng thì trong của sổ Inspector phía dưới cùng sẽ có Entity Baking Preview như thế này  
[![image.png](https://knowledge.thanhdv.com/uploads/images/gallery/2025-09/scaled-1680-/image.png)](https://knowledge.thanhdv.com/uploads/images/gallery/2025-09/image.png)

<span style="white-space:pre-wrap;">- Hoặc cũng có thể mở cửa số </span>`<span class="editor-theme-code">Entity Hierarchy</span>`<span style="white-space:pre-wrap;"> bằng cách </span>`<span class="editor-theme-code">Window > Entities > Hierarchy</span>`<span style="white-space:pre-wrap;">. Khi chạy game bạn có thể dùng Filter để tìm các Entity có </span>`<span class="editor-theme-code">DinoTag</span>`<span style="white-space:pre-wrap;"> hoặc </span>`<span class="editor-theme-code">MovementData</span>`. Nếu tìm thấy tức là entity đã được tạo thành công.

</details>