Tất cả các cách tương tác, gọi hàm, truyền nhận dữ liệu giữa các GameObject
· about 4 mins read- Gọi một method của một GameObject khác từ GameObject hiện tại
- Các cách truyền và nhận dữ liệu từ GameObject này sang GameObject khác.
Gọi một method của một GameObject khác từ GameObject hiện tại
• Sử dụng phương thức GetComponent hoặc GetComponentInChildren để lấy một thành phần của một GameObject khác, và sau đó gọi method của thành phần đó. Ví dụ:
// Lấy một thành phần ScriptA của một GameObject khác
ScriptA scriptA = otherGameObject.GetComponent<ScriptA>();
// Gọi một method của ScriptA
scriptA.SomeMethod();
• Sử dụng phương thức SendMessage hoặc BroadcastMessage để gửi một message đến một GameObject khác, và sau đó xử lý message đó trong method của GameObject đó. Ví dụ:
// Gửi một message đến một GameObject khác
otherGameObject.SendMessage("SomeMessage");
// Xử lý message đó trong method của GameObject đó
void SomeMessage()
{
// Làm gì đó
}
• Sử dụng phương thức Invoke hoặc StartCoroutine để gọi một method của một GameObject khác với một độ trễ hoặc một cách liên tục. Ví dụ:
// Gọi một method của một GameObject khác với một độ trễ 5 giây
otherGameObject.Invoke("SomeMethod", 5f);
// Gọi một method của một GameObject khác một cách liên tục
otherGameObject.StartCoroutine("SomeMethod");
• Sử dụng phương thức AddListener để đăng ký một method của một GameObject hiện tại với một event của một GameObject khác, và sau đó gọi method đó khi event được kích hoạt. Ví dụ:
// Đăng ký một method của một GameObject hiện tại với một event của một GameObject khác
otherGameObject.someEvent.AddListener(SomeMethod);
// Gọi method đó khi event được kích hoạt
otherGameObject.someEvent.Invoke();
Các cách truyền và nhận dữ liệu từ GameObject này sang GameObject khác.
• Sử dụng biến public hoặc [SerializeField] để lưu trữ dữ liệu trong một GameObject, và sau đó gán reference của GameObject đó cho một GameObject khác trong Inspector. Ví dụ:
// Khai báo một biến public để lưu trữ dữ liệu kiểu int
public int someData;
// Khai báo một biến [SerializeField] để lưu trữ reference của một GameObject khác
[SerializeField] private GameObject otherGameObject;
• Sử dụng phương thức GetComponent hoặc GetComponentInChildren để lấy một thành phần của một GameObject khác, và sau đó truy cập vào dữ liệu của thành phần đó. Ví dụ:
// Lấy một thành phần ScriptA của một GameObject khác
ScriptA scriptA = otherGameObject.GetComponent<ScriptA>();
// Truy cập vào dữ liệu của ScriptA
int someData = scriptA.someData;
• Sử dụng phương thức SendMessage hoặc BroadcastMessage để gửi một message đến một GameObject khác, và sau đó xử lý message đó trong method của GameObject đó. Ví dụ:
// Gửi một message đến một GameObject khác, kèm theo một dữ liệu kiểu int
otherGameObject.SendMessage("SomeMessage", 10);
// Xử lý message đó trong method của GameObject đó, và lấy dữ liệu kiểu int
void SomeMessage(int someData)
{
// Làm gì đó với someData
}
• Sử dụng phương thức Invoke hoặc StartCoroutine để gọi một method của một GameObject khác, và sau đó truyền dữ liệu vào method đó. Ví dụ:
// Gọi một method của một GameObject khác, và truyền vào một dữ liệu kiểu int
otherGameObject.Invoke("SomeMethod", 10);
// Định nghĩa method đó, và nhận dữ liệu kiểu int
void SomeMethod(int someData)
{
// Làm gì đó với someData
}
• Sử dụng phương thức AddListener để đăng ký một method của một GameObject hiện tại với một event của một GameObject khác, và sau đó truyền dữ liệu vào event đó. Ví dụ:
// Đăng ký một method của một GameObject hiện tại với một event của một GameObject khác
otherGameObject.someEvent.AddListener(SomeMethod);
// Gọi event đó, và truyền vào một dữ liệu kiểu int
otherGameObject.someEvent.Invoke(10);
// Định nghĩa method đó, và nhận dữ liệu kiểu int
void SomeMethod(int someData)
{
// Làm gì đó với someData
}
Ví dụ:
// SendMessage, BroadcastMessage có ở cả gameObject và MonoBehaviour, nhưng Invoke, StartCoroutine thì chỉ có trên MonoBehaviour
top1.SendMessage("Log"); // hoặc objectC.BroadcastMessage("Log"); // BroadcastMessage call tất cả, SendMessage chỉ THIS
top1.SendMessage("LogPrivate"); // call tất cả, kể cả private
top1.SendMessage("SpecialMethod"); // log lỗi nếu không tồn tại methodName
