Posição bloco/tile endless 2D
2 participantes
Página 1 de 1
Posição bloco/tile endless 2D
Olá pessoal! Estou precisando de ajuda para posicionar a plataforma em um endless runner. Estou fazendo isso usando o Size.X do BoxCollider2D para calcular o tamanho do bloco a ser colocado em cena + a posição do último bloco em cena. Algo assim:
- Eu movimento a plataforma e não o player. Li no forum da unity que pode gerar problemas de float depois de muito tempo de execução;
- Todos eles possuem seu próprio tamanho (mapeando esse valor através do size.x do BoxCollider2D). Assim poderia fazer blocos de tamanho variado, mas no momento estou mantendo todos com o mesmo tamanho (aproximadamente 40) por questão de verificação e teste da mecânica.
- Quando o bloco sai da visão da câmera, ele sorteia randomicamente o próximo bloco a ser posicionado.
- Esse próximo bloco vai receber sua nova posição com base na posição do último bloco em cena + a soma de seus tamanhos
"Randomizar" é um método que retorna um bloco;
"segundo" é o último elemento na cena (a nova posição é após ele..."colado" nele);
Eu pego o tamanho do bloco dividido na metade para caso tiver blocos com tamanhos variado. Como no momento todos tem mesmo tamanho, tanto blocoLength e seg possuem o mesmo valor que é 20;
O -0.1f ali foi para corrigir alguns blocos que não conectava/encaixa um no outro (ajudou, mas como pode ver no vídeo, ele tem esse erro de entrar demais um no outro...talvez aqui pode estar o erro e não vejo como arrumar)
Não sei como fazer esse movimento funcionar corretamente, não tenho conhecimento suficiente para solucionar. Se alguém tiver alguma dica ou uma maneira melhor (mas que não envolva destroy e instantiate constante) eu ficaria grato. Realmente não to avançando por causa disso.
Segue um vídeo que fiz para mostrar como o bloco se comporta e como ele entra no outro:
- Eu movimento a plataforma e não o player. Li no forum da unity que pode gerar problemas de float depois de muito tempo de execução;
- Todos eles possuem seu próprio tamanho (mapeando esse valor através do size.x do BoxCollider2D). Assim poderia fazer blocos de tamanho variado, mas no momento estou mantendo todos com o mesmo tamanho (aproximadamente 40) por questão de verificação e teste da mecânica.
- Quando o bloco sai da visão da câmera, ele sorteia randomicamente o próximo bloco a ser posicionado.
- Esse próximo bloco vai receber sua nova posição com base na posição do último bloco em cena + a soma de seus tamanhos
- Código:
blocoPlataforma = Randomizar(platfNivel1.Length, platfNivel1);
float blocoLength = blocoPlataforma.GetComponent<BoxCollider2D>().size.x / 2;
float seg = segundo.GetComponent<BoxCollider2D>().size.x / 2;
Vector2 aux = new Vector2((seg + blocoLength) - 0.1f, areaInfos[area].posBloco1.y); ;
blocoPlataforma.transform.position = new Vector2(segundo.transform.position.x + aux.x, aux.y);
"Randomizar" é um método que retorna um bloco;
"segundo" é o último elemento na cena (a nova posição é após ele..."colado" nele);
Eu pego o tamanho do bloco dividido na metade para caso tiver blocos com tamanhos variado. Como no momento todos tem mesmo tamanho, tanto blocoLength e seg possuem o mesmo valor que é 20;
O -0.1f ali foi para corrigir alguns blocos que não conectava/encaixa um no outro (ajudou, mas como pode ver no vídeo, ele tem esse erro de entrar demais um no outro...talvez aqui pode estar o erro e não vejo como arrumar)
Não sei como fazer esse movimento funcionar corretamente, não tenho conhecimento suficiente para solucionar. Se alguém tiver alguma dica ou uma maneira melhor (mas que não envolva destroy e instantiate constante) eu ficaria grato. Realmente não to avançando por causa disso.
Segue um vídeo que fiz para mostrar como o bloco se comporta e como ele entra no outro:
LGC- Iniciante
- PONTOS : 1679
REPUTAÇÃO : 2
Respeito as regras :
Re: Posição bloco/tile endless 2D
Olá, tenho um projeto em execução que tem um mecanismo parecido com o que você esta tentando fazer, e eu fiz um simples cálculo com dois elementos: posição da plataforma atual e sua escala no eixo X.
Inicialmente eu pego a posição da ultima plataforma instanciada na cena, vou chamar de plataforma1, logo depois pego o valor da sua escala no eixo X e divido por dois (igual você fez no seu script, só que com a escala do colisor).
Logo após eu pego a escala da minha próxima plataforma a qual vou chamar de plataforma2 e divido por dois também, após isso já tenho as informações necessárias:
Aqui eu já tenho a posição da borda direita da plataforma1
Agora basta adicionar ao eixo X a escala da plataforma2 dividido por dois:
Agora a plataforma2 já esta devidamente posicionada e junta da plataforma1, uma dica que deve ser levada em consideração é que a escala dos objetos, ou melhor das plataformas sejam inteiras (int) para evitar qualquer problema.
Espero que tenha ajudado e boa sorte!
Inicialmente eu pego a posição da ultima plataforma instanciada na cena, vou chamar de plataforma1, logo depois pego o valor da sua escala no eixo X e divido por dois (igual você fez no seu script, só que com a escala do colisor).
Logo após eu pego a escala da minha próxima plataforma a qual vou chamar de plataforma2 e divido por dois também, após isso já tenho as informações necessárias:
Aqui eu já tenho a posição da borda direita da plataforma1
- Código:
Vector2 novaPosicao = new Vector2 (plataforma1.position.x + (plataforma1.localScale.x / 2), 0.0f);
Agora basta adicionar ao eixo X a escala da plataforma2 dividido por dois:
- Código:
novaPosicao.x += plataforma2.localScale / 2;
plataforma2.position = novaPosicao;
Agora a plataforma2 já esta devidamente posicionada e junta da plataforma1, uma dica que deve ser levada em consideração é que a escala dos objetos, ou melhor das plataformas sejam inteiras (int) para evitar qualquer problema.
Espero que tenha ajudado e boa sorte!
rafaelllsd- ProgramadorMaster
- PONTOS : 5241
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: Posição bloco/tile endless 2D
- Código:
Vector2 novaPosicao = new Vector2 (plataforma1.position.x + (plataforma1.localScale.x / 2), 0.0f);
Agora basta adicionar ao eixo X a escala da plataforma2 dividido por dois:
- Código:
novaPosicao.x += plataforma2.localScale / 2;
plataforma2.position = novaPosicao;
Agora a plataforma2 já esta devidamente posicionada e junta da plataforma1, uma dica que deve ser levada em consideração é que a escala dos objetos, ou melhor das plataformas sejam inteiras (int) para evitar qualquer problema.
Espero que tenha ajudado e boa sorte!
Obrigado pela ajuda, @rafaelllsd! Mas aplicando dessa forma não funcionou. Agradeço a dica de trabalhar com número inteiro, facilitou algumas coisas aqui. Um detalhe simples e bobo que não percebi rs
O problema persiste mas vou pensar em algo. Talvez refazer todos os blocos, pode ser ele o problema.
LGC- Iniciante
- PONTOS : 1679
REPUTAÇÃO : 2
Respeito as regras :
Tópicos semelhantes
» Alguem saberia se teria algum tutorial ou algo q faça contruir tipo de bloco em bloco (tipo rust, unturned etc)
» Como transformo a posição de um objeto em outra posição?
» Como executar outros blocos fora do bloco static void Main()
» iniciar jogo com uma cena desativada e ativá-la ao colidir com bloco desativando as outras
» Ajuda com script movimento por Grid Tile no Navmesh
» Como transformo a posição de um objeto em outra posição?
» Como executar outros blocos fora do bloco static void Main()
» iniciar jogo com uma cena desativada e ativá-la ao colidir com bloco desativando as outras
» Ajuda com script movimento por Grid Tile no Navmesh
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos