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

Unity runner

30.06.2020, 15:18. Показов 1271. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Делаю раннер. Встал вопрос: как сделать так, чтобы при генерации платформ первые 2-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
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
62
63
64
65
66
67
68
69
    public GameObject[] RoadBlockPrefabs;
    public GameObject StartBlock;
 
    float startBlockXpos;
    int blockCount = 7;     // кол-во генерируемых блоков
    float blockLenght = 10;  
    int safeZone = 50;
 
    public Transform PlayerTransf;
    List<GameObject> CurrentBlocks = new List<GameObject>();
 
    Vector3 startPlayerPos;
 
    void Start()
    {
        startBlockXpos = PlayerTransf.position.x + 1;
        blockLenght = 10;
 
        StartGame();
    }
 
    public void StartGame()
    {
        PlayerTransf.GetComponent<PlayerMovement>().ResetPosition();
 
        foreach (var go in CurrentBlocks)
            Destroy(go);
 
        CurrentBlocks.Clear();
 
        for (int i = 0; i < blockCount; i++)
            SpawnBlock();
 
    }
 
    void LateUpdate()
    {
        CheckForSpawn();
    }
 
    void CheckForSpawn()
    {
        if (CurrentBlocks[0].transform.position.x - PlayerTransf.position.x < -15)
        {
            SpawnBlock();
            DestroyBlock();
        }
    }
 
    void SpawnBlock()
    {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        Vector3 blockPos;
 
        if (CurrentBlocks.Count > 0)
            blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        else
            blockPos = new Vector3(startBlockXpos, 0, 0);
 
        block.transform.position = blockPos;
 
        CurrentBlocks.Add(block);
    }
 
    void DestroyBlock()
    {
        Destroy(CurrentBlocks[0]);
        CurrentBlocks.RemoveAt(0);
    }
P.S. Если кто покажет как сделать массив блоков, чтобы постоянно не создавать/удалять их, а так же покажет спавн препятствий, монет, бонусов в одном скрипте, будет вообще идеально
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2020, 15:18
Ответы с готовыми решениями:

Где можно почитать основы разработки в Unity/Unity 3D
До этого был небольшой опыт работы с Windows.Forms и WFP с C#. Где можно разобраться и научится делать простейшие вещи в Unity, чтобы...

Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются?
Привет. Есть тут кто пишет на C# для Unity? Под игры созданные в Unity читы делаются? Такое реально или нет. Не реально

Разработка игр с Unity без Unity редактора
Здравствуйте. Хочу обрисовать ситуацию. Я слепой. Полностью слеп. Среди незрячих программистов есть те, кто занимаются разработкой...

6
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
30.06.2020, 18:32
Так попробуй
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
62
63
64
65
66
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Game : MonoBehaviour
{
    public GameObject[] RoadBlockPrefabs;
    //public GameObject StartBlock;
    Vector3 blockPos;
    bool sort;
    float startBlockXpos;
    int blockCount = 7;     // кол-во генерируемых блоков
    float blockLenght = 10;
    int safeZone = 50;
 
    public Transform PlayerTransf;
    List<GameObject> CurrentBlocks = new List<GameObject>();
 
    Vector3 startPlayerPos;
 
    void Start() {
        startBlockXpos = PlayerTransf.position.x + 1;
        blockLenght = 10;
 
        StartGame();
    }
 
    public void StartGame() {
        for (int i = 0; i < blockCount; i++)
            SpawnBlock();
 
    }
 
    void LateUpdate() {
        CheckForSpawn();
    }
 
    void CheckForSpawn() {
        if (CurrentBlocks[0].transform.position.x - PlayerTransf.position.x < -15f) {
            DestroyBlock();
        }
    }
 
    void SpawnBlock() {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        Vector3 blockPos;
 
        if (CurrentBlocks.Count > 0)
            blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        else
            blockPos = new Vector3(startBlockXpos, 0, 0);
 
        block.transform.position = blockPos;
        CurrentBlocks.Add(block);
    }
 
    void DestroyBlock() {
        blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        CurrentBlocks[0].transform.position = blockPos;
        GameObject temp = CurrentBlocks[CurrentBlocks.Count - 1];
        for (int i = 1; i < CurrentBlocks.Count; i++) {
            CurrentBlocks[CurrentBlocks.Count - i] = CurrentBlocks[CurrentBlocks.Count - i - 1];
        }
        CurrentBlocks[0] = temp;
    }
}
Добавлено через 3 минуты
забыл
C#
1
PlayerTransf.GetComponent<PlayerMovement>().ResetPosition();
в StartGame
0
0 / 0 / 0
Регистрация: 28.01.2020
Сообщений: 7
30.06.2020, 21:37  [ТС]
Не помогло. И в вашем случае платформы продолжают спавниться только когда игрок достигает конца последней сгенерированной платформы, т.е. прямо перед носом.


Может кто-нибудь подскажет толковый туториал по созданию 3D раннера, с генерацией блоков/препятствий/монет с использованием пула объектов и смещением "дорожки", а не игрока ?
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
01.07.2020, 11:29
Цитата Сообщение от SRG3 Посмотреть сообщение
И в вашем случае платформы продолжают спавниться только когда игрок достигает конца последней сгенерированной платформы, т.е. прямо перед носом
а так?
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
62
63
64
65
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Game : MonoBehaviour
{
    public GameObject[] RoadBlockPrefabs;
    GameObject StartBlock;
    float startBlockXpos;
    int blockCount = 7;     // кол-во генерируемых блоков
    float blockLenght = 10;
    int safeZone = 50;
 
    public Transform PlayerTransf;
    List<GameObject> CurrentBlocks = new List<GameObject>();
    Vector3 startPlayerPos;
 
    void Start() {
        startBlockXpos = PlayerTransf.position.x + 1;
        StartGame();
    }
 
    public void StartGame() {
        PlayerTransf.GetComponent<PlayerMovement>().ResetPosition();
        for (int i = 0; i < blockCount; i++)
            SpawnBlock();
 
    }
 
    void LateUpdate() {
        CheckForSpawn();
    }
 
    void CheckForSpawn() {
        if (StartBlock == null && PlayerTransf.position.x > CurrentBlocks[3].transform.position.x) {
            StartBlock = CurrentBlocks[3];
            DestroyBlock();
        } else if (StartBlock != null && PlayerTransf.position.x > StartBlock.transform.position.x) {
            DestroyBlock();
            StartBlock = null;
        }
    }
 
    void SpawnBlock() {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        Vector3 blockPos;
        if (CurrentBlocks.Count > 0)
            blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        else
            blockPos = new Vector3(startBlockXpos, 0, 0);
 
        block.transform.position = blockPos;
        CurrentBlocks.Add(block);
    }
 
    void DestroyBlock() {
        Vector3 blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        CurrentBlocks[0].transform.position = blockPos;
        GameObject temp = CurrentBlocks[CurrentBlocks.Count - 1];
        for (int i = 1; i < CurrentBlocks.Count; i++) {
            CurrentBlocks[CurrentBlocks.Count - i] = CurrentBlocks[CurrentBlocks.Count - i - 1];
        }
        CurrentBlocks[0] = temp;
    }
}
0
0 / 0 / 0
Регистрация: 28.01.2020
Сообщений: 7
01.07.2020, 12:57  [ТС]
Теперь блоки спавняться чуть раньше, но при рестарте первые блоки все равно с препятствиями
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,076
01.07.2020, 13:05
Цитата Сообщение от SRG3 Посмотреть сообщение
Теперь блоки спавняться чуть раньше, но при рестарте первые блоки все равно с препятствиями
Вот так прикольно
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
62
63
64
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Game : MonoBehaviour
{
    public GameObject[] RoadBlockPrefabs;
    GameObject StartBlock;
    float startBlockXpos;
    int blockCount = 7;     // кол-во генерируемых блоков
    float blockLenght = 10;
 
    public Transform PlayerTransf;
    List<GameObject> CurrentBlocks = new List<GameObject>();
    Vector3 startPlayerPos;
 
    void Start() {
        startBlockXpos = PlayerTransf.position.x + 1;
        StartGame();
    }
 
    public void StartGame() {
        //PlayerTransf.GetComponent<PlayerMovement>().ResetPosition();
        for (int i = 0; i < blockCount; i++)
            SpawnBlock();
 
    }
 
    void Update() {
        CheckForSpawn();
    }
 
    void CheckForSpawn() {
        if (StartBlock == null && PlayerTransf.position.x > CurrentBlocks[3].transform.position.x) {
            StartBlock = CurrentBlocks[3];
            DestroyBlock();
        } else if (StartBlock != null && PlayerTransf.position.x > StartBlock.transform.position.x) {
            DestroyBlock();
        }
    }
 
    void SpawnBlock() {
        GameObject block = Instantiate(RoadBlockPrefabs[Random.Range(0, RoadBlockPrefabs.Length)], transform);
        Vector3 blockPos;
        if (CurrentBlocks.Count > 0)
            blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        else
            blockPos = new Vector3(startBlockXpos, 0, 0);
 
        block.transform.position = blockPos;
        CurrentBlocks.Add(block);
    }
 
    void DestroyBlock() {
        Vector3 blockPos= Vector3.zero;
        blockPos = CurrentBlocks[CurrentBlocks.Count - 1].transform.position + new Vector3(blockLenght, 0, 0);
        GameObject temp = CurrentBlocks[CurrentBlocks.Count - 1];
        for (int i = 1; i < CurrentBlocks.Count; i++) {
            CurrentBlocks[CurrentBlocks.Count - i] = CurrentBlocks[CurrentBlocks.Count - i - 1];
        }
        CurrentBlocks[0] = temp;
        CurrentBlocks[0].transform.position = blockPos;
    }
}
0
0 / 0 / 0
Регистрация: 28.01.2020
Сообщений: 7
01.07.2020, 13:36  [ТС]
Действительно прикольно , но нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2020, 13:36
Помогаю со студенческими работами здесь

Установка бесплатной Unity Personal с сайта Unity
Делаю так: Выбор Версии Personal здесь: https://store.unity.com/?_ga=2.122298059.153798898.1559504340-368255761.1559504340 В этом...

Проблема в Unity all compiler errors have to be fixed unity
Всем доброго времени суток,столкнулся с такой проблемой в юнити Проект 2d Для кода использую Sharpdevelop Net Framework 4.0 (мне...

Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много?
Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много? ...

Передача значений по ip unity -> unity
Доброго времени суток вопрос: (мб простой) как передать например string значение между двумя unity билдами на разных компьютерах? знаю...

Unity 2d unity.engine.ui не работает
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CoinManager :...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru