Тема: Рандомний спавн обєктів на юніті

Всім привіт є декілька запитань по спавну обєктів в юніті. На сцені у мене спавняться обєкти, але проблема в тому що вони спавняться в рандомних координатах і получається що вони можуть бути близько один до одного, а мені потрібно щоб вони спавнились на відстані тріггера. Я так розумію що при спавні потрібно пускати промінь чи під позицією на якій я хочу спавнити немає обєктів, але у мене є тріггер який більший за сам обєкт він у мене як зона реагування. Як мені заспавнити обєкти щоб тріггери не перетиналися?Фото обєкта з тріггером.https://replace.org.ua/uploads/images/6255/e8d6489624a85343944ef0a0025bc903.jpg https://replace.org.ua/uploads/images/6255/2065d89b4ffc7e3f33cd155d69c6b58f.jpg
Скрипт спавна:

public class SpawnAnimals : MonoBehaviour
{
    public GameObject[] Animals;
    public int count;

    private void Start()
    {
        Spawn();
    }
    public void Spawn()
    { 
       
        for (int i =0; i < count; i++)
        {
            float x = Random.Range(5, 295);
            float z = Random.Range(5, 295);
            int obj = Random.Range(0, Animals.Length);
            gameObject.GetComponent<EnemySave>().nposx = i.ToString() + "x";
            gameObject.GetComponent<EnemySave>().nposz = i.ToString() + "z";
            gameObject.GetComponent<EnemySave>().count = i;
            gameObject.GetComponent<EnemySave>().SavePos(x, z, obj);
            Instantiate(Animals[obj], new Vector3(x, 1.5f, z),Quaternion.identity);
        }
    }
   
}

Буду вдячний за будь яку пропозицію

2

Re: Рандомний спавн обєктів на юніті

Візьміть аркуш паперу та намалюйте там певну кількість крапок у випадкових місцях, ви отримаєте вашу проблему.
А, тепер вам потрібно придумати якийсь алгоритм, який малюватиме ці випадкові крапки не зовсім випадково, а на певній відстані одна від одної. Як би ви вирішили таку задачку?
Ймовірно, перед тим як малювати крапку у якомусь місці варто переконатись, що місце у якому ви її збираєтесь намалювати відповідне. У вашому випадку об'єкт варто розглядати не лише як позицію х і у, а як набір таких позицій, адже ваша зона тригера - квадратна. А, якщо ми вже маємо набір квадратів, то можемо звести задачку до перевірки колізій (перетинання) двох або більше квадратів, це як приклад. Насправді я гадаю, можна по-різному підійти до розв'язання вашої проблеми, і якщо ми б мали більше інформації, можна було б спробувати знайти розумніший підхід. Однак, як рішення в лоб: ви можете просто брати випадкові позиції, доки не знайдете «правильне місце».

До речі, схожим чином генерують blue noise.

Прихований текст

https://i.ibb.co/tpRZmVh/image.png

Подякували: Firefox is dead, vovanxxx.20132

3

Re: Рандомний спавн обєктів на юніті

Я ще подумав що можна реалізувати за допомогою Ray променя. Після спавна пускати промені з чотирьох кутів тригера і якщо під цими променями не буде тригера другого обєкта то залишаємо без змін, а в іншому випадку зміщуємо обєкт поки він не буде за межами другого обєкта

Подякували: bebyk1

4

Re: Рандомний спавн обєктів на юніті

ось як я вирішив проблему набагато простіше

 public void Spawn()
    { 
       
        for (int i =0; i < count; i++)
        {
            float x = Random.Range(5, 295);
            float z = Random.Range(5, 295);
            x = Mathf.Round(x / 20) * 20; 
            z = Mathf.Round(z / 20) * 20;
            int obj = Random.Range(0, Animals.Length);
            
            posSpawn.position = new Vector3(x, 20f, z);
            Ray ray = new Ray(posSpawn.position, Vector3.down);
            RaycastHit hit;
            if(Physics.Raycast(ray,out hit))
            {
                Debug.Log("S");
                if(hit.collider.tag != "Enemy")
                {
                    GameObject spawn = Instantiate(Animals[obj], new Vector3(x, 1.5f, z), Quaternion.identity);
                    gameObject.GetComponent<EnemySave>().nposx = i.ToString() + "x";
                    gameObject.GetComponent<EnemySave>().nposz = i.ToString() + "z";
                    gameObject.GetComponent<EnemySave>().count = i;
                    gameObject.GetComponent<EnemySave>().SavePos(x, z, obj);

                    spawn.name = i.ToString();
                    gameObject.GetComponent<EnemySave>().nameobj.Add(i.ToString());
                    
                }
                else
                {
                    i -= 1;
                }
            }
            


        }

ось результат
https://replace.org.ua/uploads/images/6255/de0482cc0fc9fba1a522209a03e6e615.png

Подякували: bebyk1