Tất cả các cách lấy Reference của một GameObject
· about 5 mins readTất cả các cách lấy Reference của một GameObject
Để lấy reference của một GameObject, phần tử, thành phần… trong game, bạn có thể sử dụng một số cách sau đây:
• Sử dụng phương thức GameObject.Find hoặc GameObject.FindWithTag để tìm kiếm một GameObject theo tên hoặc tag. Ví dụ:
// Tìm kiếm một GameObject theo tên
GameObject someGameObject = GameObject.Find("GameObjectName");
// Tìm kiếm một GameObject theo tag
GameObject someGameObject = GameObject.FindWithTag("SomeTagName");
• Sử dụng phương thức GetComponent hoặc GetComponentInChildren để lấy một thành phần của một GameObjec. Lưu ý là thành phần này phải là Component hoặc MonoBehaviour. Ví dụ:
// Lấy một thành phần MeshRenderer của một GameObject
MeshRenderer meshRenderer = someGameObject.GetComponent<MeshRenderer>();
// Lấy một thành phần Rigidbody của một GameObject hoặc con của nó
Rigidbody rigidbody = someGameObject.GetComponentInChildren<Rigidbody>();
• Sử dụng phương thức FindObjectOfType hoặc FindObjectsOfType của UnityEngine.Object để tìm kiếm một hoặc nhiều GameObject có chứa một thành phần cụ thể. Ví dụ:
// Tìm kiếm một GameObject có chứa thành phần AudioSource
AudioSource audioSource = FindObjectOfType<AudioSource>();
// Tìm kiếm tất cả các GameObject có chứa thành phần Light
Light[] lights = FindObjectsOfType<Light>();
• Sử dụng phương thức Physics.Raycast hoặc Physics.OverlapSphere để tìm kiếm các GameObject có va chạm với một tia hoặc một hình cầu. Ví dụ:
// 1. Tạo một tia từ vị trí và hướng của camera
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 2. Tạo một biến để lưu kết quả va chạm
RaycastHit hit;
// 3. Kiểm tra xem tia có va chạm với một GameObject nào không
if (Physics.Raycast(ray, out hit))
{
// 4. Lấy GameObject bị va chạm
GameObject hitObject = hit.collider.gameObject;
}
// 1. Tạo một hình cầu có bán kính 5 tại vị trí (0, 0, 0)
Vector3 center = Vector3.zero;
float radius = 5f;
// 2. Tìm kiếm tất cả các GameObject có va chạm với hình cầu
Collider[] colliders = Physics.OverlapSphere(center, radius);
// 3. Duyệt qua mảng các Collider
foreach (Collider collider in colliders)
{
// 4. Lấy GameObject bị va chạm
GameObject hitObject = collider.gameObject;
}
• Sử dụng phương thức transform.Find hoặc transform.GetChild để tìm kiếm một GameObject con của một GameObject cha. Ví dụ:
// Tìm kiếm một GameObject con theo tên
Transform childTransform = someGameObject.transform.Find("ChildName");
// Tìm kiếm một GameObject con theo chỉ số
Transform childTransform = someGameObject.transform.GetChild(0);
• Sử dụng phương thức transform.parent hoặc transform.root để lấy một GameObject cha hoặc gốc của một GameObject con. Ví dụ:
// Lấy GameObject cha của một GameObject con
Transform parentTransform = someGameObject.transform.parent;
// Lấy GameObject gốc của một GameObject con
Transform rootTransform = someGameObject.transform.root;
• Khai báo một biến public hoặc [SerializeField] để lấy reference của một GameObject, phần tử, thành phần… trong Inspector. Ví dụ:
// Khai báo một biến public để lấy reference của một GameObject
public GameObject someGameObject;
// Khai báo một biến [SerializeField] để lấy reference của một thành phần
[SerializeField] private Rigidbody someRigidbody;
Ví dụ:
// TÌM bằng phương thức của Object (sử dụng khi tìm trực tiếp đối tượng MonoBehaviour không phải GameObject)
Object_a = FindObjectOfType<Object_A>(); // tìm thấy vì Scrip A được attach vào Object A
Object_b = FindObjectOfType<Object_B>(); // tìm thấy vì Scrip B được attach vào Object B_1
Object_c = FindObjectOfType<Object_C>(); // null - không tìm thấy vì Scrip C không được attach vào đâu cả
// TÌM bằng phương thức của GameObject (sử dụng để tìm GameObject và thao tác với GameObject)
var objectA = GameObject.Find("ObjectA"); // match tên - tìm thấy, ko có children ngoài transform
var objectB = GameObject.Find("ObjectB"); // match tên - tìm thấy, có 1 child là ObjecB_1
var objectC = GameObject.Find("ObjectC"); // match tên - tìm thấy, có 2 child là ObjectC_1 và Object_C2
var a = GameObject.FindWithTag("TagA"); // không tìm thấy vì ko sử dụng TagA
var b = GameObject.FindGameObjectWithTag("TagB"); // tìm thấy ObjectB đầu tiên (ko phải ObjectB_1)
var c = GameObject.FindGameObjectsWithTag("TagC"); // mảng GameObject[3]
