Chủ đề load scene unity: Load scene trong Unity là một phần quan trọng để chuyển đổi giữa các màn chơi trong quá trình phát triển game. Bài viết này sẽ hướng dẫn bạn từ cơ bản đến nâng cao về cách load scene, sử dụng các hàm SceneManager và tối ưu hiệu suất để game chạy mượt mà hơn. Cùng khám phá các phương pháp tối ưu hóa và kỹ thuật hay ho giúp nâng cao trải nghiệm lập trình của bạn!
Mục lục
Tổng hợp thông tin về "Load Scene Unity"
Trong Unity, việc tải các Scene (cảnh) là một phần quan trọng trong việc phát triển game. Các phương pháp và kỹ thuật tối ưu để tải Scene giúp giảm thời gian tải và cải thiện hiệu suất của trò chơi. Dưới đây là một số khía cạnh chính liên quan đến chủ đề này.
1. Cách tải Scene trong Unity
Có nhiều phương pháp để tải Scene trong Unity, bao gồm:
- Sử dụng hàm
SceneManager.LoadScene()để tải một Scene mới. Điều này thường được sử dụng khi chuyển từ một màn chơi này sang màn chơi khác. - Sử dụng
SceneManager.LoadSceneAsync()để tải Scene không đồng bộ, giúp giảm thiểu gián đoạn khi tải cảnh trong nền. - Tạo Scene additive bằng cách sử dụng
LoadSceneMode.Additive, cho phép thêm các cảnh khác vào Scene hiện tại mà không cần tải lại hoàn toàn.
2. Tối ưu hóa quá trình tải Scene
Việc tối ưu hóa quy trình tải Scene rất quan trọng để cải thiện trải nghiệm người dùng và hiệu suất của game:
- Sử dụng các phương pháp tối ưu như tải Scene không đồng bộ để giảm thời gian chờ đợi.
- Chia nhỏ Scene lớn thành các Scene nhỏ hơn và chỉ tải chúng khi cần thiết.
- Sử dụng công nghệ asset bundle để nén và quản lý tài nguyên, giúp tải chúng một cách linh hoạt hơn.
3. Các sự kiện trong quá trình tải Scene
Unity cung cấp các sự kiện để lập trình viên quản lý quá trình tải Scene:
OnSceneLoaded: Được gọi khi một Scene đã được tải xong và sẵn sàng hiển thị.OnSceneUnloaded: Được gọi khi một Scene đã bị dỡ bỏ khỏi bộ nhớ.OnActiveSceneChanged: Được gọi khi Scene hiện tại đang hoạt động được thay đổi.
4. Ví dụ về sử dụng SceneManager trong Unity
Dưới đây là ví dụ đơn giản về cách sử dụng SceneManager để tải một Scene mới:
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
public void LoadNewScene()
{
SceneManager.LoadScene("SceneName");
}
}
5. Các kỹ thuật nâng cao để quản lý Scene
Các lập trình viên Unity có thể sử dụng nhiều kỹ thuật nâng cao để quản lý Scene hiệu quả hơn, bao gồm:
- Tối ưu hóa bằng cách sử dụng
LoadSceneAsync()kết hợp với progress bar để hiển thị quá trình tải. - Giảm kích thước của tài nguyên trong Scene để tăng tốc độ tải bằng cách sử dụng các công cụ như
Unity Profiler. - Đảm bảo rằng các đối tượng không cần thiết được dỡ bỏ khỏi bộ nhớ khi Scene không còn hoạt động để tiết kiệm tài nguyên.
6. Lợi ích của việc sử dụng Scene quản lý
Việc quản lý Scene tốt trong Unity mang lại nhiều lợi ích:
- Tăng hiệu suất tổng thể của game bằng cách quản lý tài nguyên một cách hiệu quả.
- Giảm thời gian tải và cải thiện trải nghiệm người chơi.
- Đảm bảo quá trình chuyển đổi giữa các màn chơi diễn ra mượt mà hơn.
7. Các vấn đề thường gặp khi tải Scene
- Tốc độ tải chậm: Nguyên nhân có thể do kích thước Scene quá lớn hoặc quá nhiều tài nguyên phải tải cùng lúc.
- Lỗi không tải được Scene: Điều này có thể do cấu hình không đúng hoặc không có đủ bộ nhớ để xử lý.
8. Tổng kết
Quản lý việc tải Scene trong Unity là một kỹ thuật quan trọng giúp cải thiện trải nghiệm người dùng và tối ưu hóa hiệu suất của game. Bằng cách sử dụng đúng các phương pháp và kỹ thuật, lập trình viên có thể đảm bảo rằng các Scene được tải nhanh chóng và hiệu quả, đồng thời tránh được các lỗi phổ biến.

1. Giới thiệu về Scene trong Unity
Trong Unity, Scene là khái niệm cơ bản để tổ chức nội dung trò chơi. Mỗi Scene đại diện cho một môi trường game hoặc phần giao diện mà người chơi tương tác. Mỗi dự án Unity thường có nhiều Scene, từ màn hình menu, các cấp độ chơi, đến các khu vực khác nhau trong game.
Các Scene được quản lý bằng cách sử dụng các hàm và API của Unity như SceneManager. Bạn có thể tạo, lưu, và load Scene bất kỳ lúc nào trong quá trình phát triển và chạy trò chơi. Scene có thể chứa nhiều thành phần như:
- GameObject: Các đối tượng game, nhân vật, và môi trường.
- Component: Các thành phần như bộ vật lý, âm thanh, hoặc kịch bản (script).
- Light: Ánh sáng để tạo hiệu ứng thị giác chân thực.
- Camera: Ghi lại hình ảnh và hiển thị trên màn hình của người chơi.
Quản lý Scene một cách hiệu quả giúp cho quá trình phát triển game trở nên đơn giản hơn, đồng thời giúp tối ưu hóa hiệu suất khi chuyển đổi giữa các màn chơi. Unity cung cấp nhiều công cụ và phương pháp giúp lập trình viên dễ dàng làm việc với Scene, bao gồm các tính năng như load Scene không đồng bộ (async) và tối ưu việc quản lý bộ nhớ.
| Thuộc tính | Mô tả |
| Scene Name | Tên của Scene được hiển thị trong Unity Editor. |
| Active Scene | Scene hiện tại đang được hiển thị và tương tác trong game. |
| Scene Index | Chỉ mục của Scene dùng để truy xuất nhanh. |
Qua việc hiểu rõ và sử dụng tốt Scene, bạn sẽ tạo ra được những trò chơi hấp dẫn và mượt mà hơn.
2. Các phương pháp Load Scene trong Unity
Trong Unity, có nhiều phương pháp để load Scene tùy theo yêu cầu của dự án và cách tối ưu hóa hiệu suất. Dưới đây là các phương pháp phổ biến nhất được sử dụng khi cần chuyển đổi giữa các Scene trong game.
- Sử dụng SceneManager.LoadScene
Đây là cách đơn giản nhất và thường dùng để load Scene mới. Lệnh
SceneManager.LoadScene()sẽ tải một Scene dựa trên tên hoặc chỉ mục của Scene đó.SceneManager.LoadScene("SceneName"); - Load Scene không đồng bộ với SceneManager.LoadSceneAsync
Phương pháp này giúp load Scene mà không làm gián đoạn quá trình xử lý của trò chơi. Lệnh
SceneManager.LoadSceneAsync()sẽ load Scene trong nền và cập nhật tiến trình load.AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName"); asyncLoad.allowSceneActivation = false;Điều này đặc biệt hữu ích khi bạn muốn hiển thị thanh tiến trình hoặc các hình ảnh động trong lúc chờ Scene mới được tải.
- Load Scene theo từng phần với Additive Mode
Chế độ Additive cho phép load nhiều Scene cùng lúc, giúp bạn có thể thêm các môi trường hoặc đối tượng vào Scene hiện tại mà không cần thay thế hoàn toàn.
SceneManager.LoadScene("OtherScene", LoadSceneMode.Additive);Điều này thường được sử dụng cho các trò chơi lớn với nhiều khu vực cần tải từng phần để tiết kiệm tài nguyên.
Mỗi phương pháp đều có ưu và nhược điểm riêng. Việc lựa chọn phương pháp nào phụ thuộc vào loại trò chơi và cách bạn muốn tối ưu hóa hiệu suất.
| Phương pháp | Ưu điểm | Nhược điểm |
| SceneManager.LoadScene | Nhanh chóng và dễ sử dụng | Có thể gây gián đoạn quá trình chơi |
| SceneManager.LoadSceneAsync | Tải Scene mượt mà, không gián đoạn | Cần quản lý tiến trình và xử lý phức tạp hơn |
| Load Scene Additive | Cho phép thêm nội dung mà không thay thế Scene | Yêu cầu quản lý tài nguyên và bộ nhớ cẩn thận |
3. Các hàm và API liên quan đến Scene trong Unity
Unity cung cấp nhiều hàm và API mạnh mẽ để quản lý Scene trong quá trình phát triển game. Các hàm này giúp lập trình viên kiểm soát việc chuyển đổi, tải, và thao tác với Scene một cách linh hoạt và hiệu quả.
- SceneManager.LoadScene
Hàm
SceneManager.LoadScene()là hàm cơ bản nhất để load một Scene mới. Bạn có thể chỉ định tên hoặc chỉ mục của Scene để load, thay thế Scene hiện tại.SceneManager.LoadScene("SceneName"); - SceneManager.LoadSceneAsync
Hàm
SceneManager.LoadSceneAsync()được sử dụng khi bạn muốn load Scene không đồng bộ, giúp tránh việc làm gián đoạn trò chơi trong quá trình tải Scene mới. Điều này thường được sử dụng khi bạn muốn hiển thị một màn hình chờ hoặc thanh tiến trình.AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName"); - SceneManager.UnloadSceneAsync
SceneManager.UnloadSceneAsync()cho phép bạn gỡ bỏ một Scene ra khỏi bộ nhớ mà không làm ảnh hưởng đến các Scene khác đang chạy. Điều này hữu ích khi bạn đang load nhiều Scene với chế độ Additive.SceneManager.UnloadSceneAsync("SceneName"); - Scene.isLoaded
Thuộc tính
Scene.isLoadedkiểm tra xem một Scene có đang được load trong bộ nhớ hay không. Điều này hữu ích khi bạn muốn kiểm tra trạng thái của một Scene trước khi thực hiện các thao tác khác.if (scene.isLoaded) { Debug.Log("Scene is loaded"); } - SceneManager.GetActiveScene
Hàm
SceneManager.GetActiveScene()trả về Scene hiện tại đang hoạt động trong game. Bạn có thể dùng hàm này để thao tác với Scene hiện tại như lấy tên Scene hoặc thông tin khác.Scene activeScene = SceneManager.GetActiveScene(); - SceneManager.SetActiveScene
SceneManager.SetActiveScene()dùng để thiết lập Scene nào đang hoạt động. Điều này đặc biệt hữu ích khi bạn load Scene với chế độ Additive và muốn chuyển Scene đang thao tác.SceneManager.SetActiveScene(scene);
Các API này giúp tối ưu quá trình phát triển game, cho phép bạn quản lý và kiểm soát các Scene một cách dễ dàng và hiệu quả.
| Hàm/Thuộc tính | Công dụng |
| SceneManager.LoadScene | Load Scene mới, thay thế Scene hiện tại. |
| SceneManager.LoadSceneAsync | Load Scene không đồng bộ, không gián đoạn trò chơi. |
| SceneManager.UnloadSceneAsync | Gỡ bỏ Scene ra khỏi bộ nhớ. |
| Scene.isLoaded | Kiểm tra trạng thái load của Scene. |
| SceneManager.GetActiveScene | Trả về Scene đang hoạt động hiện tại. |
| SceneManager.SetActiveScene | Thiết lập Scene nào đang được hoạt động. |

4. Tối ưu hiệu suất khi Load Scene
Khi phát triển game trong Unity, việc load Scene có thể gây ra hiện tượng gián đoạn, chậm trễ hoặc tiêu tốn nhiều tài nguyên. Để tránh những vấn đề này và giúp trò chơi chạy mượt mà hơn, bạn cần áp dụng các kỹ thuật tối ưu hóa. Dưới đây là một số phương pháp giúp bạn tối ưu hiệu suất khi load Scene.
- Sử dụng Load Scene không đồng bộ
Khi sử dụng
SceneManager.LoadSceneAsync(), bạn có thể tải Scene mà không ảnh hưởng đến hiệu suất trò chơi. Phương pháp này cho phép hiển thị màn hình chờ hoặc thanh tiến trình trong khi Scene đang được load trong nền.AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName"); asyncLoad.allowSceneActivation = false; - Sử dụng Asset Bundles và Addressables
Asset Bundles và Addressables là hai công cụ giúp bạn quản lý và tải các tài nguyên một cách linh hoạt và hiệu quả. Bằng cách chỉ load những tài nguyên cần thiết cho Scene hiện tại, bạn có thể giảm thiểu thời gian load và tiết kiệm bộ nhớ.
- Asset Bundles: Cho phép đóng gói và load các tài nguyên cụ thể khi cần.
- Addressables: Giải pháp hiện đại hơn, giúp quản lý và tải tài nguyên từ xa hoặc cục bộ một cách dễ dàng.
- Tối ưu hóa bộ nhớ
Việc quản lý bộ nhớ hiệu quả là một yếu tố quan trọng khi load Scene. Bạn cần gỡ bỏ các tài nguyên không còn sử dụng bằng cách sử dụng
Resources.UnloadUnusedAssets()hoặcSceneManager.UnloadSceneAsync()để giải phóng bộ nhớ không cần thiết.Resources.UnloadUnusedAssets(); - Tạo các đối tượng sẵn trong game
Việc tạo các đối tượng sẵn trong game thay vì load chúng trực tiếp trong quá trình chơi sẽ giúp giảm thời gian tải Scene. Bạn có thể sử dụng các Prefab để lưu trữ các đối tượng này và khởi tạo chúng khi cần.
- Chia nhỏ Scene và sử dụng Load Scene theo chế độ Additive
Khi làm việc với các Scene lớn, bạn có thể chia nhỏ Scene thành các phần và sử dụng chế độ Additive để load các phần này theo yêu cầu. Điều này giúp giảm tải cho bộ nhớ và chỉ load những phần thực sự cần thiết.
SceneManager.LoadScene("SubScene", LoadSceneMode.Additive);
| Phương pháp | Ưu điểm | Nhược điểm |
| Load Scene Async | Không làm gián đoạn trò chơi, tải Scene mượt mà | Cần xử lý trạng thái tải và kích hoạt Scene |
| Asset Bundles | Load tài nguyên theo yêu cầu, tiết kiệm bộ nhớ | Cần thiết lập và quản lý phức tạp |
| Addressables | Quản lý tài nguyên linh hoạt và tối ưu | Yêu cầu học cách sử dụng và thiết lập |
| Unload Unused Assets | Giải phóng tài nguyên không cần thiết | Có thể gây chậm nếu sử dụng không đúng cách |
5. Xử lý sự kiện khi Load Scene
Trong quá trình load Scene trong Unity, việc xử lý các sự kiện liên quan đến quá trình tải là rất quan trọng để đảm bảo người dùng có trải nghiệm mượt mà và không bị gián đoạn. Unity cung cấp nhiều công cụ giúp bạn quản lý và xử lý các sự kiện này một cách hiệu quả.
- Quản lý sự kiện khi bắt đầu load Scene
Khi bắt đầu tải một Scene mới, bạn có thể kích hoạt các sự kiện thông qua việc sử dụng
SceneManager.sceneLoadedđể phát hiện khi một Scene được tải hoàn tất. Điều này cho phép bạn thực hiện các thao tác như khởi tạo lại dữ liệu hoặc kích hoạt các đối tượng trong Scene mới.SceneManager.sceneLoaded += OnSceneLoaded; void OnSceneLoaded(Scene scene, LoadSceneMode mode) { Debug.Log("Scene " + scene.name + " has been loaded."); } - Hiển thị thanh tiến trình khi load Scene
Khi bạn sử dụng
SceneManager.LoadSceneAsync()để load Scene không đồng bộ, bạn có thể theo dõi tiến trình tải và cập nhật giao diện người dùng bằng cách sử dụng thuộc tínhprogresscủaAsyncOperation. Điều này giúp hiển thị thanh tiến trình cho người dùng trong khi chờ Scene tải xong.AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName"); while (!asyncLoad.isDone) { float progress = Mathf.Clamp01(asyncLoad.progress / 0.9f); Debug.Log("Loading progress: " + (progress * 100) + "%"); } - Kích hoạt Scene sau khi load xong
Sau khi Scene đã được tải xong, bạn có thể sử dụng thuộc tính
allowSceneActivationđể trì hoãn việc kích hoạt Scene cho đến khi người dùng sẵn sàng. Điều này hữu ích trong các tình huống mà bạn muốn kiểm soát chính xác thời điểm người chơi chuyển qua Scene mới.asyncLoad.allowSceneActivation = false; // Khi muốn kích hoạt Scene if (asyncLoad.progress >= 0.9f) { asyncLoad.allowSceneActivation = true; } - Xử lý sự kiện khi hủy bỏ hoặc dừng tải Scene
Trong một số trường hợp, bạn có thể muốn dừng hoặc hủy bỏ quá trình tải Scene. Unity cung cấp
SceneManager.UnloadSceneAsync()để xử lý việc này, và bạn có thể theo dõi trạng thái hủy bằng cách sử dụng sự kiện củaAsyncOperation.AsyncOperation asyncUnload = SceneManager.UnloadSceneAsync("SceneName"); asyncUnload.completed += (AsyncOperation op) => { Debug.Log("Scene has been unloaded."); };
Việc xử lý các sự kiện liên quan đến load Scene giúp cải thiện hiệu suất và trải nghiệm của người chơi, đồng thời mang lại sự kiểm soát tốt hơn trong quá trình chuyển đổi giữa các Scene.
XEM THÊM:
6. Kinh nghiệm và mẹo vặt trong việc Load Scene
Trong quá trình phát triển game với Unity, việc tối ưu hóa quy trình load Scene là yếu tố quan trọng để giữ cho trò chơi mượt mà và không gây gián đoạn trải nghiệm người chơi. Dưới đây là một số kinh nghiệm và mẹo hữu ích để tối ưu hóa việc load Scene trong Unity.
- Tận dụng Load Scene không đồng bộ
Sử dụng
LoadSceneAsync()là cách tối ưu để load Scene mà không làm ngưng game. Điều này giúp bạn giảm hiện tượng giật lag khi chuyển đổi giữa các Scene. Hãy luôn kiểm tra trạng tháiisDoneđể xác định khi nào việc tải hoàn tất.AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName"); if (asyncLoad.isDone) { Debug.Log("Scene đã được load xong."); } - Sử dụng Scene Additive để load nhiều phần nhỏ
Thay vì load một Scene lớn cùng lúc, bạn có thể chia nhỏ Scene và load từng phần bằng cách sử dụng chế độ
Additive. Phương pháp này giúp phân bổ tài nguyên hợp lý và không làm ngưng trệ hệ thống.SceneManager.LoadScene("SceneName", LoadSceneMode.Additive); - Hiển thị UI tải trong khi load Scene
Luôn hiển thị một giao diện tải (loading UI) hoặc thanh tiến trình để người dùng không cảm thấy bị bỏ rơi trong khi Scene đang tải. Điều này cải thiện trải nghiệm người chơi và tránh cảm giác chờ đợi khó chịu.
- Hiển thị hình ảnh hoặc văn bản thông báo trạng thái tải.
- Sử dụng
progresscủaAsyncOperationđể cập nhật tiến trình.
- Tối ưu hóa tài nguyên Scene
Khi load Scene, hãy đảm bảo rằng các tài nguyên không cần thiết được dỡ bỏ để giải phóng bộ nhớ. Điều này có thể được thực hiện bằng cách sử dụng
Resources.UnloadUnusedAssets(). Ngoài ra, tránh việc load các tài nguyên không cần thiết trong quá trình khởi động Scene. - Sắp xếp thứ tự tải tài nguyên
Tải các tài nguyên quan trọng trước để đảm bảo Scene hoạt động ngay khi nó được load. Những tài nguyên phụ, như âm thanh hoặc hình ảnh không quan trọng, có thể load sau khi Scene đã sẵn sàng.
- Chuyển đổi giữa các Scene nhỏ gọn
Nếu bạn có nhiều Scene nhỏ trong game, hãy chuyển đổi qua lại một cách nhanh chóng bằng cách giữ chúng sẵn sàng trong bộ nhớ, nhưng chỉ kích hoạt khi cần. Phương pháp này phù hợp với các trò chơi có nhiều phòng hoặc level nhỏ.
| Mẹo | Lợi ích | Nhược điểm |
| Load Scene Async | Tải Scene mượt mà, không gián đoạn | Yêu cầu xử lý kỹ lưỡng tiến trình |
| Scene Additive | Giảm tải bộ nhớ, chỉ load những gì cần thiết | Cần quản lý tốt việc gỡ bỏ các phần không cần dùng |
| Unload Unused Assets | Tiết kiệm bộ nhớ khi không dùng tài nguyên | Có thể gây gián đoạn nếu sử dụng sai cách |

7. Tổng kết và lưu ý
Quá trình load Scene trong Unity là một phần quan trọng của việc phát triển game, ảnh hưởng lớn đến trải nghiệm người dùng và hiệu suất hệ thống. Việc hiểu và áp dụng đúng các phương pháp load Scene như không đồng bộ, additive, hoặc tối ưu tài nguyên sẽ giúp cải thiện tốc độ, độ mượt mà và sự ổn định của trò chơi.
- Load Scene không đồng bộ: Sử dụng
LoadSceneAsync()để tránh việc dừng game khi load, cải thiện trải nghiệm người dùng. - Tối ưu hóa bộ nhớ: Sử dụng các phương pháp như
UnloadUnusedAssets()để giải phóng tài nguyên không cần thiết và giảm thiểu bộ nhớ sử dụng. - Quản lý chuyển đổi Scene: Cân nhắc việc sử dụng Scene Additive khi cần tải nhiều phần của Scene hoặc duy trì Scene nhỏ gọn để tránh tải quá nhiều tài nguyên cùng lúc.
- Hiển thị UI tải: Cung cấp feedback cho người dùng trong quá trình tải bằng cách sử dụng thanh tiến trình hoặc thông báo trạng thái, giúp giữ người chơi tương tác.
Một số lưu ý khi load Scene:
- Luôn kiểm tra tính tương thích và hiệu suất trên các thiết bị khác nhau.
- Tránh tải quá nhiều tài nguyên không cần thiết trong một Scene duy nhất, hãy chia nhỏ nếu có thể.
- Sử dụng các API của Unity như
SceneManagerđể quản lý việc tải và dỡ bỏ Scene một cách hợp lý. - Tận dụng các sự kiện của Unity như
sceneLoadedđể xử lý sự kiện sau khi Scene đã được load thành công.
Kết luận, việc nắm vững cách quản lý Scene không chỉ giúp game hoạt động trơn tru mà còn mang lại trải nghiệm tốt hơn cho người chơi, từ đó nâng cao giá trị của trò chơi.






















Blender Room - Cách Tạo Không Gian 3D Tuyệt Đẹp Bằng Blender
Setting V-Ray 5 Cho 3ds Max: Hướng Dẫn Tối Ưu Hiệu Quả Render
D5 Converter 3ds Max: Hướng Dẫn Chi Tiết Và Các Tính Năng Nổi Bật
Xóa Lịch Sử Chrome Trên Máy Tính: Hướng Dẫn Chi Tiết Và Hiệu Quả
VLC Media Player Android: Hướng Dẫn Chi Tiết và Tính Năng Nổi Bật
Chuyển File Canva Sang AI: Hướng Dẫn Nhanh Chóng và Đơn Giản Cho Người Mới Bắt Đầu
Chuyển từ Canva sang PowerPoint - Hướng dẫn chi tiết và hiệu quả
Ghi Âm Zoom Trên Máy Tính: Hướng Dẫn Chi Tiết và Mẹo Hữu Ích
"Notion có tiếng Việt không?" - Hướng dẫn thiết lập và lợi ích khi sử dụng
Facebook No Ads XDA - Trải Nghiệm Không Quảng Cáo Đáng Thử
Ký Hiệu Trên Bản Vẽ AutoCAD: Hướng Dẫn Toàn Diện và Thực Hành
Tổng hợp lisp phục vụ bóc tách khối lượng xây dựng
Chỉnh kích thước số dim trong cad – cách đơn giản nhất 2024