Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/103: Рейтинг темы: голосов - 103, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.06.2020
Сообщений: 10

Рандомный спавн врагов в разных точках

19.08.2020, 02:21. Показов 19961. Ответов 10

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Такой вопрос. В игре необходимо, что бы разные типы врагов спавнились в пяти разных точках. Игра чем то похожа на plants vs zombies, необходимо, что бы мобы рандомно(вид врага и точка его спавна) появлялись и шли на "дом". Сейчас скрипт выглядит так. до рандома только дошел. как нормально реализовать рандом:
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;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using UnityEngine;
 
public class Manager : MonoBehaviour {
    public static Manager instance = null;
 
    public GameObject[] spawnPoint;
    public GameObject[] enemies;
 
    public int maxEnemiesOnScreen;
    public int totalEnemies;
    public int enemiesPerSpawn;
 
    int enemiesOnScreen = 0;
 
    const float spawnDelay = 0.5f;
 
    void Awake () {
        if (instance == null) {
            instance = this;
        } else if (instance != this) {
            Destroy (gameObject);
        }
 
        DontDestroyOnLoad (gameObject);
    }
 
    // Start is called before the first frame update
    void Start () {
        StartCoroutine (Spawn ());
    }
 
    IEnumerator Spawn () {
        if (enemiesPerSpawn > 0 && enemiesOnScreen < totalEnemies) {
            for (int i = 0; i < enemiesPerSpawn; i++) {
                if (enemiesOnScreen < maxEnemiesOnScreen) {
                    GameObject newEnemy = Instantiate (enemies[0]) as GameObject;
                    newEnemy.transform.position = spawnPoint.transform.position;
                    enemiesOnScreen += 1;
                }
            }
 
            yield return new WaitForSeconds (spawnDelay);
            StartCoroutine (Spawn ());
        }
    }
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.08.2020, 02:21
Ответы с готовыми решениями:

Unity 2D C# Рандомный спавн
Проблема в том что, у меня есть монетка и игрок При столкновении игрока с монеткой она должна удалятся и спавниться другая с рандомными...

Рандомный спавн 3D объектов
Всем привет, помогите мне, напишите пожалуйста скрипт который спавнил объекты рандомная по координатом которые я задаю, а именно по X,...

Рандомный спавн деревьев в Unity2D TDS
Привет. Пытаюсь сделать рандомный спавн деревьев на карте, но определенное количество, но сделать этого у меня не получается. Я сам не...

10
51 / 42 / 24
Регистрация: 18.09.2014
Сообщений: 116
19.08.2020, 20:28
Pshikiano, что за ужасный код, прям больно смотреть.
И не понятно, в чем проблема. Обычное использование рандома. К примеру Random.Range(0, 4); Или если брать с массива, то array[Random.Range(0, array.Length)];

Еще несколько фраз.
Использование паттерна Singleton, когда есть грубые ошибки вызывает мнение, что нет понимание того, что делаешь.
Корутина. Вместо вечного запуска новой и остановки старой, лучше сделать бесконечный цикл внутри while(true){}.
И личный совет, начни изучать основы. Это очень важно. А также, прежде чем что то спрашивать, используй поисковик. Практически на любой вопрос уже дан ответ. Главное уметь искать.
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
19.08.2020, 22:03
Цитата Сообщение от Pshikiano Посмотреть сообщение
разные типы врагов спавнились в пяти разных точках.
ну так задайте в спавнере точки в массив и берите рандом с этого массива.
то же самое и для врагов. в массив. и рандом с массива
C#
1
2
3
4
5
6
7
8
9
Transform[] points; // массив точек спавна
gameobject[] enemies; // массив врагов
 
// рандом точки
int randPoint = UnityEngine.random.range(0, points.lenght);
int randEnemy = UnityEngine.random.range(0, enemies.lenght);
 
gameobject enemy = Instantiate(enemies[randEnemy]);
enemy.transform.position = points[randPoint].position;
Добавлено через 47 секунд
в цыкл вы уже умеете запихивать все это)

Добавлено через 4 минуты
Цитата Сообщение от Pshikiano Посмотреть сообщение
for (int i = 0; i < enemiesPerSpawn; i++) {
                if (enemiesOnScreen < maxEnemiesOnScreen) {
                    GameObject newEnemy = Instantiate (enemies[0]) as GameObject;
                    newEnemy.transform.position = spawnPoint.transform.position;
                    enemiesOnScreen += 1;
                }
            }
правда у вас тут все мобы заспавнятся одновременно. а желательно наверное через некие интервалы времени.
C#
1
2
3
4
5
6
7
8
9
10
           for (int i = 0; i < enemiesPerSpawn; i++) {
                if (enemiesOnScreen < maxEnemiesOnScreen) {
                    GameObject newEnemy = Instantiate (enemies[0]) as GameObject;
                    newEnemy.transform.position = spawnPoint.transform.position;
                    enemiesOnScreen += 1;
 
                    // интервал между мобами
                    yield return new WaitForSeconds (mobDelay);
                }
            }
0
0 / 0 / 0
Регистрация: 17.03.2021
Сообщений: 4
23.03.2021, 09:55
MuaddibFremen, а не подскажите, как сделать так, чтобы в определенном спавне (рандомный из 5) спавнились определенные типы врагов, то есть, чтобы к определенной точке спавна был прикреплен определенный тип врагов, при этом спавн выбирается рандомно.
0
27 / 26 / 2
Регистрация: 26.12.2020
Сообщений: 86
23.03.2021, 11:22
MuaddibFremen, я бы добавил, что так один из спавнеров будет не задествован из-за особенностей местного рандома не получать никогда максимальное значение
Цитата Сообщение от MuaddibFremen Посмотреть сообщение
// рандом точки
int randPoint = UnityEngine.random.range(0, points.lenght);
int randEnemy = UnityEngine.random.range(0, enemies.lenght);
коректнее указать
C#
1
UnityEngine.random.range(0, points.lenght+1);
0
250 / 186 / 68
Регистрация: 04.03.2019
Сообщений: 1,010
23.03.2021, 16:15
Цитата Сообщение от Purple__Drunk Посмотреть сообщение
UnityEngine.random.range(0, points.lenght+1)
у вас возможна ситуация когда оно спросит предмет которого нет в массиве. так как у него индекс выше массива

Добавлено через 1 час 4 минуты
Цитата Сообщение от Johannes1997 Посмотреть сообщение
а не подскажите, как сделать так, чтобы в определенном спавне (рандомный из 5) спавнились определенные типы врагов, то есть, чтобы к определенной точке спавна был прикреплен определенный тип врагов, при этом спавн выбирается рандомно.
ну так уберите из точек спавна ту позицию, а для нее задайте свой спавнер.

типа такого можна что-то
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Transform individualSpawnPoint;       // тут уникальная точка для спавна
Gameobject individualEnemyPrefab;  // тут префаб для уникальной точки
 
Transform[] points; // массив точек спавна
gameobject[] enemies; // массив врагов 
 
// рандом точки
int randPoint = UnityEngine.random.range(0, points.lenght);
int randEnemy = UnityEngine.random.range(0, enemies.lenght);
 
if (points[randPoint] == individualSpawnPoint)
{
  gameobject enemy = Instantiate(individualEnemyPrefab);
  enemy.transform.position = points[randPoint].position;
}
else
{
  gameobject enemy = Instantiate(enemies[randEnemy]);
  enemy.transform.position = points[randPoint].position;
}
0
27 / 26 / 2
Регистрация: 26.12.2020
Сообщений: 86
23.03.2021, 19:10
Цитата Сообщение от MuaddibFremen Посмотреть сообщение
у вас возможна ситуация когда оно спросит предмет которого нет в массиве. так как у него индекс выше массива
никогда рандом не выдает крайнее значение, математическим языком оно не включено в множество
0
2 / 1 / 1
Регистрация: 23.03.2021
Сообщений: 17
23.03.2021, 20:57
Самое ЛУЧШЕЕ РЕШЕНИЕ как исправить Будет работать на всех Юнити
обрати внимание на первый снимок название SPAWN_NUMBER и в компоненте скрипте назначение чифр

Скрипт

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
using System.Collections;
using System.Collections.Generic;
public class MobSpawner : MonoBehaviour {
    
    public GameObject MobToSpawn;
    public int numberOfMobsAtOnce;
    public int spawnRange;
    public float timeToWaitBeforeRespawn;
    public List<GameObject> mobsSpawned;
    
    // Use this for initialization
    void Start () {
        for (int i = 0; i < numberOfMobsAtOnce; i++) {
            Vector3 randomPosition = new Vector3(Random.Range(transform.position.x - spawnRange, transform.position.x + spawnRange),
                transform.position.y,
                Random.Range(transform.position.z - spawnRange, transform.position.z + spawnRange));
            
            GameObject mobSpawned = Instantiate(MobToSpawn,randomPosition,Quaternion.identity) as GameObject;
            mobSpawned.transform.parent = this.transform;
            mobsSpawned.Add(mobSpawned);
        }
        StartCoroutine(SpawnMobs());
    }
    
    IEnumerator SpawnMobs(){
        
        for (int i = 0; i < mobsSpawned.Count; i++) {
            if(mobsSpawned[i] == null){
                mobsSpawned.RemoveAt(i);
            }
        }
        
        if(mobsSpawned.Count < numberOfMobsAtOnce){
            
            Vector3 randomPosition = new Vector3(Random.Range(transform.position.x - spawnRange, transform.position.x + spawnRange),
                transform.position.y,
                Random.Range(transform.position.z - spawnRange, transform.position.z + spawnRange));
            
            GameObject mobSpawned = Instantiate(MobToSpawn,randomPosition,Quaternion.identity) as GameObject;
            mobSpawned.transform.parent = this.transform;
            mobsSpawned.Add(mobSpawned);
        }
        
        
        
        yield return new WaitForSeconds(timeToWaitBeforeRespawn);
        StartCoroutine(SpawnMobs());
        
    }
}
0
2 / 1 / 1
Регистрация: 23.03.2021
Сообщений: 17
23.03.2021, 21:03
так же можно использовать такое решение Обратите внимание на снимок где SPAWN_NUMBER

и в скрипте
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
using System.Collections;
using System.Collections.Generic;
//Script SergeyHobbitok(Сергей Хоббиток)
public class MobSpawner : MonoBehaviour {
    
    public GameObject MobToSpawn;
    public int numberOfMobsAtOnce;
    public int spawnRange;
    public float timeToWaitBeforeRespawn;
    public List<GameObject> mobsSpawned;
    
    // Use this for initialization
    void Start () {
        for (int i = 0; i < numberOfMobsAtOnce; i++) {
            Vector3 randomPosition = new Vector3(Random.Range(transform.position.x - spawnRange, transform.position.x + spawnRange),
                transform.position.y,
                Random.Range(transform.position.z - spawnRange, transform.position.z + spawnRange));
            
            GameObject mobSpawned = Instantiate(MobToSpawn,randomPosition,Quaternion.identity) as GameObject;
            mobSpawned.transform.parent = this.transform;
            mobsSpawned.Add(mobSpawned);
        }
        StartCoroutine(SpawnMobs());
    }
    
    IEnumerator SpawnMobs(){
        
        for (int i = 0; i < mobsSpawned.Count; i++) {
            if(mobsSpawned[i] == null){
                mobsSpawned.RemoveAt(i);
            }
        }
        
        if(mobsSpawned.Count < numberOfMobsAtOnce){
            
            Vector3 randomPosition = new Vector3(Random.Range(transform.position.x - spawnRange, transform.position.x + spawnRange),
                transform.position.y,
                Random.Range(transform.position.z - spawnRange, transform.position.z + spawnRange));
            
            GameObject mobSpawned = Instantiate(MobToSpawn,randomPosition,Quaternion.identity) as GameObject;
            mobSpawned.transform.parent = this.transform;
            mobsSpawned.Add(mobSpawned);
        }
        
        
        
        yield return new WaitForSeconds(timeToWaitBeforeRespawn);
        StartCoroutine(SpawnMobs());
        
    }
}
Миниатюры
Рандомный спавн врагов в разных точках   Рандомный спавн врагов в разных точках   Рандомный спавн врагов в разных точках  

Рандомный спавн врагов в разных точках  
0
2 / 1 / 1
Регистрация: 23.03.2021
Сообщений: 17
23.03.2021, 21:08
Если заданно 5 мобов то при убийстве одного будут обнавляться +1

и часто 2 сообщение +++ в ответе.интересно что за баг форума
Миниатюры
Рандомный спавн врагов в разных точках  
0
2 / 1 / 1
Регистрация: 23.03.2021
Сообщений: 17
23.03.2021, 21:13
создает рэндом мобов хаотично строка Random.Range(transform.position.z - spawnRange, transform.position.z + spawnRange));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2021, 21:13
Помогаю со студенческими работами здесь

два ви-фи роутера, в разных точках
имеем территорию А и Б, между ними есть промежуточная среда В. настраиваем два одинаковых ви-фи роутера, с одинаковыми настройками и...

Появление клонов в разных точках
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public...

Как сделать подбор рандомный разных чисел (srand (time(0) не помогает)?
Здравствуйте, уважаемые программиты, не могли бы вы мне помочь? Дело в том, что мне нужно сделать генератор рандомных чисел. Я уже...

2 ноута в разных точках города создание vpn'а
Всем привет. Люди дбрые помогите. есть 2 ноута, на обоих есть нет, можно ли сделать так что бы (например ообщие папки были видны обоим...

Как вывести значения функции в разных точках с определенным шагом?
Нужно протабулировать функцию в промежутке от 1 до 1000 с шагом 0.1 (то есть нужно вывести значение функции в точках 1, 1.1,1.2, ...,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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