- vừa được xem lúc

SerializeField, Header và một số attributes trong Unity3D

0 0 9

Người đăng: Phuong Le

Theo Viblo Asia

Phuongne, Th10 22, 2020


Attribute trong Unity là tính năng được sử dụng rất nhiều trong scripts, hầu như class nào mình cũng xài tới nó. Đồng thời phần cuối series mình cũng sẽ nói cách tạo một custom attribute.

1. SerializeField attribute, chỉnh sửa các biến private trên inspector

Trong lập trình OOP, chúng ta đã biết về tính đóng gói, cơ bản như sau “Một class chỉ nên “trưng” ra các biến, các hàm nào bên ngoài cần sử dụng như là API, còn lại các hàm và biến (state) xử lý nội bộ trong class chúng ta đều đặt private.”

Tuy nhiên các biến private thì không được Unity serialize lên inspector để cho chúng ta hoặc các game designer chỉnh sửa và cân bằng game, đó là lý do chúng ta cần SerializeField:

Vector3 targetPosition; [SerializeField] float moveDuration = 0.1f;

Một số lưu ý về khả năng [SerializeField] của Unity:

  • Không thể serialize biến static
  • Không thể serialize các field (get set của biến)
  • Không serialize được kiểu Dictionary
  • Chỉ có thể serialize các kiểu dữ liệu được đánh dấu [Serializable] (đọc phần dưới)

2. System.Serializable attribute, vì sao field không hiện lên inspector?

Ở attribute này mình sẽ không nói quá sâu bởi thuộc về package System của C#, tuy nhiên nó liên quan tới cách mà Unity serialize lên inspector nên mình đề cập vào.

public class Person { public string fullname; [SerializeField] string firstName; private string lastName;
}

Ở trên mình có 1 class Person non-MonoBehaviour đơn giản gồm 3 biến: public fullname, [SerializeField] firstName và private lastName.

public class School : MonoBehaviour
{ public Person principal;
}

Các bạn cũng có thể đoán được là nó không xuất hiện trên Inspector như tiêu đề.

image.png

School Component
[System.Serializable]
public class Person { public string fullname; [SerializeField] string firstName; private string lastName;
}

Sau khi mình thêm [System.Serializable] hoặc [Serializable] nếu các bạn using System;, thì Unity đã có thể hiểu để serialize.

image.png

School Component sau khi sử dụng Serializable cho Person

Ngoài ra để đảm bảo một thực thể (instance) của custom class có thể xuất hiện trên Inspector, thì class đó cần phải tuân theo các quy định về serialization:

  1. Có attribute [Serializable]
  2. Không phải static
  3. Không được là abstract
  4. Không phải generic

Để hiểu rõ hơn về serialization là gì và làm gì thì các bạn có thể click vào link ở mục 3 (mục dưới)

3. HideInInspector attribute, giấu biến public trên inspector

Cái này trái ngược với [SerializeField], attribute này có khả năng ẩn các biến public các biến được đánh dấu [SerializeField] trên inspector, tức là độ ưu tiên cao hơn [SerializeField]

public class School : MonoBehaviour
{ [HideInInspector] public Person principal;
}

Tuy nhiên thuộc tính này không làm mất khả năng serialization của biến.

“Khả năng serialization của biến là gì?”

Tham khảo bài viết: Script Serialization trong Unity3D

4. Sử dụng attributes Header, Space, Range, TextArea… với inspector

Các attributes ở dưới giúp chúng ta tổ chức lại các biến xuất hiện trên inspector một cách có tổ chức, tăng khả năng đọc hiểu (readability).

Header attribute: Tạo tiêu đề cho các biến

public class School : MonoBehaviour
{ [Header("Reference to Manager")] public Person principal; public Person directorate; [Header("Reference to Teaching fields")] public Person[] teachers; public Person[] students;
}

image.png

Sử dụng attribute \[Header\]

Space: tạo khoảng trống trên inspector

[Header("Reference to Manager")]
public Person principal;
public Person directorate; [Header("Reference to Teaching fields")]
[Space(100)]
public Person[] teachers;
public Person[] students;

image.png

Sử dụng Space attribute

Range: tạo slider cho giá trị của biến, phủ hợp với các biến có giá trị thuộc [min, max]

[Header("Reference to Teaching fields")]
public Person[] teachers;
public Person[] students; [Space(30)]
[Range(1, 100)]
public int staff;

image.png

Tạo thanh slider cho staff giá trị từ 1 – 100

TextArea: tạo một container cho string, có chiều cao linh hoạt và khả năng cuộn (scrollable)

[Range(1, 100)]
public int staff; [TextArea]
public string description;

image.png

TextArea cho biến string Description

Tooltip: cung cấp mô tả cho biến trên inspector

[TextArea]
[Tooltip("This is description for this school")]
public string description;

Khi đưa chuột hover (trỏ) vào biến Description này trên inspector, xuất hiện tooltip:

image.png

Tooltip cho biến description

Claims

Bài viết được đăng vào 2020, chỉ có giá trị tham khảo các bạn nhé 😉

Nguồn tham khảo

Unity Document – Attributes

Improving the Unity Editor Inspector with Unity Attributes

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tạo setting game trên inspector.

. Chào các bạn,. Hôm nay chúng ta sẽ cùng tạo 1 setting/config cho game trên inspector nhé. Câu trả lời đó là khi chúng ta cần 1 cái gì đó để thao tác trong editor, trực quan nhất, không cần sửa code để cập nhật dữ liệu.... Và hẳn các bạn cũng từng làm việc với những value trên inspector rồi, ví dụ

0 0 22

- vừa được xem lúc

Hướng dẫn đưa nhân vật từ Mixamo vào demo.

. Chào các bạn. Bài này chúng ta chỉ tìm hiểu cách để lấy model, animation về, setting sao cho nó chạy được trong Unity để làm demo là ngon rồi nhé . Bước 1: Đăng nhập. Hãy tạo tài khoản nếu các bạn chưa có.

0 0 25

- vừa được xem lúc

Cơ bản về Rigidbody trong Unity3D

Phuong Le at 31-10-2019 - phuongne. Bài viết từ 2019 nên chỉ có giá trị tham khảo bạn nhé . . Rigidbody là gì.

0 0 18

- vừa được xem lúc

Một số folder đặc biệt trong Unity

Phuong Le 2019 - phuongne. Bài viết từ 2019 nên chỉ có giá trị tham khảo bạn nhé .

0 0 15

- vừa được xem lúc

Coroutine trong Unity là gì? Có liên quan tới Threads hay không?

Phuongne, Th11 17, 2019. Sơ qua một chút về Coroutine và StartCoroutine(.

0 0 11

- vừa được xem lúc

So sánh nhẹ Coroutine và Invoke

Phuongne - 31-10-2019. . Roài, đây sẽ là một bài viết ngắn nên mình đi vào chi tiết luôn, khởi mở đầu giới thiệu dài dòng nhá anh em. Coroutine với Invoke là gì.

0 0 17