Dúvida sobre Instanciate
3 participantes
Página 1 de 1
Dúvida sobre Instanciate
Estou criando um método de clique, onde ao clicar no objeto ele deveria criar uma nova cópia do objeto original(Prefab) porém ele cria uma cópia de si mesmo.
Pseudocódigo:
Não estou entendendo o porquê dele substituir o prefab pelo clone durante a execução.
Pseudocódigo:
- Código:
Class onclickNewObject(): MonoBehaviour{
public GameObject esfera; // referencia o prefab que tem esse código atrelado(componente)
void onMouseDown(){
Instanciate(esfera);
}
}
Não estou entendendo o porquê dele substituir o prefab pelo clone durante a execução.
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
Não entendi, quando você executa essa função, a variável esfera muda? Ou o objeto que é instanciado muda?
NKKF- ProgramadorMaster
- PONTOS : 4818
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Dúvida sobre Instanciate
ADSK escreveu:Estou criando um método de clique, onde ao clicar no objeto ele deveria criar uma nova cópia do objeto original(Prefab) porém ele cria uma cópia de si mesmo.
Pseudocódigo:Porém ao fazer isso ele substitui o prefab referenciado(esfera) por uma cópia de si mesmo(esfera(clone)).
- Código:
Class onclickNewObject(): MonoBehaviour{
public GameObject esfera; // referencia o prefab que tem esse código atrelado(componente)
void onMouseDown(){
Instanciate(esfera);
}
}
Não estou entendendo o porquê dele substituir o prefab pelo clone durante a execução.
Que estranho . Isso não era para acontecer, só se voce colocasse:
- Código:
esfera = Instantiate(esfera);
Bom neste caso, tenta fazer assim:
- Código:
Class onclickNewObject(): MonoBehaviour{
public GameObject esfera; // referencia o prefab que tem esse código atrelado(componente)
private GameObject reserva;
void onMouseDown(){
reserva = esfera;
Instantiate(esfera);
if(esfera != null)
{
esfera = reserva;
}
}
}
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
A variável esfera mudaNKKF escreveu:Não entendi, quando você executa essa função, a variável esfera muda? Ou o objeto que é instanciado muda?
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
- Código:
[size=14] public GameObject Hidrogenio;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}[/size]
Se ajudar esse é o código original, onde basicamente ele serve para criar um novo átomo de carbono ligando-o a molécula e estabilizando-o, esse código é um componente que pertence ao prefab hidrogenio, e o gameObject Hidrogenio( primeiro atributo) também referencia esse prefab
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
Voce quer que a variavel nao mude não é?
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
issoPokedlg escreveu:Voce quer que a variavel nao mude não é?
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
No caso é o carbono que está mudando?
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
- Código:
public GameObject Hidrogenio;
public GameObject Carbono;
private GameObject CarbonoReserva;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
CarbonoReserva = Carbono;
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
if(Carbono != null)
{
Carbono = CarbonoReserva;
}
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Ve se isso funciona, se nao funcionar me avise
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
Mesmo utilizando uma variável reserva (Para o Hidrogênio) ele altera a referencia para sua instancia atual, tirando a referência para o prefab originar;Pokedlg escreveu:
- Código:
public GameObject Hidrogenio;
public GameObject Carbono;
private GameObject CarbonoReserva;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
CarbonoReserva = Carbono;
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
if(Carbono != null)
{
Carbono = CarbonoReserva;
}
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Ve se isso funciona, se nao funcionar me avise
1ª Execução:
2ª Execução
Código que eu utilizei:
- Código:
[size=14] public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(HidrogenioReserva,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}[/size]
Utilizei também uma versão onde a variável "HidrogenioReserva" recebia a referência do hidrogenio no método "void Start()" porém o resultado foi o mesmo.
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
Voce esqueceu o if de null, coloque assim:
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(HidrogenioReserva,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
Mesmo assim ele altera a referência do hidrogênioPokedlg escreveu:Voce esqueceu o if de null, coloque assim:
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(HidrogenioReserva,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
Descobri
Última edição por Pokedlg em Sáb Jan 23, 2021 11:50 am, editado 1 vez(es)
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
Ata, descobri, é que voce está instanciando o objeto errado, tente assim:
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
Funcionou?
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
Mesmo assim não funcionou. Vou tentar uma abordagem diferente onde crio um emptyObject com um script q instancie esse prefab e retorne o objeto instanciado pra ver se assim ele funcionaPokedlg escreveu:Ata, descobri, é que voce está instanciando o objeto errado, tente assim:
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Re: Dúvida sobre Instanciate
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Tenta colocar dentro do for. Com o carbono funcionou?
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida sobre Instanciate
O problema em si, é que não é uma instancia nula, ela existe, porém é a instancia do objeto atual. Consegui resolver o problema com o método que eu havia falando antes criando um emptyObject que instancia o Hidrogênio(prefab) e retorna sempre a nova instancia(clone) do objeto original.Pokedlg escreveu:
- Código:
public GameObject Hidrogenio;
private GameObject HidrogenioReserva;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
HidrogenioReserva = Hidrogenio;
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for(int i = 0; i < 3; i++){
hidro = Instantiate(Hidrogenio,carb.transform);
hidros.Add(hidro.GetComponent<Atomo>());
if(Hidrogenio != null)
{
Hidrogenio = HidrogenioReserva;
}
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono){
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(),carbono);
}
Tenta colocar dentro do for. Com o carbono funcionou?
Código do emptyObject:
- Código:
[size=14]public class HidrogenioCreator : MonoBehaviour
{
public GameObject Hidrogenio;
private GameObject HidrogenioDavez;
public GameObject InstanciarHidrogenio(){
HidrogenioDavez = Instantiate(Hidrogenio);
return HidrogenioDavez;
}
}[/size]
novo código de inicialização:
- Código:
[size=14]public GameObject HidrogenioCreator;
public GameObject Carbono;
void OnMouseDown()
{
criarCarbono();
}
void criarCarbono()
{
GameObject carb = Instantiate(Carbono, transform.position, Quaternion.identity);
List<Atomo> hidros = new List<Atomo>();
GameObject hidro;
for (int i = 0; i < 3; i++)
{
hidro = HidrogenioCreator.GetComponent<HidrogenioCreator>().InstanciarHidrogenio();
hidros.Add(hidro.GetComponent<Atomo>());
}
carb.GetComponent<Atomo>().setAllAtomos(hidros);
for (int i = 0; i < 3; i++)
{
carb.GetComponent<Atomo>().getAtomoById(i).addAtomo(carb.GetComponent<Atomo>());
}
atualizarAnterior(carb.GetComponent<Atomo>());
}
void atualizarAnterior(Atomo carbono)
{
this.gameObject.GetComponent<Atomo>().getAtomoById(0).GetComponent<Atomo>().substituirAtomo(this.GetComponent<Atomo>(), carbono);
}[/size]
ADSK- Iniciante
- PONTOS : 1436
REPUTAÇÃO : 2
Respeito as regras :
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Tópicos semelhantes
» Duvida sobre inventario
» Duvida boba sobre UI
» [DÚVIDA] Dúvida sobre script e rigidbody
» Duvida sobre UVs
» Duvida sobre o Box Collider 2D
» Duvida boba sobre UI
» [DÚVIDA] Dúvida sobre script e rigidbody
» Duvida sobre UVs
» Duvida sobre o Box Collider 2D
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos