Search…

GameObject - Thao Tác với C# Script

25/09/20208 min read
Giới thiệu các thành phần chung của 1 GameObject và các thao tác với C# Script, lập trình trong Unity.

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ớp Object, 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ác GameObject, 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 định tag " Untagged". Để định nghĩa tag, sử dụng Tag Manager tại cửa sổ Inspector của bất kỳ đối tượng nào.
ss_1

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ó:

ss_2

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 activeInhierarchyactiveSelf đượ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ư GetComponentGetComponents.

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 nametag đề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 positionrotation, 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.zeroQuaternion.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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.vn

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024