STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

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

    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.

    Rye Nguyen

    08/08/2015
    25/09/2020
    8 phút đọc
    GameObject - Thao Tác với C# Script

    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.

    0 Bình luận
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Đề xuất

    Thao Tác với Tài Liệu PDF Sử Dụng Thư Viện iTextSharp trong C#
    Giới thiệu thư viện iTextSharp, hướng dẫn cài đặt và thao tác với tài ...
    Thao Tác Với Chuỗi Trong C/C++
    Kiến thức cơ bản trong thao tác xử lý chuỗi trong C++.
    28/07/2015

    Khám phá

    Thao Tác với XML Sử Dụng TinyXML trong C++
    Hướng dẫn thao tác với XML sử dụng TinyXML trong C++.
    Định Dạng Ảnh Bitmap - Giới Thiệu và Các Thao Tác Cơ Bản
    Trong đời thường, bạn sẽ gặp các file ảnh có định dạng .PNG, .JPG, .TGA, ...
    Thao Tác với MySQL Database Sử Dụng MySQLi Extension trong PHP
    Hướng dẫn cách thao tác với MySQL database sử dụng MySQLi Extension ...
    07/11/2015
    Thao Tác trên Mảng 1 Chiều
    Hướng dẫn các thao tác trên mảng một chiều trong C/C++.
    26/04/2015
    Nhập Xuất Cơ Bản trong C/C++
    Bài viết là tiền đề giúp cho người đọc làm quen các thao tác cơ bản với ...
    18/03/2016
    Các Thao Tác trên Bit
    Tìm hiểu về các phép tính trên bit - bitwise operator, ví dụ lập trình ...
    Làm Quen với SQL Server
    Giới thiệu SQL Server của Microsoft và hướng dẫn thao tác với dữ liệu ...
    30/07/2015
    EmguCV - OpenCV cho .NET - Một Số Thao Tác Xử Lý Ảnh Cơ Bản - I
    Hướng dẫn các thao tác xử lý ảnh cơ bản với thư viện EmguCV bao gồm: ...
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích.. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020