Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > 2D/GUI

2D/GUI Вопросы на тему 2D графики и интерфейсов

Ответ
 
Опции темы
Старый 09.11.2015, 06:05   #1
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Проделки позиции элемента 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, в чём дело?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 09.11.2015, 07:10   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проделки позиции элемента GUI

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

Вообще с позиционированием элементов UI из кода есть свои заморочки, стараюсь этого не делать. Обычно все координаты заранее в префабе прописаны. Делаю просто
var uiElement Instantiate(prefab);
uiElement.GetComponent<RectTransform>().SetParnet(parentTransformfalse); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
ABTOMAT (09.11.2015), Жека (09.11.2015)
Старый 09.11.2015, 08:47   #3
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Проделки позиции элемента GUI

Надо использовать
transform.localPosition
Так же может быть, что у твоего элемента измененный anchor и соответственно у него пивот будет не в центре. При этом если не ошибаюсь в диспетчере будет показывать координаты как будто пивот стоит в центре твоего элемента.
(Offline)
 
Ответить с цитированием
Старый 09.11.2015, 21:05   #4
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Проделки позиции элемента GUI

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

Вообще с позиционированием элементов UI из кода есть свои заморочки, стараюсь этого не делать. Обычно все координаты заранее в префабе прописаны. Делаю просто
var uiElement Instantiate(prefab);
uiElement.GetComponent<RectTransform>().SetParnet(parentTransformfalse); 
Ну у меня не получится заранее в префабе всё прописать.
Дело в том что стоит задача: над каждым объектом из списка на гуе поместить кнопку. Соответственно координаты приходится рассчитывать рантайм.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 09.11.2015, 22:34   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проделки позиции элемента GUI

Если объекты одинаковые, то можно:
1. Разместить кнопку над одним из них как чайлд объекта (поставить anchor к верхней грани как требуется)
2. Сделать кнопку префабом
3. Размещать над всеми остальными моим способом (приводил выше), делая для кнопки парентом нужный объект.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 09.11.2015, 23:39   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Проделки позиции элемента GUI

Объекты имеется в виду — в 3D пространстве, это что-то меняет?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 10.11.2015, 04:39   #7
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Проделки позиции элемента GUI

Проверил с localPosition — кнопка перемещается в другое место, но всё равно не туда, куда сказано.
Даже, можно сказать, дела ещё хуже: раньше хотя бы X становился какой надо, теперь вообще рандомное чисто шо в X шо в Y.
Пойду ещё потыкаю, если найду причину отпишусь.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 10.11.2015, 05:04   #8
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Проделки позиции элемента GUI

Итак, господа!

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

// Инстансим 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);

// Теперь позиция задаётся корректно! 
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
impersonalis (10.11.2015), Жека (10.11.2015)
Старый 10.11.2015, 07:30   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Проделки позиции элемента GUI

Кхм... про 3d пространство надо было сразу написать. С 3D объектами может быть по разному, т.к. канвас бывает и WorldSpace, привязанный непосредственно к 3d объекту.
Т.е. сейчас ты проецируешь координаты 3D объекта на экран и потом указываешь их как позицию?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 10.11.2015, 07:46   #10
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Проделки позиции элемента GUI

Да, через неё.
А есть способ лучше?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 10.11.2015, 08:12   #11
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Проделки позиции элемента GUI

не знаю как вы, а я делаю все просто:
Vector3 pos RectTransformUtility.WorldToScreenPoint (Camera.maintarget.position );
        
//pos.z=-1f;

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

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

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


Трансформ-бокс стоит строго по центру, но анхор у флажка выдвинут по z вперед, что бы относительно нуля стоял, а так как камера перспективная - получается такое смещение.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо RegIon за это полезное сообщение:
ABTOMAT (10.11.2015), pax (10.11.2015)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com