forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D/GUI (http://forum.boolean.name/forumdisplay.php?f=167)
-   -   Проделки позиции элемента GUI (http://forum.boolean.name/showthread.php?t=20074)

ABTOMAT 09.11.2015 06:05

Проделки позиции элемента GUI
 
Код:

// Префаб — это кнопка, сделанная через Create -> Button
GameObject attackButton = (GameObject)GameObject.Instantiate(Resources.Load("Prefabs/GUI/DummySkills/Attack", typeof(GameObject)));
// Аттачу её к канвасу
attackButton.transform.SetParent(GameObject.Find("UI").transform);
// Указываю позицию по Y -500
attackButton.transform.position = new Vector3(500,-500, -500);
// Z чисто для проверки вставил

...а оказывается она по X = 500, Y = -1025, в чём дело?

pax 09.11.2015 07:10

Ответ: Проделки позиции элемента GUI
 
а чего не transform.localPosition? В целом - пивот твоего парента не в нуле координат наверное. В инспекторе отображается localPosition.

Вообще с позиционированием элементов UI из кода есть свои заморочки, стараюсь этого не делать. Обычно все координаты заранее в префабе прописаны. Делаю просто
PHP код:

var uiElement Instantiate(prefab);
uiElement.GetComponent<RectTransform>().SetParnet(parentTransformfalse); 


Nex 09.11.2015 08:47

Ответ: Проделки позиции элемента GUI
 
Надо использовать
Цитата:

transform.localPosition
Так же может быть, что у твоего элемента измененный anchor и соответственно у него пивот будет не в центре. При этом если не ошибаюсь в диспетчере будет показывать координаты как будто пивот стоит в центре твоего элемента. :crazy:

ABTOMAT 09.11.2015 21:05

Ответ: Проделки позиции элемента GUI
 
Цитата:

Сообщение от pax (Сообщение 301162)
а чего не transform.localPosition? В целом - пивот твоего парента не в нуле координат наверное. В инспекторе отображается localPosition.

Вообще с позиционированием элементов UI из кода есть свои заморочки, стараюсь этого не делать. Обычно все координаты заранее в префабе прописаны. Делаю просто
PHP код:

var uiElement Instantiate(prefab);
uiElement.GetComponent<RectTransform>().SetParnet(parentTransformfalse); 


Ну у меня не получится заранее в префабе всё прописать.
Дело в том что стоит задача: над каждым объектом из списка на гуе поместить кнопку. Соответственно координаты приходится рассчитывать рантайм.

pax 09.11.2015 22:34

Ответ: Проделки позиции элемента GUI
 
Если объекты одинаковые, то можно:
1. Разместить кнопку над одним из них как чайлд объекта (поставить anchor к верхней грани как требуется)
2. Сделать кнопку префабом
3. Размещать над всеми остальными моим способом (приводил выше), делая для кнопки парентом нужный объект.

ABTOMAT 09.11.2015 23:39

Ответ: Проделки позиции элемента GUI
 
Объекты имеется в виду — в 3D пространстве, это что-то меняет?

ABTOMAT 10.11.2015 04:39

Ответ: Проделки позиции элемента GUI
 
Проверил с localPosition — кнопка перемещается в другое место, но всё равно не туда, куда сказано.
Даже, можно сказать, дела ещё хуже: раньше хотя бы X становился какой надо, теперь вообще рандомное чисто шо в X шо в Y.
Пойду ещё потыкаю, если найду причину отпишусь.

ABTOMAT 10.11.2015 05:04

Ответ: Проделки позиции элемента GUI
 
Итак, господа!

Указывать transform.position, как оказалось, это совсем не про то, получается совсем не то, что надо.
Чтобы добиться результата, надо указывать anchoredPosition, который есть у компонента RectTransform. Он, хоть и наследник Transform, но просто по .transform до него не достучаться, нужно "по матчасти" вызывать его через GetComponent.
Собственно решение:

PHP код:

// Инстансим UI элемент
GameObject attackButton = (GameObject)GameObject.Instantiate(Resources.Load("Prefabs/GUI/DummySkills/Attack"typeof(GameObject)));
// Получаем его компонент RectTransform 
RectTransform attackTransform attackButton.GetComponent<RectTransform>();

// Задаём парента
attackTransform.SetParent(GameObject.Find("UI").transform);
// Задаём позицию
attackTransform.anchoredPosition = new Vector2(500,-200);

// Теперь позиция задаётся корректно! 


pax 10.11.2015 07:30

Ответ: Проделки позиции элемента GUI
 
Кхм... про 3d пространство надо было сразу написать. С 3D объектами может быть по разному, т.к. канвас бывает и WorldSpace, привязанный непосредственно к 3d объекту.
Т.е. сейчас ты проецируешь координаты 3D объекта на экран и потом указываешь их как позицию?

ABTOMAT 10.11.2015 07:46

Ответ: Проделки позиции элемента GUI
 
Да, через неё.
А есть способ лучше?

RegIon 10.11.2015 08:12

Ответ: Проделки позиции элемента GUI
 
не знаю как вы, а я делаю все просто:
PHP код:

Vector3 pos RectTransformUtility.WorldToScreenPoint (Camera.maintarget.position );
        
//pos.z=-1f;

transform.position pos

(не знаю зачем эта обертка, вызывается все равно метод камеры, только сейчас референс провел и помотрел как и что)

Canvas в overlay стоит, иначе пляски с бубном начинаются.
А если канва в WorldSpace, то там объекты находятся в мировом пространстве и нужно сделать сначала WorldToScreen а потом ScreenToWorld, но уже с z-глубиной канваса, иначе все будет смещаться . (не знаю другого способа трансформировать координаты относительно матрицы вида камеры)

Тут еще смещение может быть из-за того, что точка объекта выше самого объекта. Как у меня тут:


Трансформ-бокс стоит строго по центру, но анхор у флажка выдвинут по z вперед, что бы относительно нуля стоял, а так как камера перспективная - получается такое смещение.


Часовой пояс GMT +4, время: 17:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot