Hola, en la aplicación que estoy desarrollando se crean instancias en el centro de la pantalla y quiero que si se crea una instancia demasiado cerca de otra, se destruya automáticamente. El caso es que no se me ocurre como ¿Alguien sabe como hacerlo?
Saludos.
si tienen collider podrias hacerlo con OnCollisionEnter.... o sphereCast o algo asi...
sino tendras que calcular la distancia(Vector3.Distance)
primero deverias guardar todas las instancias en un array(GameObject[ ]) o en una List<GameObject>
y estonces con un bucle "for" puedes checkear la distancia entre el nuevo objeto instanciado y los que ya estan en la List/array
Osea que tu problema central no es eliminar instancias (
ni lo debería ser, si es lo que pienso) sino mas bién medir distancias. simplemente podes tener registro (de alguna forma cualquiera, una lista por ejemplo) de los objetos que se van creando, entonces, a la hora de instanciar un objeto en determinado punto preguntas: "Si la distancia entre el punto destino y un objeto es menor a X no pasa la prueba", eso con todos los objetos de la lista.
//supuse bidimensional, es casi igual para 3D
List<Vector2> obj_pos = new List<Vector2>();
const float limiteDistancia = 1; //1 por ej
//podria ser void, bool te da algo de info
bool CrearObjeto(Vector2 coordenadas)
{
foreach(Vector2 pos in obj_pos)
{
if(Vector2.Distance(pos,coordenadas) < limiteDistancia)
return false;
}
InstanciarObjeto(coordenadas);//aca haces el Instantiate, meti la formula porque todavia no termine el café
return true;
}
Mas o menos, la cosa es siempre suponer que esta todo bien (ni bien te metes en CrearObjeto), si pasa el foreach sigue estan bien, pero si dentro del foreach a hay algo mal sale, esta metodologia funciona para muchos casos a la hora de verificar.
Podes usar triggers tambien, pero me parece que meter fisicas para un caso tan simple como este es complicarla un poco, sobretodo si tenes pocos objetos. es mucho mas eficiente medir una distancia.
Otra opción es en el Start usar Physics.OverlapSphere https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html (https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html) . Si te da igual que el objeto que detecte sea el mismo o de otro tipo (simplemente para que no se solape con nada), puedes utilizar Pyisics.CheckSphere https://docs.unity3d.com/ScriptReference/Physics.CheckSphere.html (https://docs.unity3d.com/ScriptReference/Physics.CheckSphere.html) (diría que es más rápido que OverlapSphere).
Si la distancia es pequeña y no hay muchos objetos de estos, tampoco debería influir mucho en el rendimiento (total, solo se ejecuta una vez...).
Gracias, ya esta solucionado, iba a usar una lista pero como las instancias estan en movimiento no podia guardar su posicion, asi que he probado con Physics.ChechSphere y solucionado.
Gracias por la ayuda