Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
22 / 23 / 0
Регистрация: 26.12.2020
Сообщений: 58
1

Юнити игнорирует скрипт

13.01.2021, 21:31. Просмотров 1377. Ответов 27

2d игрушка с видом сверху и рандомной генерацией комнат.
С комнаты есть двери (серые на скрине) и при генерации уровня бывает спавн комнаты с дверью в сторону, с которой у другой комнаты нет выхода. (на скрине именно такой случай). Дабы такого не было, у двери есть коллайдер-триггер, который выступает за габариты двери в сторону выхода и небольшой скрипт
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Wall : MonoBehaviour
{
    public GameObject block;
 
    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Block"))
        {
            Instantiate(block, transform.GetChild(0).position, Quaternion.identity);
            Instantiate(block, transform.GetChild(1).position, Quaternion.identity);
            Destroy(gameObject);
        }
    }
 
}
Но в итоге подобные генерации продолжаются, как будто скрипта и нет
0
Миниатюры
Юнити игнорирует скрипт  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2021, 21:31
Ответы с готовыми решениями:

Скрипт для ходьбы в юнити
Всем привет. Нужно написать скрипт ходьбы. Вправо и влево, без прыжка. Для юнити. Заранее спасибо!

Скрипт на смерть игрока в юнити
var GameObject Player; //var GameObj Function OnTriggerEnter(Collider other) { if(Player ==...

Скрипт в юнити с использованием колайдера
Доброго времени суток. Когда захожу в колайдер срабатывает дебаг 3. Но когда в колайдере у...

Нужно написать скрипт для юнити на си шарп
using System.Collections; using System.Collections.Generic; using UnityEngine; public class...

27
22 / 23 / 0
Регистрация: 26.12.2020
Сообщений: 58
15.01.2021, 22:10  [ТС] 21
Может быть так, что программа просто не успевает реагировать и проверять условие?

Добавлено через 35 минут
Да, блин нет, они тупо встречаются с двух направлений и случается это
0
1072 / 662 / 339
Регистрация: 23.02.2019
Сообщений: 1,601
15.01.2021, 22:40 22
Purple__Drunk, А что если придумать алгоритм, не привязанный к Unity, который генерирует случайную карту из таких комнат, правильно расставляет все двери и просто возвращает список данных об созданных комнатах?

Данные о комнате самые минимальные. Что важно знать о ней? Всего лишь положение по икс, по игрек и на каких стенах есть дверь. Этого достаточно.
Например класс данных о комнате может выглядеть примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
class Room
{
    public Point position;
    public bool[] walls; //0 - top, 1- right, 2 - down, 3 - left
 
    public Room(int x, int y)
    {
        position = new Point(x, y);
        walls = new bool[4];
    }
}
массив walls олицетворяет четыре стены, начиная с верхней и по часовой стрелке. Если значение false- значит двери на этой стене нет, а если true - значит дверь есть.

Шаги алгоритма создания карты из комнат примерно такие:

создаём первую комнату без дверей сами, а затем -

// выбрать случайную комнату в которой есть хотя бы одна стена без двери
// выбрать случайную стену без двери в этой комнате
// сделать дверь в этой стене
// если по направлению двери нет следующей комнаты, то создать её
// сделать дверь в новой комнате с противоположной стороны (чтобы двери соединялись)

и так делать до тех пор, пока не получим нужное кол-во комнат.

Я попробовал этот алгоритм (на winforms) и он даже сработал и выдаёт такие случайные карты (для десяти комнат)
Кликните здесь для просмотра всего текста
Юнити игнорирует скрипт
Юнити игнорирует скрипт
Юнити игнорирует скрипт
Юнити игнорирует скрипт
Юнити игнорирует скрипт


И результатом алгоритма будет массив из Room, примерно такого содержимого (на пять комнат)
Код
0, 0, True, True, False, True
0, -1, False, True, True, False
1, -1, False, False, False, True
- 1, 0, False, True, False, False
1, 0, False, False, False, True
Здесь видно (первая строчка) что комната в нулевых координатах, и у неё есть двери вверху, справа и слева, а внизу двери нет.
И с этим данными уже можете в Unity делать всё что нужно.
0
22 / 23 / 0
Регистрация: 26.12.2020
Сообщений: 58
15.01.2021, 23:23  [ТС] 23
samana, ого, вот это уже круто. Сейчас вникну в твое сообщение лучше, если что переспрошу, что интересует) Спасибо!)
0
1072 / 662 / 339
Регистрация: 23.02.2019
Сообщений: 1,601
15.01.2021, 23:32 24
Тю, я забыл скинуть код..

Создайте файл с именем RoomGenerator.cs и скопируйте в него код ниже.

Кликните здесь для просмотра всего текста
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System.Collections.Generic;
using System.Linq;
 
namespace CyberForum.Samana
{
    public static class RoomGenerator
    {
        public static Room[] GenerateRooms(int roomsCount)
        {
            Position[] directions = new Position[]
            {
                new Position(0,1),    // top
                new Position(1,0),     // rigth
                new Position(0,-1),     // down
                new Position(-1,0)     // left
 
            };
 
            System.Random _rand = new System.Random();
 
            Dictionary<Position, Room> roomsMap = new Dictionary<Position, Room>();
 
            Room room = new Room(0, 0);
            roomsMap.Add(room.position, room);
 
            while (roomsMap.Count < roomsCount)
            {
                // выбрать случайную комнату в которой есть стена без двери
                Room room1 = getRandomRoomWithEmptyWall(roomsMap, _rand);
 
                // выбрать случайную стену без двери в этой комнате
                int emptyWallIndex = getRandomEmptyWall(room1, _rand);
 
 
                // сделать дверь в этой стене
                room1.walls[emptyWallIndex] = true;
 
                // если по направлению двери нет следующей комнаты, то создать её
                Position nextDirection = directions[emptyWallIndex];
                Position nextDoorPosition = room1.position + nextDirection;
                if (!roomsMap.ContainsKey(nextDoorPosition))
                {
                    roomsMap.Add(nextDoorPosition, new Room(nextDoorPosition.x, nextDoorPosition.y));
                }
 
                // сделать дверь в новой комнате в противоположной стороне (чтобы двери соединялись)
                int oppositDoorInd = (emptyWallIndex + 2) % 4;
                roomsMap[nextDoorPosition].walls[oppositDoorInd] = true;
            }
 
            return roomsMap.Values.ToArray();
        }
 
        private static int getRandomEmptyWall(Room room, System.Random random)
        {
            int randWallInd = random.Next(room.walls.Length);
            while (room.walls[randWallInd] != false)
            {
                randWallInd++;
                randWallInd = randWallInd % room.walls.Length;
            }
 
            return randWallInd;
        }
 
        private static Room getRandomRoomWithEmptyWall(Dictionary<Position, Room> roomsMap, System.Random random)
        {
            var rooms = roomsMap.Where(r => r.Value.walls.Contains(false)).Select(r => r.Value).ToList();
            if (rooms.Count == 0) return null;
 
            return rooms[random.Next(rooms.Count)];
        }
 
    }
 
    public class Room
    {
        public Position position;
        public bool[] walls; //0 - top, 1- right, 2 - down, 3 - left
 
        public Room(int x, int y)
        {
            position = new Position(x, y);
            walls = new bool[4];
        }
 
        public override string ToString()
        {
            return $"{position}, doors: top({walls[0]}) right({walls[1]}) down({walls[2]}) left({walls[3]})";
        }
    }
    public struct Position
    {
        public int x, y;
 
        public Position(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
 
        public static Position operator +(Position p1, Position p2)
        {
            return new Position(p1.x + p2.x, p1.y + p2.y);
        }
 
        public override string ToString()
        {
            return $"x:{x} y:{y}";
        }
    }
 
}


Для того чтобы сгенерировать карту комнат, нужно вызвать единственный статический метод
C#
1
Room[] _rooms = RoomGenerator.GenerateRooms(10);
который возвращает массив класса Room с данными о комнатах.
0
0 / 0 / 0
Регистрация: 02.12.2020
Сообщений: 13
24.01.2021, 19:11 25
Может ты забыл перетащить скрипт на объект?
0
22 / 23 / 0
Регистрация: 26.12.2020
Сообщений: 58
24.01.2021, 20:01  [ТС] 26
Подскаq4tert, нет, почитайте всю тему там этапы наладки одного/поломки другого. В итоге, с помощью Samana мы переделали принцип генерации с нуля просто
0
1072 / 662 / 339
Регистрация: 23.02.2019
Сообщений: 1,601
07.02.2021, 12:17 27
Purple__Drunk, Кстати, случайно заметил видео урок на русском, как раз на тему создания подземелий, таких как вы хотели -

может пригодится.
0
22 / 23 / 0
Регистрация: 26.12.2020
Сообщений: 58
07.02.2021, 16:55  [ТС] 28
samana, натыкался
Смотрел правда первые пару минут, вроде он как использует ту же схему что и я раньше: создаёт все варианты комнат как префабы заранее.
Может и ошибаюсь, гляну на досуге, спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2021, 16:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нужно написать скрипт для юнити на си шарп
Приветствую всех. собственно имеются два скрипта. Первый скрипт создает объекты в определенной...

C# по юнити
есть скрипт на C#, он должен был делать так, что если мяч закатывается в ворота, его позиция...

Игнорирует нажатия
Добрый вечер уважаемые знатоки языка программирования C++. Недавно занялся изучением этого...

IE игнорирует прокси
Специалисты по сетям, просьба помочь. Суть проблемы: есть локалка и ppp-соединение (3g через...

QT игнорирует цикл :(
друзья я в отчаянии, мне не хватает опыта разобраться в сложившейся ситуации. Qt Creator 4.3.1...

Яндекс игнорирует...
Подскажите пожалуйста.Моему сайту 2 месяца в гугле я на 2-5 месте по тематическим словам а в...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.