Tóm lược về MonoBehaviour

Kiến thức cơ bản về monobehaviour trong unity mà bạn cần biết

Giới thiệu

MonoBehaviour là nền móng cơ bản cho Unity3D Nó là thành phần không thể thiếu để phát triển trò chơi, bạn có thể sử dụng nó để tạo ra được các chức năng của trò chơi

Chúng ta hãy cùng bắt tay vào tìm hiểu MonoBehaviour

Monobehaviour là gì?

Monobehaviour là một component, nếu bạn chưa đọc bài giới thiệu về component bạn có đọc nó ở đây

Bạn có thể thêm nhiều chức năng vào GameObject thông qua việc gắn monobehaviour vào Gameobject

Sử dụng khi nào?

Khi muốn đối tượng xuất hiện trên màn hình

Ví dụ, bạn muốn nhân vật của mình hiển thị trong trò chơi và nó có thể di chuyển. Như vậy nhân vật sẽ cần sử dụng monobehaviour

Player_Male sử dụng component PlayerManager kế thừa từ Monobehaviour

Các đối tượng UI (user interface) cũng sử dụng monobehaviour

Component kế thừa từ monobehaviour

Điều quan trọng phải nhắc lại 3 lần đó là component là khái niệm không thể tách rời khi làm việc với Unity. Tóm lại là khi lập trình viên tạo ra một chức năng trong trò chơi của mình, ta cần kế thừa từ monobehaviour

Vậy Component là gì?

Component được sử dụng trong Unity là chức năng của trò chơi mà bạn đang phát triển. Cụ thể hơn đó là chức năng được thêm vào GameObject. Component không thể tự hoạt động độc lập, nó chỉ hoạt động khi nó được thêm vào GameObject

Cùng theo dõi các bước dưới đây:

Tạo một tập lệnh C# từ Assets > Create > C# Script

Đặt tên nó là FirstClass

Mở nó bằng một trình soạn thảo code (IDE) mà bạn thích ở đây tôi sẽ dùng Rider

Sau đó thêm component FirstClass bạn vừa tạo kia vào 1 GameObject

Tập lệnh được tạo ra cần kế thừa từ Monobehaviour để có thể thêm vào GameObject

Kế thừa là gì?

Kế thừa là một trong bốn tính chất trụ cột của lập trình hướng đối tượng (OOP) được sử dụng thông qua c# trong Unity. Tính kế thừa là một class có thể thừa hưởng lại thuộc tính, phương thức từ một class khác

  • class mới gọi là class con (subclass) hay class dẫn xuất (derived class).
  • class đã có gọi là class cha (superclass) hay class cơ sở (base class).

Cú pháp kế thừa rất đơn giản class tên_lớp_dẫn_xuất : tên_lớp_kế_thừa

6 phương thức đại diện tự động thực thi khi kế thừa monobehaviour

Như đã nói ở trên Monobehaviour là một component đặc biệt của Unity

điều đó được thể hiện ở chỗ khi bạn kế thừa từ monobehaviour sẽ có một số phương thức được gọi tự động những phương thức này được gọi chung là “Event Function”. Các event function này rất quan trọng khi sử dụng monobehaviour vì vậy bạn cần hiểu rõ chúng.

  1. Phương thức Awake
  2. Phương thức Start
  3. Phương thức OnEnable
  4. Phương thức OnDisable
  5. Phương thức Update
  6. Phương thức OnDestroy

Phương thức Awake

Awake là phương thức được gọi đầu tiên trong Monobehaviour. Được sử dụng để xử lý khởi tạo.

Nó có các đặc tính sau:

  • Được gọi khi monobehaviour được tạo ra
  • Chỉ gọi một lần duy nhất
  • Hoạt động khi GameObject đang bật (enable bằng true)

Lưu ý về đặc tính thứ 3 nó có nghĩa là việc component monobehaviour bị tắt (enable componenet bằng false) không ảnh hưởng đến Awake, nó vẫn được thực thi

Phương thức Start

Phương thức Start cũng được sử dụng để khởi tạo giống như Awake

Nó có các đặc tính sau:

  • Được gọi sau Awake một frame
  • Chỉ gọi một lần duy nhất
  • Hoạt động khi cả GameObject và Component đều đang được bật (enable bằng true)

Start được thực thi sau Awake một khung hình vì vâỵ trường hợp khi trò chơi của bạn bắt đầu mà xuất hiện các Object không mong muốn Bạn có thể kiểm tra lại phương thức Start của mình, hãy chú ý một frame này

Sẽ an toàn hơn nếu thực thi quá trình khởi tạo trong Awake thay vì Start, nhưng đôi khi để toàn bộ quá trình khởi tạo trong Awake có thể sảy ra drop khung hình lúc GameObject sinh ra vì vậy lúc đó bạn có thể chuyển bớt quá trình khởi tạo sang cho Start để giảm tải gánh nặng trong Awake

Phương thức OnEnable

Giống như AwakeStart nó được sử dụng để khởi tạo

Nó có các đặc tính sau:

  • Được gọi sau Awake (trước Start)
  • Được gọi nhiều lần
  • Hoạt động khi cả GameObject và Component đều đang được bật (enable bằng true)

Phương thức OnEnable được gọi nhiều lần, đây là điểm khác biệt lớn so với Start và Awake. Nó sẽ được gọi lại sau khi GameObject chuyển đổi trạng thái từ tắt sang bật (enable từ false thành true)

Phương thức OnDisable

Nó là phiên bản trái ngược của OnEnable, nó được gọi khi enable được chuyển thành false

Nó có các đặc tính sau:

  • Được gọi mỗi khi GameObject hoặc Monobehaviour bị tắt (enable là false)
  • Được gọi nhiều lần
  • Được gọi ngay cả khi component bị gỡ bỏ khỏi GameObject (GameObject và Monobehaviour cần đang hoạt động (enable bằng true))

OnDisable được kích hoạt ngay cả khi component bị xoá (component cũng bị xoá khi GameObject bị xoá)

Phương thức Update

Update là phương thức được gọi mỗi khung hình

Nó có các đặc tính sau:

  • Được gọi mỗi khung hình
  • Được gọi nhiều lần
  • Hoạt động nếu cả GameObject và Monobehaviour đều được bật (enable bằng true)

Update thường được sử dụng khi muốn tạo các mô phỏng liên tục như di chuyển nhân vật, hoặc các tính toán cần xử lý dữ liệu đầu vào liên tục

Phương thức OnDestroy

OnDestroy là phương thức được gọi khi bạn xoá monobehaviour

Nó có các đặc tính sau:

  • Được gọi khi xoá monobehaviour hoặc xóa GameObject
  • Được gọi một lần duy nhất
  • Không hoạt động nếu Awake chưa được gọi

Về đặc tính Không hoạt động nếu Awake chưa được gọi, OnDestroy sẽ không được gọi nếu GameObject vẫn ở trạng thái không hoạt động (enable bằng false và chưa chuyển thành true lần nào)

Lưu ý về Event function

  • Event function không được thực thi nếu nó không được định nghĩa

Ví dụ ta có component sau đây: Như bạn thấy, nó không viết bất kỳ event function nào cả. Điều này có nghĩa là sẽ không có event function nào được gọi

Ta có một component khác: Phương thức Awake được viết vì vậy nó được gọi theo quy tắc của event function. Tất nhiên không có event function nào khác ngoài Awake được viết nên các event fucntion khác sẽ không được gọi

  • Điều kiện hoạt động của event function

Hầu hết các event function cần GameObject và Monobehaviour đều đang hoạt động nghĩa là enable được đặt thành true

Nếu event function không hoạt động hãy kiểm tra xem checkbok enable đã được bật chưa?

Hai chức năng của Monobehaviour thường được sử dụng

  1. Coroutine
  2. enable

Coroutine

Một trong những tính năng sử dụng nhiều nhất trong monobehaviour đó là Coroutine. Coroutine là từ khoá mà có lẽ người mới làm quen với Unity sẽ không quen thuộc với nó.

Coroutine là một loại chức năng cho phép thay đổi thời gian xử , có nghĩa là bạn có thể tạm dừng và tiếp tục lại bên trong một đôi khi nó được gọi là xử lý không đồng bộ (về xử lý không đồng bộ sẽ được giới thiệu trong một post khác)

Cách tạo một coroutine:

  • một phương thức với kiểu trả về là IEnumerator
  • chạy với phương thức StartCoroutine
  • chờ đợi 1 frame với yield return null

Ví dụ: Sau khi chờ đợi 1 khung hình thì hiển thị log ra console

Một ví dụ khác: Sau khi chờ đợi 2 giây thì hiển thị log ra console

Ở đây `WaitForSeconds` cho phép chờ đợi một số giây cụ thể trước khi xử lý. Về coroutine chúng ta sẽ cùng tìm hiểu thêm trong một bài viết khác.

enable

Chuyển đổi trạng thái on/off của monobehaviour. Bạn có thể truy cập nó thông qua thuộc tính enable và thay đổi giá trị thành true hoặc false

Các trường hợp không cần sử dụng Monobehaviour

Không phải lúc nào cũng cần sử dụng monobehaviour. Dưới đây là một số trường hợp không cần sử dụng monobehaviour

  1. Các trường hợp không cần sử dụng GameObject
  2. Các trường hợp chỉ sử dụng C#

Các trường hợp không cần sử dụng GameObject

Trước tiên ta sẽ nói về các trường hợp cần sử dụng GameObject: Trường hợp mà bạn cần một thực thể ở trong hierarchy, cửa sổ hierarchy là cửa sổ hiển thị các GameObject đang được sử dụng. Lý do là nó cần được hiển thị lên màn hình và nó thực hiện các chức năng khác nhau. Được hiển thị trên màn hình có nghĩa là có một thực thể trong hệ thống phân cấp hierarchy

Điều này ngược lại với trường hợp bạn không cần sử dụng GameObject. Đây là trường hợp không cần thiết phải có một thực thể trong hệ thống phân cấp. Ví dụ như là một class model định nghĩa dự liệu Các class định nghĩa dữ liệu như trên không sử dụng GameObject như vậy nó không cần kế thừa từ Monobehaviour

Các trường hợp chỉ sử dụng C# thuần tuý

Ví dụ kế thừa monobehaviour là không cần thiết nếu bạn chỉ muốn xử lý tính toán.

Ví dụ: class Ex không cần kế thừa từ monobehaviour vì nó chỉ kiểm tra xem một danh sách có thuộc danh sách khác với vị trí chính xác của các phần tử hay không. nó không cần phải hiển thị lên màn hình và như vậy thì không cần GameObject.

Các vấn đề thường gặp với Monobehaviour

Dưới đây là các vấn đề phổ biến khi sử dụng monobehaviour

  1. không thể đính kèm Monobehaviour vào GameObject
  2. Awake, Start, Update không được gọi
  3. new Monobehaviour bị cấm

Không thể đính kèm Monobehaviour vào GameObject

Khi bạn không thể thêm một class kế thừa từ monobehaviour vào GameObject thông qua AddComponent hoặc kéo thả trong inspector thì bạn có thể kiểm tra những lưu ý dưới đây

Tên của class và tên file phải trùng nhau ví dụ bạn có tập tin CharacterAttack.cs nhưng tên class lại là Character trong trường hợp này bạn không thể đính kèm nó vào GameObject

Lúc đó bạn cần sửa cho tên tệp và tên class đồng nhất

Unity đang xảy ra lỗi biên dịch Lỗi biên dịch có thể được kiểm tra từ cửa sổ Console. Lỗi biên dịch là lỗi không biên dịch được do lỗi cú pháp lập trình. Unity không thể Play trong khi có lỗi biên dịch và bạn không thể đính kèm các tập lệnh ở trạng thái này.

Awake, Start, Update không được gọi

Khi event function không được gọi, điều đầu tiên bạn hãy nghĩ đến đó là GameObject đang không hoạt động.

Không thể new Monobehaviour

Sẽ có lúc bạn cần tạo một Monobehaviour trong thời gian chạy. Bạn muốn sử dụng từ khoá new nhưng nó bị cấm trong Unity

Một thông báo như sau sẽ được hiển thị ra console

You are trying to create a MonoBehaviour using the ’new’ keyword. This is not allowed.
MonoBehaviours can only be added using AddComponent().
Alternatively, your script can inherit from ScriptableObject or no base class at all

Tóm lại là bạn cần sử dụng AddComponent thay thế cho việc new Monobehaviour

Lượt nghé thăm