[RESOLVIDO] Insâncias sendo sebrepostas
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Insâncias sendo sebrepostas
Olá a todos, estou desenvolvendo um script que faz o chão se mover e faz instância de alguns objetos no piso, porém os objetos ( que estão na lista ) algumas vezes nascem um em cima do outro, já tentei de algumas formas resolver isso mas como sou novo no assunto estou com dificuldade... Segue o método de criação dos objetos no solo ( ele tem duas partes que é uma para quando se criar o chão e a outra para quando o chão é movido de posição
Agradeço desde já a atenção galera.
public void Spawn()
{
if (transform.childCount > 2)
{
for (int i = 2; i < totalNumberObject; i++)
{
GameObject obj = transform.GetChild(i).gameObject;
obj.transform.SetParent(transform);
obj.transform.localPosition = new Vector3(Random.Range(points[0].transform.localPosition.x, points[1].transform.localPosition.x), 0, Random.Range(points[0].transform.localPosition.z, points[1].transform.localPosition.z));
}
}
else
{
for (int i = 0; i < totalNumberObject; i++)
{
int randomIndex = (Random.Range(0, objects.Count));
GameObject obj = Instantiate(objects[randomIndex], transform.position, Quaternion.identity);
obj.transform.SetParent(transform);
obj.transform.localPosition = new Vector3(Random.Range(points[0].transform.localPosition.x, points[1].transform.localPosition.x), 0, Random.Range(points[0].transform.localPosition.z, points[1].transform.localPosition.z));
}
}
}
Agradeço desde já a atenção galera.
public void Spawn()
{
if (transform.childCount > 2)
{
for (int i = 2; i < totalNumberObject; i++)
{
GameObject obj = transform.GetChild(i).gameObject;
obj.transform.SetParent(transform);
obj.transform.localPosition = new Vector3(Random.Range(points[0].transform.localPosition.x, points[1].transform.localPosition.x), 0, Random.Range(points[0].transform.localPosition.z, points[1].transform.localPosition.z));
}
}
else
{
for (int i = 0; i < totalNumberObject; i++)
{
int randomIndex = (Random.Range(0, objects.Count));
GameObject obj = Instantiate(objects[randomIndex], transform.position, Quaternion.identity);
obj.transform.SetParent(transform);
obj.transform.localPosition = new Vector3(Random.Range(points[0].transform.localPosition.x, points[1].transform.localPosition.x), 0, Random.Range(points[0].transform.localPosition.z, points[1].transform.localPosition.z));
}
}
}
garrito- Iniciante
- PONTOS : 1543
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Insâncias sendo sebrepostas
garrito escreveu:Olá a todos, estou desenvolvendo um script que faz o chão se mover e faz instância de alguns objetos no piso, porém os objetos ( que estão na lista ) algumas vezes nascem um em cima do outro, já tentei de algumas formas resolver isso mas como sou novo no assunto estou com dificuldade... Segue o método de criação dos objetos no solo ( ele tem duas partes que é uma para quando se criar o chão e a outra para quando o chão é movido de posição
Agradeço desde já a atenção galera.
- Código:
public void Spawn()
{
if (transform.childCount > 2)
{
for (int i = 2; i < totalNumberObject; i++)
{
GameObject obj = transform.GetChild(i).gameObject;
obj.transform.SetParent(transform);
obj.transform.localPosition = new
Vector3(Random.Range(points[0].transform.localPosition.x,
points[1].transform.localPosition.x), 0,
Random.Range(points[0].transform.localPosition.z,
points[1].transform.localPosition.z));
}
}
else
{
for (int i = 0; i < totalNumberObject; i++)
{
int randomIndex = (Random.Range(0, objects.Count));
GameObject obj = Instantiate(objects[randomIndex], transform.position, Quaternion.identity);
obj.transform.SetParent(transform);
obj.transform.localPosition = new
Vector3(Random.Range(points[0].transform.localPosition.x,
points[1].transform.localPosition.x), 0,
Random.Range(points[0].transform.localPosition.z,
points[1].transform.localPosition.z));
}
}
}
garrito- Iniciante
- PONTOS : 1543
REPUTAÇÃO : 0
Respeito as regras :
Re: [RESOLVIDO] Insâncias sendo sebrepostas
Não tem como gerar posições aleatórias exclusivas sem entrar em algoritmos mais avançados como poisson disc sample, etc.
O que dá pra fazer de forma simples é usar uma grid pra gerar todas as posições disponíveis, respeitando uma distância entre cada uma, quando quiser usar, basta sortear umas das posições, usar no objeto e remover a posição sorteada da lista. Isso garante que não haja repeptições.
O que dá pra fazer de forma simples é usar uma grid pra gerar todas as posições disponíveis, respeitando uma distância entre cada uma, quando quiser usar, basta sortear umas das posições, usar no objeto e remover a posição sorteada da lista. Isso garante que não haja repeptições.
- Código:
using System.Collections.Generic;
using UnityEngine;
public class RandomSpawn : MonoBehaviour
{
//Pra testes com um Plane = 10 metros
[SerializeField] private int posicoesX = 5;
[SerializeField] private int posicoesZ = 5;
public float larguraX = 10;
public float comprimentoZ = 10;
public bool centralizar;
private Vector3[] debugPos;
private void Start()
{
Spawn();
}
private void Spawn()
{
List<Vector3> posicoesDisponiveis = new List<Vector3>();
float distanciaEntrePosicoesX = larguraX / posicoesX;
float distanciaEntrePosicoesZ = comprimentoZ / posicoesZ;
for (int i = 0; i < posicoesX; i++)
{
for (int j = 0; j < posicoesZ; j++)
{
Vector3 pos = new Vector3(distanciaEntrePosicoesX * i+1, 1, distanciaEntrePosicoesZ * j+1);
if (centralizar)
{
pos.x -= larguraX / 2;
pos.z -= comprimentoZ / 2;
}
//Posicões unicas em forma de grid;
posicoesDisponiveis.Add(pos);
}
}
debugPos = posicoesDisponiveis.ToArray();
//Sorteia uma das posições disponíveis, usa no objeto e remove da lista de disponíveis, pra que não se repita.
int sort = Random.Range(0, posicoesDisponiveis.Count);
Vector3 final = posicoesDisponiveis[sort]; //Aqui você sempre terá um valor único.
posicoesDisponiveis.RemoveAt(sort);
}
private void OnDrawGizmos()
{
if (debugPos==null || debugPos.Length == 0)
return;
Gizmos.color = Color.blue;
for (int i = 0; i < debugPos.Length; i++)
{
Gizmos.DrawSphere(debugPos[i], 0.1f);
}
}
}
SteveRogers- Instrutor
- PONTOS : 2610
REPUTAÇÃO : 156
Respeito as regras :
Re: [RESOLVIDO] Insâncias sendo sebrepostas
SteveRogersNão tem como gerar posições aleatórias exclusivas sem entrar em algoritmos mais avançados como poisson disc sample, etc.
O que dá pra fazer de forma simples é usar uma grid pra gerar todas as posições disponíveis, respeitando uma distância entre cada uma, quando quiser usar, basta sortear umas das posições, usar no objeto e remover a posição sorteada da lista. Isso garante que não haja repeptições.
- Código:
using System.Collections.Generic;
using UnityEngine;
public class RandomSpawn : MonoBehaviour
{
//Pra testes com um Plane = 10 metros
[SerializeField] private int posicoesX = 5;
[SerializeField] private int posicoesZ = 5;
public float larguraX = 10;
public float comprimentoZ = 10;
public bool centralizar;
private Vector3[] debugPos;
private void Start()
{
Spawn();
}
private void Spawn()
{
List<Vector3> posicoesDisponiveis = new List<Vector3>();
float distanciaEntrePosicoesX = larguraX / posicoesX;
float distanciaEntrePosicoesZ = comprimentoZ / posicoesZ;
for (int i = 0; i < posicoesX; i++)
{
for (int j = 0; j < posicoesZ; j++)
{
Vector3 pos = new Vector3(distanciaEntrePosicoesX * i+1, 1, distanciaEntrePosicoesZ * j+1);
if (centralizar)
{
pos.x -= larguraX / 2;
pos.z -= comprimentoZ / 2;
}
//Posicões unicas em forma de grid;
posicoesDisponiveis.Add(pos);
}
}
debugPos = posicoesDisponiveis.ToArray();
//Sorteia uma das posições disponíveis, usa no objeto e remove da lista de disponíveis, pra que não se repita.
int sort = Random.Range(0, posicoesDisponiveis.Count);
Vector3 final = posicoesDisponiveis[sort]; //Aqui você sempre terá um valor único.
posicoesDisponiveis.RemoveAt(sort);
}
private void OnDrawGizmos()
{
if (debugPos==null || debugPos.Length == 0)
return;
Gizmos.color = Color.blue;
for (int i = 0; i < debugPos.Length; i++)
{
Gizmos.DrawSphere(debugPos[i], 0.1f);
}
}
}
Incrível essa forma de criar uma tabela de posições, eu nunca iria pensar nisso, muito obrigado pelo raciocínio e atenção... Vou estudar e tentar aplicar essa solução! :shock: :)
garrito- Iniciante
- PONTOS : 1543
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO]animações não sendo reproduzidas
» [Resolvido]Objeto não está sendo instanciado
» [RESOLVIDO] Visual Studio - Como saber onde um método está sendo usado
» Cubo sendo esvaziado 3D
» string não sendo reconhecida
» [Resolvido]Objeto não está sendo instanciado
» [RESOLVIDO] Visual Studio - Como saber onde um método está sendo usado
» Cubo sendo esvaziado 3D
» string não sendo reconhecida
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos