Помогите пожалуйста, новичок в unity (абсолютный), работаю в unity 5. Нужно сделать, чтобы при нажатии на кнопку одновременно изменялась текстура модели и появлялось окно с информацией. Как это сделать? Что нужно использовать? Чтение мануалов ничего не дало.
Справка - это справка, а не ответы на распр. вопросы. Отвечаю: if() //нажатие на кнопку { //изменить текстуру //включить окно с информацией } Какое конкретно окно (про само окно, его конечную конструкцию, а главное - из чего оно)? Про текстуру тоже подробней, но здесь интересует hierarchy. Правила форума · участникGCC
В окне должно выводиться изображение, а в идеале несколько изображений, переключаемых кнопкой. Текстура... Модель сама - головной мозг, она должна подсвечиваться в определённых отделах при нажатии. Я правильно понимаю, это hierarchy? Или Вас интересует что-то другое?
Сообщение отредактировал GST - Пн, 23 Мар 2015, 23:03
Из чего окно? GUI, UI, 2D == sprite, 3D? Разные системы - разный способ обращения. Про текстуру интересовало то, где она используется, что конкретно менять? Саму текстуру изменить, сменить текстуру в материале == переназначить текстуру? Правила форума · участникGCC
Я вообще не понимаю как в Unity 5 работать с GUI, тут всё изменилось, так что, пожалуй, UI. Менять нужно цвет текстуры, наверное это будет удобнее сделать через изменение текстуры в материале. Создать для каждого отдела свой материал и менять его текстуру.
GUI остался прежним - он "заморожен", как базовая система.
ЦитатаGST ()
Менять нужно цвет текстуры, наверное это будет удобнее сделать через изменение текстуры в материале. Создать для каждого отдела свой материал и менять его текстуру.
Но можно менять цвет в материале, не меняя текстуры. Можно всё что угодно, поэтому - конкретно. Есть 1 - UI.Button, 2 - куб с материалом, в котором надо поменять текстуру и 3 - "UI.Window". Значит так: 1) Можно через скрипт отлавливать нажатие (как и на любом объекте): void OnMouseDown(){} и т.д. и т.п. вроде как есть ещё что-то и в Event System (они должны быть связанны), но я с этим не работал. можно добавить как компонент свой Event Trigger (через Event добавляется): можно использовать тот менеджер, что есть у Button - как пользоваться поймёте: нажимаете добавить, выбираете объект, выбираете функцию, далее переменную/метод: Для чистоты лучше поставить флаг - нажимать можно бесконечно долго, и тогда функция наша будет вызываться бесконечно. 2)Вот тут может быть по разному. Если только наша button: по нажатии запускать функцию (можно и bool завести, и в пустую в Update его проверять), которая будет менять текстуру (или что там надо будет делать). Проблема тут одна - меняем материал, а он у нас меняется насовсем (сложно объяснить, попробуйте). Менять текстуру надо исходя из конкретного шейдера материала, но в принципе - Material.SetTexture 3) Делаете окошко. Вызываем там же, где меняли текстуру - SetActive(true);
Добавлено (24 Мар 2015, 23:05) --------------------------------------------- Вопрос возник, я попытался использовать ваш скрипт в кнопке, что нужно делать с полем, где нужно выбрать из No Funtion и MonoScript? В моноскрипте только один вариант - string name, а дальше появляется пустое поле. Что туда вводить?
Открываете проект unity (любой), далее - Assets -> Import package -> custom package - выбираете то, что я Вам скинул в этой теме (я скинул ассет) - дальше разберётесь. Тот минименеджер на button: 1) Сверху написано: OnClick - что написано, то и значит. Т.е. при нажатии на кнопку вызовется то, что будет дальше. 2) Окошко для любого объекта, к компоненту которого Вы будете обращаться. 3) В списке выбирается публичная функция/переменная (непубличные не будут доступны - но это и так понятно из названия), присутствующая на выбранном объекте. 4) Если возможно задать значение (к примеру меняем bool) - задаём значение. http://unity3d.com/learn/tutorials/modules/beginner/ui/ui-button Правила форума · участникGCC
Открываете проект unity (любой), далее - Assets -> Import package -> custom package - выбираете то, что я Вам скинул в этой теме (я скинул ассет) - дальше разберётесь.
Я так и сделал, не открывается только "фыф" - выдаёт эту ошибку.
Я разобрался с этим. Сделал так, чтобы через кнопку менялся материал. Остался один вопрос, как сделать так, чтобы при повторном нажатии материал "вставал на место"?
Добавлено (25 Мар 2015, 18:29) --------------------------------------------- Всё, разобрался, если делать через скрипт toggle, всё получается. Спасибо
Добавлено (25 Мар 2015, 20:01) --------------------------------------------- А можете написать коротенький скрипт на перемену материала в MeshRenderer? У меня получается какой-то несуразный код, который не работает, так и не понял как его писать. Мне его нужно будет вставить в саму модель, чтобы потом через toggle менять материал. В toggle есть статичные параметры и динамичные, вот мне надо, чтобы он динамичным был.
Сообщение отредактировал GST - Ср, 25 Мар 2015, 20:04
Осталась проблема... Попробуйте поставить этот скрипт. Когда ставишь флажок в toggle, скрипт запускается, всё отлично, нужная мне область моргает. А когда флажок снимаешь, то остаётся цвет, который был на тот момент. Как это решить, чтобы цвет был изначальный?
Вообще - заводите bool, его и меняете (а можно и на самом тугле сделать глобальный скрипт). В Update проверяете bool, и, в зависимости от значения, задаёте цвет "покраски". Отдельно от проверки bool задайте через Lerp цвет материала. Вот немного по другому:
Код
using UnityEngine; using System.Collections;
public class СменаТекстуры : MonoBehaviour { public Texture другая_текстура; public bool сменить_цвет; private Color32 цвет, цвет2;
void Start() { цвет = GetComponent<Renderer>().material.color;//запоминаем "родной" цвет }
void Update() { if (сменить_цвет)//если надо сменить цвет, то задаём его. { цвет2 = Color32.Lerp(new Color32(1, 1, 1, 1), new Color32(0, 0, 0, 0), Mathf.PingPong(Time.deltaTime, 2) / 1); //чё-то оно не мигает. } else//иначе { цвет2 = цвет;//цвет, на который меняем, будет равен "родному" цвету. } GetComponent<Renderer>().material.color = Color32.Lerp(GetComponent<Renderer>().material.color, цвет2, (Mathf.PingPong(Time.deltaTime, 1) / 1));//самое главное - для плавности Lerp выносим его просто в Update и задаём в него цвет между настоящим цветом и цветом, на который надо менять. }
public void ПоменятьТекстуру()//вызываемый нами метод { if (сменить_цвет)//меняем значение на противоположное { сменить_цвет = false; } else { сменить_цвет = true; } //GetComponent<Renderer>().materials[0].SetTexture("_MainTex", другая_текстура); } }
Добавлено (26 Мар 2015, 23:02) ---------------------------------------------
Цитатаигнат ()
Вообще - заводите bool, его и меняете (а можно и на самом тугле сделать глобальный скрипт). В Update проверяете bool, и, в зависимости от значения, задаёте цвет "покраски". Отдельно от проверки bool задайте через Lerp цвет материала.
Мне конечно неловко... Но можно по-русски и поподробнее, я просто не знаю c#, и вообще не программист
public void ПоменятьТекстуру() { if (GetComponent<Renderer>().material.GetTexture("_MainTex") == текстура1)//если текстура материала - это первая (родная текстура) { GetComponent<Renderer>().material.SetTexture("_MainTex", текстура2);//то меняем её на вторую } else//наоборот - { GetComponent<Renderer>().material.SetTexture("_MainTex", текстура1);// - меняем на первую } } }