namespace Bezier { public class BezierCurve { private float[] valuesX; private float[] valuesY; private float[] valuesZ;
public BezierCurve(Vector3[] vectors) { SetControlPoints(vectors); }
public void SetControlPoints(Vector3[] vectors) { valuesX = new float[vectors.Length]; valuesY = new float[vectors.Length]; valuesZ = new float[vectors.Length];
for (int i = 0; i < vectors.Length; i++) { valuesX[i] = vectors[i].x; valuesY[i] = vectors[i].y; valuesZ[i] = vectors[i].z; } }
public Vector3 GetValue(float t) { return new Vector3( BezierMath.GetValueHorner(t, this.valuesX), BezierMath.GetValueHorner(t, this.valuesY), BezierMath.GetValueHorner(t, this.valuesZ) ); } }
public static class BezierMath { // Info // http://www.gamedev.net/page/resources/_/technical/math-and-physics/practical-guide-to-bezier-curves-r3166 // http://pomax.github.io/bezierinfo/
/// <summary> /// Точка кривой методом Горнера /// </summary> /// <param name="t">Параметр от 0.0 до 1.0</param> /// <param name="controlPoints">Управляющие точки по одной из координат</param> /// <returns>Координата точки</returns> static public float GetValueHorner(float t, float[] controlPoints) { if (controlPoints.Length == 0) // А для одной точки возвращается сама точка throw new ArgumentException("controlPoints.Length == 0."); float u = 1.0f - t; float bc = 1; float tn = 1; float tmp = controlPoints[0] * u; int order = controlPoints.Length - 1;
for (int i = 1; i < order; i++) { tn *= t; bc *= (float)(order - i + 1) / i; tmp = (tmp + tn * bc * controlPoints[i]) * u; } return (tmp + tn * t * controlPoints[order]); } } }
BezierDrawer.cs Повесить на пустой объект.
Код
using UnityEngine;
[RequireComponent(typeof(LineRenderer))] public class BezierDrawer : MonoBehaviour { public Vector3[] ControlPoints = new Vector3[]{ new Vector3(-3f, 0f, 0f), new Vector3(0f, 4f, 0f), new Vector3(0f, 4f, 0f), new Vector3(3f, 0f, 0f), };
Bezier.BezierCurve curve;
void Update() { curve = new Bezier.BezierCurve(ControlPoints);
var lr = GetComponent<LineRenderer>(); const int vertexCount = 100; lr.SetVertexCount(vertexCount); for (int c = 0; c < vertexCount; c++) { Vector3 currPos = curve.GetValue((float)c / (vertexCount - 1)); lr.SetPosition(c, currPos); } } }
EchoIT, упоротые идеи - это всегда хорошо, хоть разнообразия появляется, появляются люди которые не повторяю(изобретать велосипед скучно). Вариант выше работает, да. О кривых я тоже думал :D
EchoIT, знаешь, что сделал бы другой человек с этой проблемой - пошёл бы искать ассет :D Поэтому, ещё раз говорю, я просто обожаю "упоротые" идеи и их авторов =)
Сообщение отредактировал ShortKedr - Понедельник, 25 Июля 2016, 14:48
Lertmind, это ты щас сам с кодом заморочился или уже взял готовое? (не припомню, чтобы кто-то ради ответа в этот тред столько кода писал ) Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Понедельник, 25 Июля 2016, 14:46
Lertmind, класс типа не меняет размер массивы или я что-то не понял? =) Остался один вопрос: "Искривиться ли оно полукругом правильно, или придётся кучу доп. точек добавлять?"
Сообщение отредактировал ShortKedr - Понедельник, 25 Июля 2016, 14:57
EchoIT, у меня был небольшой класс Безье, подогнал.
Неплохо бы себе подобного накодить. :D
ЦитатаShortKedr
EchoIT, знаешь, что сделал бы другой человек с этой проблемой - пошёл бы искать ассет :D Поэтому, ещё раз говорю, я просто обожаю "упоротые" идеи и их авторов =)
Я, как программист, готов смириться с любыми чужими ассетами (и то с печалью), но только не с кодом, разве что в Unity3d из коробки который) Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Понедельник, 25 Июля 2016, 14:58
ShortKedr, через SetControlPoints можно установить новые контрольные точки или ты о другом? Если что-то человеку захочется, он изменит, это пример. Про второй вопрос: придётся подбирать, если нужен полукруг - твой способ лучше.
ShortKedr, через SetControlPoints можно установить новые контрольные точки или ты о другом? Если что-то человеку захочется, он изменит, это пример. Про второй вопрос: придётся подбирать, если нужен полукруг - твой способ лучше.
Ещё бы услышать цель, для которой эти координаты нужны. Мне кажется, для приведённого изображения кривые должны сработать неплохо. Долгожданный анонсик: State of War
EchoIT, нууу, относительно, с полукругом долго заморачиваться нужно =)
Добавлено (25 июля 2016, 15:17) ---------------------------------------------
ЦитатаEchoIT ()
Я, если честно, к новому UI ещё не привык, и изучаю его потихоньку. До последнего пользовался ещё guiTexture и guiText.
Неприличная особенность UI - это много, просто неприлично много классов MonoBehaviour =) Вторая особенность - У тебя сразу рисуются все объекты и что бы что-то убрать, нужно это найти и удалить. Третья особенность - 3д вывод, UI имеет 3д mesh для каждого элемента, можно искривлять UI как вздумается =)
И есть один секрет тёмных эльфов для правильного соотношения сторон, когда у Canvas Scaler есть ползунок Width-Height:
Код
using UnityEngine; using System.Collections; using UnityEngine.UI;
namespace Game.UI{ public class AutoMatch : MonoBehaviour {
public CanvasScaler scaler; private Vector2 lastScreenSize = Vector2.zero;
Третья особенность - 3д вывод, UI имеет 3д mesh для каждого элемента, можно искривлять UI как вздумается =)
Кстати довольно удобно, ящитаю.
Цитата
И есть один секрет тёмных эльфов для правильного соотношения сторон, когда у Canvas Scaler есть ползунок Width-Height
Походу нечто подобное я и искал. Правильно ли я понял, что это позволит избежать артефактов "смазывания" текста или искажения изображений элементов интерфейса на разных соотношениях сторон монитора? Долгожданный анонсик: State of War
EchoIT, это позволяет избежать артефактов так называемого обратного соотношения. Когда у тебя 16:9 соотношения то всё нормально, а вот если, например становится противоположное соотношение, например на квадратных мониторах оно далеко не 16:9, то получается, что элементы лезут за пределы экрана. Вот для решение этой проблемы данный код.
Смазывание я решал довольно просто: уменьшаешь scale элементов на 20%, а размер повышаешь на те же 20% и в canvas убираешь pixel perfect. По моим наблюдениям, именно pixel perfect порождает эту проблему. Ну а scale просто для резкости Упоротые идеи решают все проблемы
Сообщение отредактировал ShortKedr - Понедельник, 25 Июля 2016, 17:17
EchoIT, это позволяет избежать артефактов так называемого обратного соотношения. Когда у тебя 16:9 соотношения то всё нормально, а вот если, например становится противоположное соотношение, например на квадратных мониторах оно далеко не 16:9, то получается, что элементы лезут за пределы экрана. Вот для решение этой проблемы данный код.
Ой, ну кому в 2к16 нужны квадратные мониторы? :D
ЦитатаShortKedr
Смазывание я решал довольно просто: уменьшаешь scale элементов на 20%, а размер повышаешь на те же 20% и в canvas убираешь pixel perfect. По моим наблюдениям, именно pixel perfect порождает эту проблему. Ну а scale просто для резкости
Странно, у меня "мазня" наблюдается и без pixelperfect. Если разрешение кратно двойке, то положения типа 24 пикселя нормально выглядят, а вот 25 - уже размазанно. А для веба ещё интересней. Стандартный плеер 960x601, и всё работает ровно наоборот. Не знаю, может я где-то накосячил. %)
UPD: между прочем, Pixel Perfect, который я раньше не юзал, эту проблему решает. Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Понедельник, 25 Июля 2016, 17:27
Да, да знакомо - фишка UI, вот и приходится извращаться со scale и прочими штуками =) Понаблюдай за изменениями элементов в зависимости от разрешения экрана, возможно было бы интересно сделать, что бы scale вычислялся в зависимости от размера рендера. Ещё UI это же 3д техника, может лучше будет, если overlay на render перед камерой заменить
Сообщение отредактировал ShortKedr - Понедельник, 25 Июля 2016, 17:33
Понаблюдай за изменениями элементов в зависимости от разрешения экрана, возможно было бы интересно сделать, что бы scale вычислялся в зависимости от размера рендера.
Я тоже об этом подумал, надо будет сделать небольшой фикс.
ЦитатаShortKedr
Ещё UI это же 3д техника, может лучше будет, если overlay на render перед камерой заменить
А вот это кстати хз, вроде пробовал, для обычного UI overlay мне больше понравился, хотя даже и не помню уже, в чём разница. Долгожданный анонсик: State of War
По какой причине UI-content съезжает с положенного места? С размерами\настройками\камерой играл, результат один. После нескольких запусков сцены content в Scroll View оказывается не на своём месте. Не критично, при запуске билда он падает обратно (буквально, с эффектом выдающего контента), но не нужно.
Бозингар, когда создаёшь новый Scroll View, такое сразу проявляется? Если нет, то скорее всего какие-то настройки сбили. Лучше выложили проект с этой проблемой.