Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
i'm no jedi
 Аватар для legaju
16 / 10 / 6
Регистрация: 24.02.2019
Сообщений: 161

Нужно совместить два скрипта (я новичок, не могу разобраться)

06.06.2019, 19:40. Показов 5571. Ответов 3

Студворк — интернет-сервис помощи студентам
Есть скрипт, спавнящий в рандомных местах заданной области определённые объекты с определённой частотой. И есть второй кусочек скрипта, который мне подсказал хороший человек с форума. Этот "кусочек" должен предотвращать спавн объектов друг в друге, друг на друге и тд... К сожалению, я по неопытности и незнанию не могу разобраться, как эти два скрипта совместить. А тот человек на форуме не появляется (или просто не обращает внимания). Ребят, можете, плиз, помочь? Как их нужно скрестить, чтобы получить один рабочий скрипт?
Скрипт спавна:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CubeSpawn : MonoBehaviour
{
    public float intensity;
    public GameObject prefab;
 
    void Update() 
    {
        if (Input.GetKey (KeyCode.F)) 
        {
            StartCoroutine (cube_Spawn ());
        }
    }
 
    IEnumerator cube_Spawn()
    {
        while (true)
        {
 
            var obj = Instantiate(prefab);
 
            float x = Random.Range(-7.75f, 16.65f);
 
            obj.transform.position = new Vector3(x, 8, -1); 
 
            yield return new WaitForSeconds(intensity); 
        }
    }
}
Скрипт анти-спавн-друг-на-друге:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Vector3 GetFreePosition()
    {
        int i = 1000000; // чтобы не было вечного цикла будет лишь лям попыток
 
        while (--i >= 0)
        {
            float x = Random.Range(0.0f, 100.0f);
            float y = Random.Range(0.0f, 100.0f);
            float z = Random.Range(0.0f, 100.0f);
 
            var p = new Vector3(x, y, z);
 
            if (!Physics.CheckSphere(p, 10.0f)) // если не ударилось не обо что
            {
                return p; // возвращаем эту позицию
            }
        }
 
        return Vector3.zero; // вернем зеро если лям попыток не дал результатов 
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.06.2019, 19:40
Ответы с готовыми решениями:

как совместить два скрипта (см. внутри)
как совместить эти два скрипта чтоб при вводе "литр" исполнялся первый код (API) Private Declare Function ShellExecute Lib...

Нужно совместить два плагина
Имеется у меня плагины: wp-pro-quiz и cubepoints. Проходя тест в wp-pro-quiz юзер получает определенное количество баллов, так вот я хочу...

Нужно совместить два кода
Вот первый код, из него нужно организовать вывод результатов подсчета в док файл, либо .txt #include "iostream" #include...

3
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
06.06.2019, 21:37
Лучший ответ Сообщение было отмечено legaju как решение

Решение

legaju, для начала, проверять физикой это плохо, проще вектора сверить, вот код, нужный твой же переписанный код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
 
public class Spawns : MonoBehaviour
{
    public GameObject sphere;
    public List<GameObject> spheres = new List<GameObject>();
    private float size = 1f;
    private Vector2 lim = new Vector2(0, 100f);
    private int countC = 0;
    public void Start()
    {
        StartCoroutine(SpawnsPlease(10000));
    }
 
    public IEnumerator SpawnsPlease(int n)
    {
 
        for (int i = 0; i < n; i++)
        {
            Spawn();
            yield return null;
        }
    }
 
    public Vector3 GetPosToSpawn(params Vector3[] poss)
    {
        Vector3 v;
        do
        {
            if (countC == 1000000) // миллион
                throw new System.Exception("Не возможно разместить сферу");
            v = new Vector3(
            Random.Range(lim.x, lim.y),
            1,
            Random.Range(lim.x, lim.y));
            countC++;
        }
        while (!CheckPos(v, poss));
        return v;
    }
 
    public bool CheckPos(Vector3 pos, params Vector3[] poss)
    {
        foreach (var v in poss)
            if (Mathf.Abs(v.x - pos.x) <= size && Mathf.Abs(v.z - pos.z) <= size)
            {
                return false;
            }
        return true;
    }
 
    public void Spawn()
    {
        GameObject g = Instantiate(sphere);
        g.transform.position = GetPosToSpawn(spheres.Select(o => o.transform.position).ToArray());
        spheres.Add(g);
    }
}
Конечно проверять лямом циклов это плохо, с точки зрения математики, нужно отбросить все ложные варианты где x и y сразу становятся в одно место, но тут нужно думать как реализовать, вот от чем я.

Если есть сфера в координатах 5 7, то откинуть координаты 5-+1 и 7-+1, т.е. если раньше все выглядело так, 0...100 и 0...100, то сейчас 0...100 -> (4...6) = 0...6-8...100, т.е. если координата x уже есть, то y подбирать из иного диапазона, проблема становится когда сфер стает все больше и больше, при 100 сферах нужно будет 100 максимум сто разных диапазонов, а минимум это два, т.е. что все будет идти последовательно - и это только для х.

Лучший вариант, это ставить сразу на точки целого типа, т.п. (1,2) вместо (1.23, 2.44), так и проверять быстрее, и сразу отбросим не нужные варианты, ведь делать рандом из 100*2 точек куда проще.
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
06.06.2019, 22:01
Лучший ответ Сообщение было отмечено legaju как решение

Решение

legaju, очень важный нюанс, созданные объекты остаются на местах, или может они начинают падать?

Если вы хотите применить метод с Physics.CheckSphere, то на ваших объектах должен быть коллайдер(ы), чтоб иметь возможность обнаружить пересечение. И если у вас действительно есть коллайдеры, то какую физику вы используете - 3d или 2d?

В данный момент ваш запускает новую и новую корутину при нажатии клавиши f. То-есть десять нажатий и будет запущено десять корутин, так и задумано?

Добавлено через 12 минут
Если ваши объекты с коллайдерами3d и падают (или улетают с места создания), то есть такой грязноватый вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CubeSpawn : MonoBehaviour
{
    public float intensity;
    public GameObject prefab;
 
    public Coroutine spawnCoroutine; // сюда сохраним ссылку на корутину спавна, чтобы контролировать её в дальнейшем
 
    private void Update()
    {
        if (Input.GetKey(KeyCode.F))
        {
            // останавливаем предыдущий запуск/выполнение этой корутины, вдруг она до сих пор выполняется
            if (spawnCoroutine != null) StopCoroutine(spawnCoroutine);
 
            // сохраняем ссылку на запущенную корутину, чтобы потом иметь возможность остановить и её.
            // и запускаем корутину
            spawnCoroutine = StartCoroutine(cube_Spawn());
        }
    }
 
    private IEnumerator cube_Spawn()
    {
        while (true)
        {
 
            var obj = Instantiate(prefab);
 
            float x = getNewX();
 
            obj.transform.position = new Vector3(x, 8, -1);
 
            yield return new WaitForSeconds(intensity);
        }
    }
 
    
    private float getNewX()
    {
        float x;
        do
        {
            x = Random.Range(-7.75f, 16.65f);
        }
        while (Physics.CheckSphere(new Vector3(x, 8, -1), 1));
 
        return x;
    }
}
грязноватый, потому что много "магических чисел", которые желательно преобразовать в поля класса.
1
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
06.06.2019, 22:15
GetKey желательно заменить на GetKeyDown
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2019, 22:15
Помогаю со студенческими работами здесь

Ребят не могу разобраться /новичок (Программа разница во времени и дате )
Ребят , хочу сделать програмулину которая будет считать количество дней и рабочих часов от введенной даты 1 до введенной даты 2. ...

Новый комп. Почти чистая винда. Два синих экрана за два дня. Не могу разобраться
Новый комп. Почти чистая винда. Два синих экрана за два дня. Вылетают синие экраны при закрытии БФ4, ( может совпадение)... Прикладываю...

Не могу разобраться с кодировкой скрипта в cmd.exe
Доброй ночи! Никак не могу совладать с кодировкой php скрипта при запуске через консоль windows. Надеялся избавиться от кракозябр...

Как подписать комментарии и разобраться с работой кода? Дали задание разобраться и объяснить, а я совсем новичок
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Не могу объединить два скрипта
Привет всем, хочу сделать мультиселект у меня есть выпадающие списки вот скрипт &lt;section class=&quot;main&quot;&gt; &lt;div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru