Chủ đề editor script unity: Editor Script trong Unity cho phép lập trình viên tùy chỉnh giao diện Inspector và tạo các công cụ hỗ trợ phát triển game hiệu quả hơn. Bài viết này sẽ cung cấp hướng dẫn chi tiết từ cơ bản đến nâng cao về cách tạo và sử dụng Editor Script, giúp bạn tối ưu hóa quy trình phát triển và nâng cao trải nghiệm làm việc trong Unity.
Mục lục
- Tổng Quan Về Editor Script Trong Unity
- 1. Giới thiệu về Editor Script trong Unity
- 2. Cách tạo Custom Editor
- 3. Các bước xây dựng một Custom Editor
- 4. Sử dụng IMGUI trong Editor Script
- 5. Các kỹ thuật nâng cao trong Custom Editor
- 6. Kỹ thuật Debug trong Editor Script
- 7. Các ví dụ thực tế về Editor Script
- 8. Kết luận
Tổng Quan Về Editor Script Trong Unity
Editor Script trong Unity là một công cụ mạnh mẽ giúp tăng cường quy trình phát triển game bằng cách tạo ra các giao diện tùy chỉnh trong Unity Editor. Điều này không chỉ giúp nhà phát triển tiết kiệm thời gian mà còn giúp nhóm làm việc dễ dàng hơn trong việc điều chỉnh và tùy chỉnh các đối tượng mà không cần kiến thức lập trình.
1. Cấu Trúc Cơ Bản Của Editor Script
- Editor script trong Unity thường nằm trong thư mục
Editor. Đây là thư mục đặc biệt để chứa các script có quyền truy cập vào hệ thống của Unity Editor. - Các script này kế thừa từ lớp
Editorcủa Unity, cho phép chỉnh sửa và tương tác với các đối tượng thông qua giao diện người dùng.
2. Các Bước Tạo Editor Script
- Tạo thư mục Editor: Đầu tiên, bạn cần tạo thư mục
Editortrong dự án của mình để chứa các script tùy chỉnh cho Unity Editor. - Inherit từ lớp
Editor: Việc kế thừa lớpEditorcho phép bạn can thiệp vào giao diện của Inspector và chỉnh sửa các đối tượng một cách trực tiếp. - Sử dụng
SerializedProperty: Giúp dễ dàng truy cập và chỉnh sửa các thuộc tính của đối tượng mục tiêu trong giao diện. - Tùy chỉnh GUI: Hàm
OnInspectorGUIlà nơi để tùy chỉnh giao diện của Inspector với các yếu tố như nhãn, nút bấm và trường nhập liệu.
3. Ưu Điểm Của Custom Editor
- Tăng cường năng suất: Custom Editor giúp tăng cường hiệu suất làm việc bằng cách cung cấp giao diện trực quan và dễ sử dụng cho các thành viên trong nhóm không chuyên về lập trình.
- Hạn chế lỗi: Bạn có thể giới hạn các tùy chọn hoặc điều kiện để giảm thiểu các lỗi trong quá trình phát triển.
- Chỉnh sửa dễ dàng: Các công cụ tùy chỉnh này giúp các nhà thiết kế và nghệ sĩ chỉnh sửa các đối tượng mà không cần thay đổi mã nguồn.
4. Ứng Dụng Trong Dự Án Unity
Custom Editor thường được sử dụng để chỉnh sửa các thành phần phức tạp như hệ thống vũ khí, AI, và các đối tượng tương tác trong game. Việc tạo ra các giao diện tùy chỉnh không chỉ giúp quá trình phát triển game trở nên dễ dàng hơn mà còn giúp người không chuyên có thể can thiệp và đóng góp vào quá trình phát triển một cách hiệu quả.
5. Lời Kết
Việc sử dụng Editor Script trong Unity không chỉ giúp tối ưu hóa quá trình làm việc mà còn giúp giảm thiểu sai sót trong quá trình phát triển game. Đây là một kỹ năng cần thiết cho bất kỳ nhà phát triển Unity nào, giúp tạo ra các công cụ tùy chỉnh phù hợp với nhu cầu của dự án.

1. Giới thiệu về Editor Script trong Unity
Editor Script trong Unity là công cụ mạnh mẽ giúp lập trình viên tùy chỉnh giao diện của Unity Editor, giúp tăng cường hiệu suất làm việc và tạo ra các công cụ dành riêng cho dự án game. Những tính năng tùy chỉnh này được sử dụng để tạo ra giao diện trực quan và dễ sử dụng cho các thành viên trong nhóm phát triển, bao gồm cả những người không có kỹ năng lập trình chuyên sâu.
Để bắt đầu với Editor Script, các bước cơ bản cần thực hiện bao gồm:
- Tạo thư mục "Editor": Unity yêu cầu tất cả các script liên quan đến Editor phải nằm trong thư mục có tên
Editor. - Kế thừa từ lớp
Editor: Editor Script cần kế thừa từ lớpEditorcủa Unity, giúp bạn tùy chỉnh cách hiển thị của các component trong Inspector. - Chỉnh sửa
OnInspectorGUI: Phương thứcOnInspectorGUIđược sử dụng để tùy chỉnh giao diện của Inspector, cho phép hiển thị các thành phần như nút bấm, hộp kiểm và các trường nhập liệu.
Những lợi ích của việc sử dụng Editor Script bao gồm:
- Tăng năng suất làm việc bằng cách giảm thiểu thao tác thủ công.
- Tạo ra giao diện người dùng thân thiện cho các thành viên không phải lập trình viên.
- Giúp phát hiện và giảm thiểu lỗi trong quá trình phát triển.
Tóm lại, việc sử dụng Editor Script trong Unity giúp bạn tối ưu hóa quy trình phát triển game, đồng thời nâng cao trải nghiệm người dùng và chất lượng sản phẩm cuối cùng.
2. Cách tạo Custom Editor
Custom Editor trong Unity giúp bạn tùy chỉnh cách hiển thị của các component trong Inspector, mang lại nhiều tiện ích cho quá trình phát triển game. Dưới đây là các bước cơ bản để tạo Custom Editor:
- Tạo một script component: Đầu tiên, bạn cần có một script C# cơ bản mà bạn muốn tùy chỉnh hiển thị trong Inspector. Ví dụ, hãy tạo một script với tên
MyComponent.csnhư sau:using UnityEngine; public class MyComponent : MonoBehaviour { public float speed; public Vector3 position; } - Tạo một Editor Script: Tiếp theo, tạo một script mới trong thư mục
Editorvà đặt tên làMyComponentEditor.cs. Script này sẽ kế thừa từ lớpEditorvà sử dụng thuộc tính[CustomEditor]để gán script này làm Editor cho component của bạn.using UnityEngine; using UnityEditor; [CustomEditor(typeof(MyComponent))] public class MyComponentEditor : Editor { public override void OnInspectorGUI() { MyComponent myComponent = (MyComponent)target; // Tạo giao diện tuỳ chỉnh trong Inspector myComponent.speed = EditorGUILayout.FloatField("Speed", myComponent.speed); myComponent.position = EditorGUILayout.Vector3Field("Position", myComponent.position); if (GUILayout.Button("Reset Position")) { myComponent.position = Vector3.zero; } } } - Chỉnh sửa Inspector với OnInspectorGUI: Trong phương thức
OnInspectorGUI, bạn có thể tùy chỉnh cách hiển thị của các biến trong component nhưspeedvàposition. Bạn có thể thêm các nút bấm hoặc các thành phần GUI khác. - Sử dụng các thành phần GUI khác nhau: Unity cung cấp nhiều thành phần GUI khác nhau như
EditorGUILayout.FloatField,EditorGUILayout.Vector3Field, vàGUILayout.Buttonđể giúp bạn dễ dàng tùy chỉnh giao diện.
Việc tạo Custom Editor giúp tăng hiệu quả làm việc trong Unity, cho phép bạn xây dựng các công cụ tùy chỉnh phù hợp với nhu cầu của từng dự án game.
3. Các bước xây dựng một Custom Editor
Xây dựng một Custom Editor trong Unity giúp lập trình viên kiểm soát tốt hơn cách hiển thị và chỉnh sửa các component trong Inspector. Dưới đây là các bước chi tiết để tạo một Custom Editor:
- Bước 1: Tạo một script component cơ bản
Trước tiên, bạn cần tạo một script C# cho đối tượng mà bạn muốn tùy chỉnh trong Inspector. Ví dụ:
using UnityEngine; public class MyComponent : MonoBehaviour { public float speed; public Vector3 targetPosition; } - Bước 2: Tạo thư mục "Editor"
Tất cả các Editor Script phải được đặt trong thư mục có tên "Editor" để Unity nhận diện và sử dụng. Nếu thư mục này chưa tồn tại, bạn cần tạo nó trong cùng cấp với các script khác của dự án.
- Bước 3: Tạo script Editor
Tạo một script mới trong thư mục "Editor" và đặt tên cho nó, ví dụ
MyComponentEditor.cs. Script này sẽ kế thừa từ lớpEditorvà được dùng để tùy chỉnh giao diện củaMyComponenttrong Inspector.using UnityEngine; using UnityEditor; [CustomEditor(typeof(MyComponent))] public class MyComponentEditor : Editor { public override void OnInspectorGUI() { MyComponent myComponent = (MyComponent)target; myComponent.speed = EditorGUILayout.FloatField("Speed", myComponent.speed); myComponent.targetPosition = EditorGUILayout.Vector3Field("Target Position", myComponent.targetPosition); if (GUILayout.Button("Reset Position")) { myComponent.targetPosition = Vector3.zero; } } } - Bước 4: Tùy chỉnh giao diện Inspector
Trong phương thức
OnInspectorGUI, bạn có thể sử dụng các thành phần GUI của Unity để tùy chỉnh cách hiển thị của các biến. Ví dụ, sử dụngEditorGUILayout.FloatFieldđể hiển thị trường nhập số cho biếnspeed, hoặcGUILayout.Buttonđể thêm nút bấm vào giao diện. - Bước 5: Kiểm tra kết quả
Sau khi hoàn tất các bước trên, bạn có thể quay lại Unity và kiểm tra trong Inspector. Giao diện của
MyComponentsẽ hiển thị các thành phần tùy chỉnh mà bạn đã tạo.
Custom Editor giúp bạn tạo ra các giao diện trực quan và linh hoạt hơn cho quá trình phát triển game, giúp tiết kiệm thời gian và nâng cao hiệu quả công việc.

4. Sử dụng IMGUI trong Editor Script
IMGUI (Immediate Mode GUI) là một hệ thống giao diện người dùng mạnh mẽ trong Unity, cho phép bạn tạo giao diện tùy chỉnh cho các công cụ nội bộ và Editor Script. Khi sử dụng IMGUI trong Editor Script, bạn có thể điều khiển trực tiếp cách các thành phần được vẽ và tương tác trong Unity Editor.
- Bước 1: Tạo Editor Script cơ bản
Để bắt đầu, bạn cần tạo một Editor Script và sử dụng phương thức
OnInspectorGUIđể tùy chỉnh giao diện. Ví dụ dưới đây là cách tạo một script tùy chỉnh cho componentMyComponent:using UnityEngine; using UnityEditor; [CustomEditor(typeof(MyComponent))] public class MyComponentEditor : Editor { public override void OnInspectorGUI() { MyComponent myComponent = (MyComponent)target; GUILayout.Label("IMGUI Example", EditorStyles.boldLabel); myComponent.speed = EditorGUILayout.FloatField("Speed", myComponent.speed); myComponent.targetPosition = EditorGUILayout.Vector3Field("Target Position", myComponent.targetPosition); if (GUILayout.Button("Reset Position")) { myComponent.targetPosition = Vector3.zero; } } } - Bước 2: Sử dụng các thành phần của IMGUI
IMGUI cung cấp nhiều phương thức như
GUILayout.Label,EditorGUILayout.FloatField, vàGUILayout.Buttonđể xây dựng giao diện người dùng. Bạn có thể sử dụng chúng để tạo các nhãn, trường nhập liệu và nút bấm trong Inspector.- GUILayout.Label: Hiển thị văn bản trong giao diện người dùng.
- EditorGUILayout.FloatField: Hiển thị trường nhập số cho biến
float. - GUILayout.Button: Tạo nút bấm để thực hiện hành động.
- Bước 3: Tùy chỉnh hành vi của IMGUI
Bạn có thể tùy chỉnh hành vi của IMGUI dựa trên các sự kiện người dùng, như nhấn nút hoặc thay đổi giá trị của các trường. Ví dụ, trong đoạn mã trên, khi nhấn nút "Reset Position", vị trí của đối tượng sẽ được đặt lại về
Vector3.zero. - Bước 4: Kết hợp IMGUI và EditorGUILayout
IMGUI cho phép bạn tạo các thành phần giao diện động. Tuy nhiên, kết hợp IMGUI với
EditorGUILayoutsẽ giúp tăng hiệu quả phát triển, tạo ra giao diện người dùng trực quan và mạnh mẽ hơn.
Sử dụng IMGUI trong Editor Script mang đến cho lập trình viên nhiều khả năng linh hoạt để tùy chỉnh giao diện và cải thiện trải nghiệm phát triển trong Unity.
5. Các kỹ thuật nâng cao trong Custom Editor
Các kỹ thuật nâng cao trong việc tùy chỉnh giao diện Editor trong Unity giúp lập trình viên có thể tạo ra những công cụ mạnh mẽ, tối ưu hóa quá trình phát triển game và cải thiện trải nghiệm làm việc với Inspector.
5.1. Điều khiển hiển thị và hành vi của các thuộc tính
Để điều khiển hiển thị của các thuộc tính trong Inspector, chúng ta có thể sử dụng các thuộc tính (attributes) đặc biệt như [HideInInspector] hoặc [CustomPropertyDrawer] để tùy chỉnh cách hiển thị và hành vi của chúng. Điều này giúp tối ưu hóa giao diện, chỉ hiển thị những thông tin quan trọng, hoặc tùy chỉnh quy trình nhập liệu dựa trên điều kiện.
- [HideInInspector]: Ẩn thuộc tính trong Inspector để giữ giao diện gọn gàng.
- [CustomPropertyDrawer]: Tùy chỉnh cách thuộc tính được hiển thị thông qua việc tạo giao diện riêng cho từng loại thuộc tính.
5.2. Tùy chỉnh giao diện dựa trên điều kiện
Đôi khi, việc hiển thị các thành phần trong Inspector có thể được điều chỉnh dựa trên các điều kiện cụ thể. Bạn có thể sử dụng câu lệnh if trong OnInspectorGUI() để kiểm tra giá trị của các thuộc tính và điều chỉnh cách chúng được hiển thị. Ví dụ:
Điều này cho phép bạn hiển thị hoặc ẩn các trường trong Inspector dựa trên các điều kiện runtime, giúp việc quản lý dữ liệu trở nên dễ dàng và linh hoạt hơn.
5.3. Tạo giao diện kéo-thả (Drag and Drop)
Một tính năng hữu ích trong các kỹ thuật nâng cao của Custom Editor là việc sử dụng giao diện kéo-thả. Điều này giúp tăng cường trải nghiệm người dùng khi làm việc với các đối tượng hoặc dữ liệu trong Unity. Bằng cách sử dụng GUILayoutUtility.GetRect và xử lý sự kiện kéo-thả, lập trình viên có thể thêm tính năng kéo-thả trực quan vào Editor.
- Sử dụng
Event.currentđể kiểm tra sự kiện kéo-thả. - Quản lý các đối tượng được kéo-thả bằng cách kiểm tra kiểu dữ liệu được kéo vào.
5.4. Tối ưu hóa hiệu suất với EditorCoroutine
Trong các dự án phức tạp, việc thực thi các tác vụ lâu dài như nạp dữ liệu hoặc tính toán có thể làm chậm hệ thống. EditorCoroutine cho phép lập trình viên chạy các quá trình nền trong Editor mà không làm gián đoạn giao diện người dùng. Điều này đặc biệt hữu ích khi tạo các công cụ Editor cần xử lý nhiều dữ liệu hoặc cập nhật thường xuyên.
5.5. Tùy chỉnh giao diện với IMGUI và UIElements
Việc sử dụng kết hợp giữa IMGUI và UIElements mang đến sự linh hoạt cho việc xây dựng giao diện phức tạp. Trong khi IMGUI phù hợp cho các công cụ nhanh gọn, UIElements cung cấp khả năng tạo giao diện mạnh mẽ và hiện đại, với hỗ trợ CSS và dữ liệu trực quan.
- IMGUI: Phù hợp cho các tác vụ đơn giản, giao diện tùy chỉnh nhanh chóng.
- UIElements: Được khuyến khích cho các giao diện phức tạp, có khả năng mở rộng và tương thích tốt với CSS.
XEM THÊM:
6. Kỹ thuật Debug trong Editor Script
Khi làm việc với Editor Script trong Unity, việc debug là vô cùng quan trọng để tìm ra và khắc phục các lỗi trong quá trình phát triển. Dưới đây là một số kỹ thuật và công cụ phổ biến giúp lập trình viên Unity có thể thực hiện quá trình debug một cách hiệu quả.
1. Sử dụng Debug.Log
Phương pháp phổ biến nhất khi debug trong Unity Editor là sử dụng Debug.Log(), Debug.LogWarning() và Debug.LogError(). Bạn có thể chèn các câu lệnh này vào những điểm quan trọng trong mã để xem giá trị của biến hoặc theo dõi các sự kiện đang xảy ra.
Debug.Log("Giá trị của biến X: " + X);
Khi chạy mã, các giá trị sẽ xuất hiện trong Console của Unity, giúp bạn dễ dàng phát hiện vấn đề.
2. Breakpoints và Debugger trong Visual Studio
Việc sử dụng Visual Studio Debugger kết hợp với Unity là một cách tiếp cận mạnh mẽ. Bạn có thể đặt các điểm dừng (breakpoints) tại những dòng mã quan trọng và bước qua từng dòng mã (step over) hoặc đi sâu vào trong các hàm con (step into) để kiểm tra cách mã hoạt động.
- Step over: Sử dụng để di chuyển qua các dòng mã mà không đi vào trong hàm.
- Step into: Di chuyển vào bên trong hàm hoặc phương thức để xem chi tiết cách hoạt động.
3. Công cụ Debug trực tiếp trong Unity Editor
Unity Editor cung cấp các công cụ tích hợp như Inspector và Console giúp theo dõi các thông số của game trong thời gian thực. Bạn có thể sử dụng công cụ này để kiểm tra giá trị của các đối tượng hoặc tài nguyên trong lúc game đang chạy.
4. Theo dõi giá trị với Watch
Tính năng Watch trong Visual Studio cho phép bạn theo dõi giá trị của các biến trong quá trình debug. Điều này giúp bạn dễ dàng phát hiện giá trị bất thường và nguyên nhân gây ra lỗi.
Ví dụ: Khi bạn muốn theo dõi biến playerHealth, bạn có thể thêm nó vào Watch và quan sát cách giá trị thay đổi trong quá trình thực thi mã.
5. In thông tin từ Inspector
Bạn có thể sử dụng SerializedObject và SerializedProperty để truy cập và in ra thông tin từ các đối tượng trong Inspector. Điều này giúp bạn theo dõi các giá trị tài sản của các đối tượng game mà không cần truy cập trực tiếp vào chúng.
SerializedObject obj = new SerializedObject(target);
SerializedProperty property = obj.FindProperty("property_name");
Debug.Log("Giá trị của thuộc tính: " + property.intValue);
6. Kết hợp Unity Test Framework
Để nâng cao quá trình debug, bạn có thể kết hợp với Unity Test Framework. Framework này cho phép bạn viết các bài kiểm tra tự động để đảm bảo các tính năng trong Editor Script hoạt động đúng như mong đợi, giúp phát hiện lỗi nhanh hơn.
7. Tổng kết
Debug trong Editor Script là quá trình không thể thiếu trong phát triển game trên Unity. Bằng cách sử dụng các kỹ thuật trên như Debug.Log(), Visual Studio Debugger, và theo dõi giá trị trong Inspector, bạn sẽ có khả năng xác định và khắc phục lỗi một cách hiệu quả và nhanh chóng.

7. Các ví dụ thực tế về Editor Script
Editor Script trong Unity là công cụ mạnh mẽ giúp lập trình viên tùy chỉnh giao diện và các chức năng trong Editor. Dưới đây là một số ví dụ thực tế về cách sử dụng Editor Script để giúp tối ưu hóa quy trình phát triển game:
- 1. Tạo Custom Inspector: Custom Inspector cho phép tùy chỉnh giao diện trong Unity Editor khi chỉnh sửa các component. Điều này rất hữu ích khi bạn muốn hiển thị hoặc ẩn các trường dữ liệu phức tạp, hoặc tạo giao diện dễ sử dụng hơn cho người dùng.
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
public override void OnInspectorGUI()
{
// Tạo giao diện mới cho MyComponent
MyComponent myComponent = (MyComponent)target;
myComponent.health = EditorGUILayout.IntField("Health", myComponent.health);
myComponent.damage = EditorGUILayout.FloatField("Damage", myComponent.damage);
// Gọi GUI gốc
DrawDefaultInspector();
}
}
using UnityEditor;
using UnityEngine;
public class MenuItems
{
[MenuItem("Tools/Reset Player Stats")]
private static void ResetPlayerStats()
{
// Đặt lại chỉ số của người chơi
PlayerStats.health = 100;
PlayerStats.damage = 10;
Debug.Log("Player stats reset!");
}
}
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Transform))]
public class TransformEditor : Editor
{
void OnSceneGUI()
{
// Vẽ một đường từ vị trí gốc tới vị trí của Transform
Transform transform = (Transform)target;
Handles.DrawLine(Vector3.zero, transform.position);
}
}
Những ví dụ trên giúp cho lập trình viên tiết kiệm thời gian trong quá trình phát triển game và tùy chỉnh môi trường làm việc theo nhu cầu cụ thể. Việc kết hợp Editor Script với các tính năng như Custom Inspector, Menu Item, và Scene View Drawing mang lại sự linh hoạt và tiện lợi trong Unity Editor.
8. Kết luận
Việc sử dụng Editor Script trong Unity không chỉ giúp tối ưu hóa quá trình phát triển game mà còn giúp các nhà phát triển tạo ra các công cụ tùy chỉnh mạnh mẽ. Với khả năng can thiệp vào giao diện của Unity Editor, chúng ta có thể tự động hóa nhiều công đoạn thủ công, tăng tốc quá trình làm game và cải thiện trải nghiệm làm việc.
Các ví dụ cụ thể như việc tạo giao diện tùy chỉnh cho việc điều chỉnh màu sắc, sử dụng các Toggle và Button để điều khiển các chức năng đã cho thấy tính linh hoạt của Editor Script. Điều này có thể đặc biệt hữu ích trong việc quản lý đối tượng hoặc tài nguyên trong các dự án lớn.
Để phát huy tối đa hiệu quả của Editor Script, bạn cần nắm vững các phương pháp như sử dụng GUILayout và EditorGUILayout để tùy chỉnh giao diện và thao tác với các đối tượng trong game. Hơn nữa, các thư viện như Odin Editor cũng là công cụ hỗ trợ mạnh mẽ, giúp việc tạo ra các công cụ tùy chỉnh trở nên dễ dàng hơn.
Tóm lại, việc hiểu và ứng dụng Editor Script không chỉ giúp tiết kiệm thời gian mà còn mang lại lợi ích lớn trong việc tổ chức và quản lý dự án game. Hãy tiếp tục khám phá và phát triển các công cụ mạnh mẽ này để nâng cao hiệu suất làm việc trong Unity.






















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