Vários métodos para obter objetos ou componentes do objeto do jogo no Unity

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.FindObtenha 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:
  1. Ele percorrerá toda a cena atual, o que é menos eficiente
  2. Só pode obter objetos de objeto de jogo ativos

Transform.Find

Transform.FindVocê 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
  1. 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.
  2. TransformO componente é retornado , não GameObjecto 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 Unity
  • GameObject.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.parentEste é 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.roota 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.GetComponentDowaGameObject.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.GetComponentDowaGameObject.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 ~

Acho que você gosta

Origin blog.csdn.net/a924282761/article/details/129986355
Recomendado
Clasificación