Como procurar um lugar vazio para spawnar monstro
2 participantes
Página 1 de 1
Como procurar um lugar vazio para spawnar monstro
Guys fiz um código para spawnar o monstro num ranger definido por mim aleatoriamente, minha duvida qual o jeito mais fácil para NÃO spawnar dentro de outro objetos como no video.
- Código:
public class MonsterSpawnController : MonoBehaviour
{
[SerializeField] private Vector3 size = new Vector3(10, 3, 10);
public GameObject SpawnMonster(GameObject monster)
{
Vector3 pos = transform.localPosition + new Vector3( Random.Range(-size.x / 2, size.x / 2), transform.localPosition.y, Random.Range(-size.z / 2, size.z / 2));
return Instantiate(monster, pos, transform.rotation);
}
private void OnDrawGizmosSelected()
{
Color color = Color.green;
color.a = color.a / 5;
Gizmos.color = color;
Gizmos.DrawCube(transform.localPosition + new Vector3(0, 1, 0), size);
}
}
igorobm- MembroAvançado
- PONTOS : 2834
REPUTAÇÃO : 39
Idade : 27
Áreas de atuação : Discord -> 163979429742116864
Respeito as regras :
Re: Como procurar um lugar vazio para spawnar monstro
Eu faria o seguinte, criaria uma Coroutine pro spawn, nela eu checaria se a posição sorteada tem algum obstáculo usando o OverlaSphere
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
Se ele detectasse algum colisor, eu reiniciaria a coroutine.
Pra deixar melhor você pode pegar o bounds do SkinnedMeshRenderer do prefab que quer instanciar, calcular o tamanho max que o objeto vai ter e então usar esse valor como range no overlapsphere, dessa forma você evitaria fazer a checagem numa area muito grande e deixaria o spawn mais fácil.
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
Se ele detectasse algum colisor, eu reiniciaria a coroutine.
Pra deixar melhor você pode pegar o bounds do SkinnedMeshRenderer do prefab que quer instanciar, calcular o tamanho max que o objeto vai ter e então usar esse valor como range no overlapsphere, dessa forma você evitaria fazer a checagem numa area muito grande e deixaria o spawn mais fácil.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Como procurar um lugar vazio para spawnar monstro
Fagner escreveu:Eu faria o seguinte, criaria uma Coroutine pro spawn, nela eu checaria se a posição sorteada tem algum obstáculo usando o OverlaSphere
https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
Se ele detectasse algum colisor, eu reiniciaria a coroutine.
Pra deixar melhor você pode pegar o bounds do SkinnedMeshRenderer do prefab que quer instanciar, calcular o tamanho max que o objeto vai ter e então usar esse valor como range no overlapsphere, dessa forma você evitaria fazer a checagem numa area muito grande e deixaria o spawn mais fácil.
Consegui assim, não entendi a necessidade de um coroutine. As courotine não seriam para ações com Delay?
- Código:
public class MonsterSpawnController : MonoBehaviour
{
[SerializeField] private Vector3 size = new Vector3(10, 3, 10);
[SerializeField] private Vector3 localPlayer;
[SerializeField] private Vector3 localToSpawn;
private void Update()
{
localPlayer = transform.localPosition;
}
public GameObject SpawnMonster(GameObject monster)
{
localToSpawn = new Vector3(0, 0, 0);
Debug.Log("SpawnMonster");
while (localToSpawn == Vector3.zero)
{
Debug.Log("Find Local To Spanw");
localToSpawn = FindLocalToSpanw();
}
Debug.Log("Spawn");
return Instantiate(monster, localToSpawn, transform.rotation);
}
private void OnDrawGizmos()
{
Color color = Color.green;
color.a = color.a / 5;
Gizmos.color = color;
Gizmos.DrawCube(transform.localPosition + new Vector3(0, 1, 0), size);
}
private Vector3 FindLocalToSpanw()
{
Vector3 newPosition = transform.localPosition + new Vector3(Random.Range(-size.x / 2, size.x / 2), transform.localPosition.y, Random.Range(-size.z / 2, size.z / 2));
Collider[] hitColliders = Physics.OverlapSphere(newPosition, 1);
foreach (var hitCollider in hitColliders)
{
if (hitCollider.gameObject.tag != "Walkable")
{
Debug.Log("Not Spawn in " + newPosition);
return Vector3.zero;
}
}
Debug.Log("Spawn in " + newPosition);
return newPosition;
}
}
igorobm- MembroAvançado
- PONTOS : 2834
REPUTAÇÃO : 39
Idade : 27
Áreas de atuação : Discord -> 163979429742116864
Respeito as regras :
Tópicos semelhantes
» como faco para spawnar a vida do inimigo junto com ele direto do prefabe
» Como faço para que meu personagem ao subir em um lugar bem íngreme ele escorregue?
» SPAWNAR OBJETOS EM DETERMINADO LUGAR
» Como fazer o personagem "teletransportar" para outro lugar na mesma cena?
» quero instanciar um obj vazio como faço?
» Como faço para que meu personagem ao subir em um lugar bem íngreme ele escorregue?
» SPAWNAR OBJETOS EM DETERMINADO LUGAR
» Como fazer o personagem "teletransportar" para outro lugar na mesma cena?
» quero instanciar um obj vazio como faço?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos