场景下对象查找
通过类型查找
通过标签查找(FindObjectsOfType)使用GameObject的FindObjectsOfType方法可以根据类型查找场景中所有匹配的对象。
1
| GameObject[] objects = FindObjectsOfType<GameObject>();
|
通过标签查找
通过标签查找(GameObject.FindWithTag)使用GameObject的FindWithTag方法可以根据对象的标签查找匹配的对象。
1
| GameObject obj = GameObject.FindWithTag("Player");
|
通过名称查找
通过名称查找(GameObject.Find)使用GameObject的Find方法可以根据对象的名称查找匹配的对象。
1
| GameObject obj = GameObject.Find("Player");
|
父子对象查找
获取父游戏对象
使用transform.parent可以获取当前游戏对象的父级游戏对象:
1 2 3 4 5
| Transform parent = transform.parent;
GameObject parentGameObject = parent.gameObject;
|
根据名称查找子对象
获取子对象(transform.Find)使用transform的Find方法可以在当前对象的子对象中查找匹配的对象。
1
| Transform child = transform.Find("SubObject");
|
获取子游戏对象
使用transform.GetChild可以获取指定索引的子游戏对象:
1 2 3 4 5
| Transform child0 = transform.GetChild(0);
Transform child1 = transform.GetChild(1);
|
也可以通过transform.childCount获取子游戏对象的总数,然后通过循环获取所有子游戏对象:
1 2 3 4 5 6 7
| for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); GameObject childGameObject = child.gameObject;
}
|
获取所有子对象
可以通过递归的方式获取所有子孙游戏对象:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void GetAllChildren(Transform parent, List<Transform> results) { foreach (Transform child in parent) { results.Add(child); GetAllChildren(child, results); } }
List<Transform> allChildren = new List<Transform>(); GetAllChildren(transform, allChildren);
|
总之,transform组件提供了方便获取父对象和子对象的方法,可以灵活地在场景中查找游戏对象的层级关系。
附近的对象
周围检测
检测指定位置周围的碰撞体。
1 2 3 4 5 6 7 8 9 10 11
| Collider2D[] colliders = Physics2D.OverlapCircleAll( this.transform.position, 100 ); foreach (Collider2D collider in colliders) { if (collider.gameObject.CompareTag("Enemy")) { Debug.Log("发现敌人!"); } }
|
设置layer
下面的写法和上面实现了同样的逻辑。
1 2 3 4 5 6 7 8 9
| Collider2D[] colliders = Physics2D.OverlapCircleAll( this.transform.position, 100, 1 << LayerMask.NameToLayer("Enemy") ); foreach (Collider2D collider in colliders) { Debug.Log("发现敌人!"); }
|
射线检测
使用射线检测两个点之间的碰撞情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Vector2 rayOrigin = this.transform.position; Vector2 rayDirection = Vector2.right;
RaycastHit2D hit = Physics2D.Raycast( rayOrigin, rayDirection, 100, 1 << LayerMask.NameToLayer("Enemy") );
if (hit) { Collider2D collider = hit.collider; Vector2 hitPoint = hit.point; Debug.Log("射中敌人:" + collider.name + "位置:" + hitPoint.ToString()); }
|
查找组件
通过组件查找(GetComponent)使用gameObject的GetComponent方法可以获取对象上的指定组件。
1
| Rigidbody rb = gameObject.GetComponent<Rigidbody>();
|
常见示例
查找文字
TextMeshPro-Text (Ul)
1 2 3
| TextMeshProUGUI _phText; _phText = transform.Find("TextPH").GetComponent<TextMeshProUGUI>(); _phText.text = $"{ZGameData.playerHp}/{ZGameData.playermaxHp}";
|
查找图片
1 2 3
| Image _bloodbar; _bloodbar = transform.Find("ui-bloodbar").GetComponent<Image>(); _bloodbar.fillAmount = 1.0f * ZGameData.playerHp / ZGameData.playermaxHp;
|