Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity #LineRender #Редактирование линии; Подскажите возможные варианты реализации?

Unity #LineRender #Редактирование линии; Подскажите возможные варианты реализации?

Поделиться
DellLoiDПостоялецwww7 авг. 201721:53#0
Скрипт умеет рисовать линии по нажатию.

Требуется реализовать редактирование линии.

Думал получится одеть коллайдер на линию и при нажатии на коллайдер линии и зафиксировав нажатие по коллайдеру линии, создать точку линии в месте нажатия и фиксировать их пока палец на экране телефона. Если палец отпустили записать координаты точки.

Но судя по всему на саму линию коллайдер не одеть так просто.

1. Знает кто нибудь как одеть коллайдер на линию что бы коллайдер облегал только сегменты линии??

2. Или не заморачиваться с коллайдерами т.к. это реализовать очень сложно и время затратно??

ChupakaberПостоялецwww7 авг. 201722:00#1
1. добавить на каждый сегмент новый GameObject с CapsuleCollider вытянутым от одной точки до другой
2. с коллайдерами не сложно, но скорее всего производительнее будет считать без коллайдеров, просто геометрию школьную вспомнить и перевести экранные координаты в 3х-мерные, вспомогательные инструменты для этого в юнити все есть
DellLoiDПостоялецwww7 авг. 201722:33#2
Chupakaber
Спасибо большое.
Про второй вариант подскажите подробнее если можно.
У меня 2D лист. На него спавнятся точки(спрайты) с коллайдерами. Водим пальцем по экрану между точками и между ними с помощью line render создается линия. Редактировать надо поскольку точки спавняться все время задача соединить их все линиями. Поэтому будет требоваться часто редактировать линию.

Я не прогер. Опыт общения с юнити 6-7 месяцев. Леплю прототип коревой механики что бы отплейтестить формулу эффективности, внести ручные правки в неё.

Какие вспомогательные инструменты гуглить??

TokarnПостоялецwww8 авг. 20171:04#3
Зачем коллайдеры на сегменты? О_О
Не проще работать с координатами точек и их количеством?
Если не проггер, но пытаешься что-то стряпать, запиши хотя бы какой нибудь внятный алгоритм.

Навроде (Хотя таким никто не пользуется, наверно):
"ЕСЛИ [нажали клавишу мыши], начинаем рисовать линию. (ЕСЛИ указатель касается коллайдера точки, первое нажатие = первая точка линии)"
"пока [держим клавишу мыши], Вторая точка = положение указателя на экране"
"ЕСЛИ [отпустили клавишу мыши], проверяем (ЕСЛИ указатель касается коллайдера точки, и она не задействована, вторая точка = положение точки, к которой касается указатель, ИНАЧЕ удаляем вторую и первую точку)"
и тд.

А то ведь ничего не понятно из задумки.

Правка: 8 авг. 2017 1:06

ChupakaberПостоялецwww8 авг. 20175:10#4
Tokarn
> Навроде (Хотя таким никто не пользуется, наверно):
я таким пользуюсь часто
ну только подальше от псевдокода на русском и ближе к простым логическим высказываниям
когда в блокноте белый лист и немного такой словесной логики - можно легко найти в ней проблему и переделать
а когда в коде, оно может казаться, и даже быть работоспособным. но в корне неверным

DellLoiD
> Про второй вариант подскажите подробнее если можно.
придется немного всё же в программировании разобраться
свои точки хранить в некой структуре данных, например в массиве, чтобы их можно было в коде перебрать
от точек нужны: 1. координаты точки в 2D , это Vector2
его можно сделать из transform.position (Vector3) точек: Vector2 pointPosition = new Vector2(point.transform.position.x, point.transform.position.y);
(или "y" заменить на "z". в зависимости как расположен у тебя лист)
2. ссылка на объект точки GameObject, если точка имеет свою собственную графику
чтобы при изменении/удалении точки в массиве, можно было сразу изменить и графику точки на сцене
3. ссылки на связанные точки (между которыми уже протянуты линии)
это нужно чтобы определить между какими точками эти линии есть, и чтобы перестраивать LineRenderer-ы

по клику/тапу на экран мы можем найти луч от зрителя вперёд в сцену
от этого луча нас интересует точка пересечения луча и плоскости листа, на котором у тебя точки

чтобы получить луч от зрителя:
https://docs.unity3d.com/ScriptReference/Camera.ScreenPointToRay.html
https://docs.unity3d.com/ScriptReference/Camera.ViewportPointToRay.html
думаю, ты пользовался одним из этих примеров, когда реализовывал клик по коллайдеру, подставляя туда значение "Input.mousePosition"

точка пересечения луча и плоскости это задачка по геометрии, не самая сложная
http://www.gamedev.ru/code/forum/?id=177952

а дальше уже отбрасываешь лишнюю координату у этой точки и всё сводится к двумерным вычислениям

и зависит дальше всё от логики, которую ты закладываешь в это вот всё

например, если нужно найти линию между двумя точками, ближайшую к твоей точке клика/тапа, то перебираешь все линии по массиву твоих точек:

MyPointClass[] points;
...
MyPointClass point1;
MyPointClass point2;
for(int i = 0; i < points.Length; i++)
{
  point1 = points[i];
  for(int j = 0; j < points.Length; j++)
  {
    point2 = points[j];
    if(CheckIntersection(point1, point2, clickPoint))
    {
    }
  }
}
где CheckIntersection - метод, проверяющий наличие на отрезке ( point1 ; point2 ) точки, являющейся проекцией точки clickPoint на прямую ( point1 ; point2 ), и проверяющий расстояние от этой точки-проекции до точки clickPoint (то есть расстояние от точки до прямой)
если расстояние до прямой подходящее, т.е. маленькое, и точка-проекция не заходит за границы отрезка, то значит мы хотели тыкнуть на эту вот линию, и дальше уже с ней работаем
при этом зная болижайшую точку на этой линии куда мы тыкали (точка-проекция от clickPoint)

в общем как выше советовали - составьте простую логическую цепочку действий, которые требуется произвести над этими точками-линиями, и всё станет намного понятнее

DellLoiDПостоялецwww8 авг. 201711:16#5
Большое спасибо.
Массивы я использую.
Выбираю обычно самый простой способ реализации. т.к. времени очень мало. Понятно что код очень плохой. Но памяти много не жрет, работает. И код самоцелью не является.

Мне еще советуют посмотреть: Describing lines polygon collider generation unity - подскажите форму самого коллайдера нужно будет прописывать "ручками" через код. сам юнити автоматом этот полигональный коллайдер на линию одеть не сможет?

Спасибо за пример кода. Сейчас как раз буду переделывать создание линий. Возможно этот подход удастся реализовать.

ChupakaberПостоялецwww8 авг. 201711:25#6
DellLoiD
> Мне еще советуют посмотреть: Describing lines polygon collider generation unity
> - подскажите форму самого коллайдера нужно будет прописывать "ручками" через
> код. сам юнити автоматом этот полигональный коллайдер на линию одеть не сможет?
если есть в наличии скрипт, который умеет с LineRenderer, для таких целей как у тебя как раз написанный, то все будет само

но я такого пока не встречал, можно поспрашивать тут, может кто встречал

TokarnПостоялецwww8 авг. 201711:51#7
Есть на ассетах, но платный. И не вариант что точно то, что нужно.
https://www.assetstore.unity3d.com/en/#!/content/33754

/ Форум / Программирование игр / 2D графика и изометрия

2001—2017 © GameDev.ru — Разработка игр