GameObject
là khái niệm cơ bản trong Unity, mọi đối tượng trong game, từ Camera đến các đối tượng UI hay các đối tượng khác trong game được hiển thị trong cửa sổ Hierarchy đều là các GameObject
.
Các loại đối tượng khác nhau sẽ có những thao tác đặc thù riêng, nhưng là GameObject
đều có những phương thức và thuộc tính chung.
Thuộc tính và hàm cơ bản
tag – name
Unity sử dụng 2 cơ chế để lưu trữ và quản lý danh sách các GameObject
, được hiển thị trong cửa sổ Hierarchy.
- Thuộc tính
name
được kế thừa lại từ lớpObject
, lưu trữ tên của đối tượng được hiển thị ở Hierarchy. - Thuộc tính
tag
được sử dụng để phân loại và định danh cácGameObject
, phải được định nghĩa sẵn trước khi sử dụng. Các đối tượng chưa được phân loại sẽ được gắn mặc địnhtag " Untagged"
. Để định nghĩatag
, sử dụng Tag Manager tại cửa sổ Inspector của bất kỳ đối tượng nào.

Chọn nút Add Tag, bấm chọn nút dấu +
để thêm tag mới và đặt tên cho nó:

Name và Tag được sử dụng nhiều trong Script để chọn được đối tượng cần thao tác.
* Name không bắt buộc khác nhau giữa các đối tượng nhưng nên đặt tên cho mỗi đối tượng khác nhau để dễ phân biệt và xử lý trong Script. Cách đặt tên phổ biến là 1 tên chung và 1 index cho từng loại đối tượng, ví dụ Monster3.
Layer
Tại Tag Manager, có thể tạo ra các Layer và Sorting Layer để thuận tiện trong việc quản lý các đối tượng.
- Sorting Layer được sử dụng để phân lớp hiển thị các đối tượng và sử dụng với thành phần
SpriteRenderer
. - Layer được sử dụng để phân lớp đối tượng và tuỳ chọn hiển thị trong Camera, 1 số lớp được Unity tạo sẵn cơ bản là đủ với các nhu cầu thông thường của lập trình viên.
Active
2 thuộc tính activeInhierarchy
và activeSelf
được sử dụng để kiểm tra trạng thái hoạt động của đối tượng. Đối với việc thiết lập trạng thái, sử dụng hàm SetActive
với giá trị truyền vào là true
hay false
, là trạng thái cần thiết để thiết lập cho đối tượng đó.
Nếu đối tượng cha có trạng thái active là false
thì dù có thay đổi trạng thái của đối tượng con chúng vẫn trả về giá trị false
.
isStatic
1 số đối tượng trong game như bản đồ hay các chướng ngại vật tĩnh đều không có khả năng di chuyển, do đó nên thiết lập trạng thái Static
cho các đối tượng đó để tiết kiệm tài nguyên.
Các đối tượng Static
sẽ được tiền xử lý và gom chung thành 1 đối tượng gọi là Batching object, nhờ đó tiết kiệm được 1 số lượng Draw call (Draw call là số lần render 1 đối tượng, mỗi lần render là 1 draw call).
Tương tự như trạng thái Active của đối tượng, trong Unity Editor có 1 checkbox dùng thiết lập trạng thái Static
của đối tượng, thuộc tính isStatic
dùng để kiểm tra trạng thái tĩnh của đối tượng, từ đó bỏ qua các thao tác xử lý với đối tượng này.
Thao tác với Component
transform
Transform là 1 thành phần bắt buộc, không thể thêm hoặc xoá đối với bất kì GameObject
nào.
Transform lưu trữ các thông tin về vị trí, phép quay và tỷ lệ của đối tượng. Ngoài ra Transform còn có 1 số thuộc tính và phương thức hay để thao tác với GameObject
.
GetComponent và GetComponents
GetComponent
trả về component đầu tiên cần tìm của đối tượng.GetComponents
trả về 1 danh sách toàn bộ các component cần tìm, nếu không tìm được sẽ trả vềnull
hoặc mảng không có phần tử tương ứng.
Nguyên mẫu của hàm như sau:
public Component GetComponent(Type type); public Component GetComponent(string type);
Hàm có thể nhận vào giá trị kiểu Type
hoặc kiểu string
đều được chấp nhận. Để tối ưu nên sử dụng kiểu Type
trong hầu hết mọi trường hợp.
Cú pháp khác để lấy 1 thành phần với Type
như sau:
public Type GetComponent<Type>();
Cú pháp này sử dụng template để lấy ra các component, đây là cách thông dụng trong C# Script.
Tìm kiếm Component trong các đối tượng cha hoặc con
Unity cũng cung cấp sẵn 1 số phương thức giúp thao tác được với component thuộc đối tượng cha hoặc con của nó. Cách thức hoạt động tương tự như GetComponent
và GetComponents
.
Các hàm như sau:
GetComponentInChildren
.GetComponentsInChildren
.GetComponentInParent
.GetComponentsInParent
.
Các hàm này chỉ có thể được sử dụng với Type
của component, kiểu string
không được chấp nhận.
Tìm kiếm GameObject
Tìm kiếm với name
Hàm Find
được Unity thiết kế để tìm kiếm 1 đối tượng trong cửa sổ Hierarchy, cú pháp của hàm như sau:
public static GameObject Find(string name);
- Hàm sẽ trả về giá trị
GameObject
là chính đối tượng được tìm thấy. - Nếu không có đối tượng có tên cần tìm, hàm sẽ trả về
null
.
Chuỗi name
truyền vào chính là tên của đối tượng cần tìm, nếu chuỗi ký tự có chứa ký hiệu /
, Unity sẽ xem đó là đường dẫn của đối tượng trong cửa sổ Hierarchy.
* Hàm chỉ trả về đối tượng được active
trong cửa sổ Hierarchy, mọi đối tượng khác cho dù có tên đúng yêu cầu nhưng chưa được active
cũng bị bỏ qua.
Tìm kiếm với tag
Sử dụng hàm FindGameObjectWithTag
hoặc FindGameObjectsWithTag
tương ứng để tìm 1 hay toàn bộ các đối tượng có tag cần tìm, cách sử dụng tương tự như hàm Find
đề cập ở trên, sử dụng tag
để tìm kiếm đối tượng.
GameObject stdioObject = GameObject.FindGameObjectWithTag("StdioObject");
* Tìm kiếm với name
và tag
đều có thể cho ra kết quả giống nhau, nhưng về chi phí cần sử dụng thì tìm kiếm với tag
sẽ tối ưu hơn. Do đó nên sử dụng tag
cho việc tìm kiếm nếu khả thi.
Khởi tạo và giải phóng GameObject
Khởi tạo
CreatePrimitive
Khởi tạo 1 đối tượng được định nghĩa sẵn bởi Unity, đối tượng được tạo ra sẽ có sẵn Mesh Renderer và Collider tương ứng với hình dạng của đối tượng, cách sử dụng hàm như sau:
GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = new Vector3(0, 0.5f, 0); GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = new Vector3(0, 1.5f, 0);
Danh sách các PrimitiveType
được hỗ trợ:
Sphere | Đối tượng hình cầu, bán kính bằng 1. |
Capsule | Đối tượng hình capsule. |
Cylinder | Đối tượng hình trụ. |
Cube | Tạo ra 1 khối lập phương có độ dài cạnh bằng 1. |
Plane | Tạo ra 1 mặt phẳng, được sử dụng trong việc xây dựng map. |
Quad | Đối tượng quad (4 điểm trong không gian). |
Instantiate
Instantiate
được sử dụng để clone 1 đối tượng được lập trình viên xây dựng sẵn. Nguyên mẫu hàm như sau:
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation); public static Object Instantiate(Object original);
Nếu không truyền vào position
và rotation
, hàm sẽ lấy các giá trị của đối tượng cơ sở để gán cho đối tượng mới, hoặc trả về Vector3.zero
và Quaternion.identity
nếu không khả dụng.
Khi sử dụng Instantiate
, toàn bộ các đối tượng con và cấu trúc sẽ được sao chép với đúng tính chất của chúng. Tuy nhiên, đối tượng cha (nếu có) sẽ được đặt là null
. Do đó đối tượng được clone có thể sẽ không nằm chung vị trí với đối tượng ban đầu.
Instantiate
cũng sao chép được các đối tượng inactive
. Tính chất này sẽ được giữ lại và bản sao được tạo ra cũng sẽ có trạng thái inactive
.
Giải phóng
Destroy
Hàm Destroy
được sử dụng để giải phóng 1 GameObject, component hay tài nguyên được sử dụng trong game. Hàm nhận vào giá trị là đối tượng cần giải phóng, cùng với thời gian delay (mặc định là 0
). Việc huỷ đối tượng sẽ được delay cho đến khi kết thúc hàm Update
, nhưng đối tượng sẽ được huỷ trước quá trình render.
Dưới đây là ví dụ giúp hiểu về chức năng và cách sử dụng hàm Destroy
:
// Destroy current game object Destroy (gameObject); // Removes this script instance from the game object Destroy (this); // Removes the rigidbody from the game object Destroy (GetComponent<BoxCollider>()); // Destroy the game object in 5 seconds after loading the object Destroy (gameObject, 5);
DontDestroyOnLoad
Khi thực hiện chuyển scene, các đối tượng ở scene cũ sẽ được giải phóng hoàn toàn, hàm này giúp chỉ định 1 đối tượng sẽ không bị giải phóng khi chuyển scene, cách sử dụng hàm như sau:
DontDestroyOnLoad(targetObject);
targetObject
chính là đối tượng sẽ được giữ lại khi chuyển scene. Đối tượng này vẫn có thể được giải phóng bằng hàm Destroy
.
* Đối với các GameObject
của scene, hàm chỉ có tác dụng nếu GameObject
đó không là con của bất kì đối tượng nào, toàn bộ cấu trúc và các đối tượng con của nó sẽ được giữ lại qua mọi thao tác chuyển scene.