Estou criando o que é essencialmente meu próprio sistema pré-fabricado. Objetos de jogo são definidos por um arquivo de dados legível por humanos. Gostaria de criar um GameObject vazio, carregá-lo com os componentes definidos no arquivo de dados e tê-lo pronto e aguardando uma Instantiate()
chamada. No entanto, sempre que eu uso GameObject go = new GameObject()
um novo objeto de jogo é adicionado à cena.
Usando o Unity pré-fabricado, eu posso carregar um pré-fabricado como um GameObject, e ele não é adicionado à cena. (Veja o exemplo abaixo)
A lógica por trás disso é que eu gostaria de ter uma lista que contenha GameObjects, alguns gerados pelo carregamento de prefabs do Unity e outros criados pelo meu sistema de prefab personalizado. Isso precisa acontecer em tempo de execução e não pode envolver o Unity Editor (já que o ideal é que os usuários finais possam definir seus próprios arquivos de dados).
Como posso criar um novo GameObject, sem o Unity instanciando-o automaticamente para mim?
Por exemplo, eu posso fazer uma ligação assim:
Resources.LoadAll("PrefabsDirectory", typeof(GameObject))
E receberei uma lista de GameObjects, nenhum dos quais é adicionado à cena quando a chamada é feita. Essencialmente, estou criando um LoadAll
método para meus próprios prefabs e, da mesma forma, não quero instanciar os GameObjects quando a chamada é feita.
fonte
Destroy
o GameObject. O que o remove da cena e o libera, tornando-o inutilizável.go.SetActive(false)
é a melhor maneira de criar algo como um pool de objetos. Não é exatamente o que você deseja, mas talvez você possa ter um pequeno grupo de objetos inativos que são posteriormente clonados para sua instanciação personalizada.Respostas:
Você pode alterar o hideFlags do GameObject?
Eu apenas tentei executar isso:
... e está lá, mas não está na hierarquia. Tecnicamente, ele está em cena, mas você não o vê até mudar os sinalizadores de volta para HideFlags.None. Não é a resposta que você está procurando, mas pelo menos no que diz respeito a liberar isso para os desenvolvedores, é mais limpo do que agrupar seus objetos.
fonte
Você não pode fazer exatamente isso, infelizmente. No entanto, você pode realizar o mesmo padrão de design (ou seja, abstrair a construção de seus objetos e simplesmente chamá-los com um único comando posteriormente) através de um padrão de Fábrica .
Quando você quiser um objeto, chame algo como
Factory.CreateGameEntity()
, e esse método tratará de tudo nos bastidores.fonte
GetComponent<>() != null
. Com meus arquivos de dados, o analisador precisa procurar o componente correto nos dados. O mesmo para obter um valor de dentro de um componente e assim por diante. AGameObject
classe fornece muitas funcionalidades que precisam ser duplicadas pelo analisador.Não há como fazê-lo
go = new GameObject();
sem adicioná-lo à cena.Estou trabalhando em um RTS em que a base de jogadores precisa ser persistente e, essencialmente, serializamos tudo o que eles fizeram e carregamos de volta em tempo de execução usando ativos modificados da loja.
A maioria é impressa em XML ou JSON, por isso é bastante simples carregar o arquivo e manipulá-lo como desejar.
fonte
O caminho certo é fazer uma pré-fabricada, você a aloca como um Objeto; então, sempre que quiser instanciar, use a referência desse Objeto e a projete como um GameObject.
ex:
fonte
Para carregar uma pré-fabricada em uma variável para instanciar mais tarde, você usaria o seguinte código:
Eu fiz isso em um projeto com o Unity 5.5. Ele estará disponível para instanciar, mas não na cena ou parte da hierarquia, até ser instanciado normalmente.
fonte