Diretório de artigos
prefácio
No desenvolvimento real do projeto de unidade, muitas vezes é necessário obter vários objetos no jogo, como jogadores (Player), monstros (Monster) ou outros, então existe alguma maneira de obtê-los rapidamente? Vamos apresentar a unidade para obter objetos do jogo vários métodos
Obter objeto pelo nome do objeto
GameObject.Find
GameObject.Find
Obtenha o objeto pelo nome do objeto do jogo
- Instruções
// name -> 要查找的游戏物体的名称 (可以带路径)
// path: Player/Arm/Hand/Finger
GameObject obj = GameObject.Find("Cube");
GameObject obj = GameObject.Find("Player/Arm/Hand/Finger");
- deficiência:
- Ele percorrerá toda a cena atual, o que é menos eficiente
- Só pode obter objetos de objeto de jogo ativos
Transform.Find
Transform.Find
Você pode encontrar um subobjeto com um nome especificado em um subobjeto de um objeto de jogo e retornar o componente Transform do subobjeto
- Instruções
// 查找一个名为 "Player" 的游戏对象
Transform playerTransform = transform.Find("Player");
GameObject playerObj = playerTransform.gameObject;
- deficiência
- O nome do objeto de pesquisa deve ser
唯一
, caso contrário, um objeto incorreto pode ser retornado. Se houver vários subobjetos com o mesmo nome, apenas um deles será retornado e não há garantia de qual deles será retornado. Transform
O componente é retornado , nãoGameObject
o objeto. Se você precisar operar as propriedades e métodos do objeto GameObject, precisará obter o objeto GameObject por meio da propriedade Transform.gameObject.
Obter objeto por tag de objeto
GameObject.FindWithTag
Este método pode encontrar o objeto GameObject com o rótulo especificado na cena e retornar o primeiro objeto correspondente e ativo .
- Instruções
// 查找 "Player" 标签的游戏物体,并返回第一个
GameObject obj = GameObject.FindWithTag("Player");
GameObject.FindGameObjectWithTag
GameObject.FindWithTag
é o mesmo que
- A diferença é que
GameObject.FindGameObjectWithTag()
O método é implementado internamente pelo motor UnityGameObject.FindWithTag()
Métodos são implementados usando código.
Portanto, GameObject.FindGameObjectWithTag()
o método pode ser mais eficiente , e GameObject.FindWithTag()
o método pode ser mais flexível e pode ser customizado de acordo com as necessidades.
GameObject.FindGameObjectsWithTag
Este método encontrará todos os objetos GameObject cuja tag é "nome da tag" na cena e os retornará para a variável objectsWithTag na forma de array GameObject.
- Instruções
GameObject[] objectsWithTag = GameObject.FindGameObjectsWithTag("标签名称");
Obter objetos por meio de relacionamentos hierárquicos
Transform.GetChild
Esse método pode obter o Transform filho do componente Transform atual e o valor de retorno é um objeto Transform. Você pode usar esse método para percorrer toda a hierarquia e obter cada objeto filho na hierarquia.
- Instruções
Transform childTransform = transform.GetChild(index);
Entre eles, index é o índice do objeto filho do componente Transform atual, começando em 0. Por exemplo, transform.GetChild(0) significa obter o primeiro objeto filho do componente Transform atual.
Depois de obter o componente Transform do objeto filho, você pode usar transform.gameObject para obter o objeto GameObject do objeto filho. Se você precisar obter todos os objetos filho, poderá usar a propriedade Transform.childCount para obter o número de objetos filho e, em seguida, usar um loop for para percorrer para obter cada objeto filho, conforme mostrado no exemplo a seguir:
int childCount = transform.childCount;
for (int i = 0; i < childCount; i++)
{
GameObject childGameObject = transform.GetChild(i).gameObject;
// TODO: 对子对象进行处理
}
Deve-se observar que o método Transform.GetChild() só pode obter objetos filhos diretos.Se você precisar obter objetos mais profundos, poderá usar a pesquisa recursiva. Ao mesmo tempo, é necessário garantir que o objeto de destino seja único na estrutura hierárquica, caso contrário, será necessária uma pesquisa mais complicada.
transform.parent
transform.parent
Este é um atributo. Você pode obter o objeto pai do objeto. Se você atribuir um valor a ele, poderá alterar o objeto pai do objeto atual. Quando o valor for nulo, ele será colocado no topo.
- Instruções
// 例如,以下代码可以获取当前 GameObject 的父级 GameObject:
Transform parentTransform = transform.parent;
// 以下代码可以将当前 GameObject 的父级设置为另一个 GameObject:
Transform newParentTransform = otherGameObject.transform;
transform.parent = newParentTransform;
Transform.root
Transform.root()
Você pode obter o Transform raiz onde o Transform está localizado. O Transform raiz é o Transform mais alto na cena, ele não tem Transform pai.
- Instruções
GameObject rootGameObject = transform.root.gameObject;
Deve-se observar que, para o componente Transform de um GameObject, seu Transform raiz geralmente é o GameObject raiz na cena. No entanto, se o GameObject estiver aninhado como um filho de outro GameObject, seu Transform raiz será o GameObject pai mais alto.
Além disso, Transform.root
a propriedade é somente leitura e não pode ser modificada.Se você precisar modificar o GameObject raiz onde o GameObject está localizado, você pode usar transform.SetParent()
o método para defini-lo.
obter componente
GameObject.GetComponent<T>()
Obtenha referências a outros tipos de componentes do objeto atual.
- Instruções
// 获取当前物体的 Rigidbody 组件
Rigidbody rb = GetComponent<Rigidbody>();
Tente evitar chamá-lo várias vezes por quadro, pois pode causar problemas de desempenho. Se você precisar buscar componentes a cada quadro, considere usar um cache ou salvar a referência do componente em uma variável para melhorar o desempenho.
GameObject.GetComponents<T>()
Obtenha todas as referências de componentes do objeto atual.
- Instruções
// 例如,以下代码可以获取当前 GameObject 上的所有 MeshRenderer 组件:
MeshRenderer[] meshRenderers = GetComponents<MeshRenderer>();
// 例如,以下代码可以获取当前 GameObject 上的所有组件:
Component[] objs = GetComponents<Component>();
GameObject.GetComponentInParent<T>()
Este método obtém se um componente do tipo especificado existe no pai do componente. Este método pesquisará a cadeia pai do componente até encontrar um componente do tipo especificado ou alcançar o objeto raiz da cena. Se um componente elegível for encontrado, uma referência a esse componente será retornada, caso contrário, null será retornado.
- Instruções
// 例如,以下代码可以获取当前 GameObject 的父级中是否存在 Rigidbody 组件:
Rigidbody parentRigidbody = GetComponentInParent<Rigidbody>();
GameObject.GetComponentsInParent<T>()
GameObject.GetComponent
DowaGameObject.GetComponents
GameObject.GetComponentInChildren<T>()
Este método obtém se um componente do tipo especificado existe entre os filhos deste componente. Esse método pesquisa a cadeia filho do componente até encontrar um componente do tipo especificado ou atingir o último filho do GameObject. Se um componente elegível for encontrado, uma referência a esse componente será retornada, caso contrário, null será retornado.
- Instruções
// 例如,以下代码可以获取当前 GameObject 的子级中是否存在 MeshRenderer 组件:
MeshRenderer childMeshRenderer = GetComponentInChildren<MeshRenderer>();
Vale ressaltar que tanto o método GetComponentInParent() quanto o método GetComponentInChildren() irão procurar por componentes. Se houver um grande número de GameObjects e componentes na cena, isso pode afetar o desempenho do jogo, por isso precisa ser usado com cautela .
GameObject.GetComponentsInChildren<T>()
GameObject.GetComponent
DowaGameObject.GetComponents
Posfácio
O acima é o método básico para obter objetos ou componentes do jogo na unidade. Se houver outros métodos ou omissões, adicione-os.
aproveite ~