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

Как рандомно переместить объекты по определённой оси и так, чтобы один не задевал другого?

11.04.2022, 21:45. Показов 2169. Ответов 22

Студворк — интернет-сервис помощи студентам
Я хочу, чтобы 10 объектов перемешались местами друг с другом, но при этом не должно быть так, что в одну точку переместились 2 объекта. У каждого объекта есть какие-то координаты и они должны перемещаться только по этим координатам. То есть у 1 из 10 объектов координаты 1, 1, 1 (x, y, z), у второго 1, 2, 1, первый должен переместиться, допустим рандомно, в 1, 2, 1, а второй в 1, 1, 1. Как это сделать? Может какой-то код такой есть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2022, 21:45
Ответы с готовыми решениями:

Как рандомно вывести картинку и текст так, чтобы к определенной картинке относился определенный текст?
Всем привет.Нужна помощь.как рандомно вывести картинку и текст, так чтобы к определенной картинке относился определенный текст???Помогите...

Сделать так, чтобы объекты по бокам экрана расставлялись рандомно, но на расстоянии друг от друга
Привет. Работаю в Unity. Мне нужно сделать так, чтобы объекты по бокам экрана расставлялись рандомно, но на расстоянии друг от друга....

Как сделать так, чтобы при нажатии на один из элементов меню, у другого менялся цвет?
Как сделать, чтобы при клике на один из li в .sidebar-menu один из кружков-элементов li в .sidebar-nav менял цвет фона на белый, путем...

22
Доброжелательный пушистик
 Аватар для upfly
92 / 55 / 35
Регистрация: 07.06.2012
Сообщений: 307
12.04.2022, 00:51
Я бы задавал случайные координаты до тех пор, пока они не будут совпадать со всеми элементами, т.е. условие выполнено.
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 01:03  [ТС]
А как это сделать, не подскажите скрипт?
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 19:45
ProgramistKrol, в теории должно работать. Сам не проверял. Когда чекнешь, сообщи
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[SerializeField] private List<Transform> _pointsOfObjects; // сюда пихаешь все объекты свои
private void SomeMethod()
{
    RandomizePositions(_pointsOfObjects);
}
private void RandomizePositions(List<Transform> list)
{
    List<Transform> newList = new List<Transform>(list);
    int i = 0;
    while(newList.Count > 0)
    {
        int rand = Random.Range(0, newList.Count);
 
        Vector3 pos = newList[rand].position;
        list[i].position = pos;
 
        newList.RemoveAt(rand);
        i++;
    }
}
1
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 22:16  [ТС]
Вот, я кинул скрипт в объект Улучшенная анимация карт.
Миниатюры
Как рандомно переместить объекты по определённой оси и так, чтобы один не задевал другого?  
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 22:18
ProgramistKrol, покажи инспектор объекта "Улучшенная анимация карт". И на будущее, моя реализация меняет позиции объектов мгновенно и не будет работать вместе с анимациями.
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 22:40  [ТС]
Вот
Миниатюры
Как рандомно переместить объекты по определённой оси и так, чтобы один не задевал другого?  
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 22:44
ProgramistKrol, вот теперь все отлично. Если ничего не работает, попробуй отрубить у них у всех аниматоры и посмотреть будут ли меняться их позиции рандомно или нет.
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 22:57  [ТС]
Ничего не работает, просто не перемещаются, стоят в своих положениях и всё.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 22:59
ProgramistKrol, возможно глупый вопрос, но ты метод то хоть вызываешь?
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 23:01  [ТС]
Извините за глупый ответ, но какой метод?
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 23:02
ProgramistKrol, RandomizePositions
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 23:05  [ТС]
А как его вызвать? Я просто никогда не работал с рандомной перестановкой объектов.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 23:08
ProgramistKrol, как и любой другой метод. Например, ты как прыжок вызываешь, передвижение, да что угодно. Учи ООП и C# и непонятое станет гораздо меньше.
C#
1
2
3
4
private void Start()
{
    RandomizePositions(_pointsOfObjects);
}
Только вместо старта, любое другое место, в момент работы которого должна быть рандомизация.
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 23:24  [ТС]
Щас всё работает, но почему-то все объекты перемещаются в один объект.
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 23:27
ProgramistKrol, странно конечно. Но раскидай в моем методе Debug Log'и на все поля, которые я там использую (достаточно не int'ы) и определи какое из них не изменяется
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
12.04.2022, 23:37  [ТС]
Можно пожалуйста чуть попроще. Можете вы раскидать эти Debug Log'и на все поля и всё что вы перечислили?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[SerializeField] private List<Transform> _pointsOfObjects;
    private void Update()
    {
        RandomizePositions(_pointsOfObjects);
    }
    private void RandomizePositions(List<Transform> list)
    {
        List<Transform> newList = new List<Transform>(list);
        int i = 0;
        while (newList.Count > 0)
        {
            int rand = Random.Range(0, newList.Count);
 
            Vector3 pos = newList[rand].position;
            list[i].position = pos;
 
            newList.RemoveAt(rand);
            i++;
        }
    }
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
12.04.2022, 23:42
ProgramistKrol, чего ты пытаешься добиться, если элементарных вещей не понимаешь? Может стоит начать с чего-то попроще, книжку почитать, например?

Внутри цикла while в самом конце напиши:
C#
1
2
3
4
Debug.Log("i " + i);
Debug.Log("rand " + rand);
Debug Log(list[i].position);
Debug Log(newList[rand].position);
0
0 / 0 / 0
Регистрация: 22.03.2022
Сообщений: 51
13.04.2022, 00:20  [ТС]
Короче я узнал, что все объекты перемещаются в последний созданный объект. Извините, что вот так туплю, просто видимо сегодня только такое происходит.

Добавлено через 12 минут
Кстати, я ещё хотел предложить, может вместо вот этого всего можно как-то задать несколько определённых позиций и потом просто задать объектам перемещение в них, рандомным образом, при условии, что в одной позиции может быть только один объект. Как думаете?
0
566 / 363 / 208
Регистрация: 18.10.2019
Сообщений: 1,231
13.04.2022, 18:02
Лучший ответ Сообщение было отмечено ProgramistKrol как решение

Решение

ProgramistKrol, ох, и заставил ты меня помучаться, однако. Но теперь всё должно быть как надо (проверил в собственном проекте). Проблемой прошлого кода была возможность попадания несколько раз в одни и те же координаты. Здесь же я эту проблему исправил. По сути всё решается перемешиванием массива, но, к сожалению, в C# нет встроенного метода перемешивания List или Array, потому приходится довольствоваться тем, что есть. Думаю, комментарии, приведённые в коде помогут разобраться в его работе (если тебе или кому-то ещё это будет интересно )
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
using System.Collections.Generic;
using UnityEngine;
 
public class SomeClass : MonoBehaviour
{
    [SerializeField] private List<Transform> _pointsOfObjects;
 
    private void SomeMethod()
    {
        RandomizePositions(_pointsOfObjects);
    }
 
    private void RandomizePositions(List<Transform> list) 
    {
        List<Vector3> posList = new List<Vector3>(); // создаём новый список для позиций
 
        for(int i = 0; i < list.Count; i++) // наполняем новый список позициями объектов
            posList.Add(list[i].position);
 
 
        for(int j = 0; j < list.Count; j++)
        {
            Vector3 rand = posList[Random.Range(0, posList.Count)]; // выбираем рандомный объект из списка
            list[j].position = rand; // даём объекту в исходном списке найденную позицию
            posList.Remove(rand); // удаляем из списка с позициями найденный объект, чтобы не повторялись позиции
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.04.2022, 18:02
Помогаю со студенческими работами здесь

Как переместить один спрайт в направлении другого?
Есть два квадрата. Как прибавлять x и y так, чтобы первый квадрат двигался ко второму (по нажатию на мышь)? Есть ответ тут cut но я...

Разместить 10 коней на доске 8х8 так, чтобы ни один из них не бил другого
Здраствуйте, в универе задали задачу: написать программу, которая разместит 10 коней на доске 8х8 так, чтобы ни один из них не бил другого....

Расставить на шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого
Задача: «Расставить на стандартной 64-клеточной шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого»....

Как сделать так, чтобы на графике (лабиринт) рандомно строился вектор
Добрый день, у меня такой вопрос. Есть лабиринт, по которому должен ходить робот. Стенки этого лабиринта задал в матлабе в виде массива....

На доске заданного размера расставить k ферзей так, чтобы ни один из них не находился под боем другого
Условие задачи исходит из следующей: &quot;Расставить на стандартной 64-клеточной шахматной доске 8 ферзей так, чтобы ни один из них не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru