Как сделать появление кнопки в unity

Обновлено: 07.07.2024

Хорошо, я бы посоветовал вам использовать новую систему Unity UI вместо использования графического интерфейса Immediate Mode (функции OnGui). Вы все равно можете управлять вещами программно с легкостью, но с этим может работать намного проще.

Вы упоминаете использование панелей и масок, но они не смешиваются с установкой OnGui, то есть устаревшей системой пользовательского интерфейса и должны использоваться только для подключаемых модулей Unity.

Тем не менее, есть отличные учебные ресурсы, которые полностью соответствуют вашим трем учебникам на сайте Unity:

И если у вас нет никакого опыта, используя новую систему на главной странице учебника здесь.

Надеюсь, это поможет.

Попробуйте этот код:
(взято из справки Unity Script для GUI.BeginScrollView)

Вы можете добавлять кнопки в вертикальную или горизонтальную группу легко из редактора или из кода. Вы просто создаете префикс кнопки и размещаете их внутри родителя горизонтальной группы.

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

UGUI Визуальное создание и объединениесобытиеОчень удобное, динамическое создание может быть создано с использованием созданного Prefab, но это немного сложно в связанных событиях. Эта статья суммирует несколькокнопкаКак связаны события привязки.

1. Создание визуализации и привязка событий

Шаг 1: Создать с помощью панели Иерархия UI > Button .

612a529903eeef992f37483ca512c5bd.jpe

Шаг 2. Создайте сценарий TestClick.cs, который определяет открытый метод Click.

Шаг 3: Выберите кнопку в иерархии, Add Component Скрипт TestClick.cs

Шаг 4: В Button(Script) Свяжите метод Click в сценарии TestClick.

2146363246d20b9842215d4adf16d45e.jpe

2. Свяжите события, напрямую связав скрипт

Шаг 1: Создать с помощью панели Иерархия UI > Button .

Шаг 2. Создайте сценарий ClickHandler.cs, определите закрытый метод OnClick (), добавьте прослушиватель события click для Button в методе Start () и передайте его в метод OnClick в качестве параметра.

Шаг 3: Привязать ClickHandler к объекту Button.

6b615cab6ff357178c4bb46d2aa70b7f.jpe

В системе UGUI Button обеспечивает по умолчанию только метод вызова OnClick, иногда нам нужно отслеживать мышь в событии (MouseIn) и mouse out (MouseOut). Для достижения этого нам необходимо использовать скрипт EventTrigger в системе пользовательского интерфейса.

Шаг 1: Создать с помощью панели Иерархия UI > Button .

Шаг 2. Создайте сценарий EventTriggerHandler.cs и используйте UnityEngine.EventSystems.EventTrigger для добавления событий мониторинга.

Шаг 3: Привязать сценарий EventTriggerHandler.cs к кнопке.

1cf48fbceda96772c9baf45e66613786.jpe

4. Реализовать мониторинг событий через MonoBehaviour для реализации интерфейса событий.

Шаг 1: Создать с помощью панели Иерархия UI > Button .

Шаг 2: Создайте сценарий EventHandler.cs.

Шаг 3: Привязать скрипт к объекту Button.

8e15b694234bc976150b27ed843235cc.jpe

Как UGUI определяет, какая кнопка мыши нажата при нажатии на элемент пользовательского интерфейса? В приведенном выше коде мы можем отслеживать, является ли это левой кнопкой мыши или правой кнопкой в ​​соответствии с eventData.pointerId. Однако каждый элемент пользовательского интерфейса создает MonoBehaviour для мониторинга различных событий, что, очевидно, не очень хорошо. Далее следует использовать Delegate и Event для создания общего класса UIEventListener для обработки событий (режим наблюдателя).

720ed69ea50d76c1c8560a5e24691814.jpe

Скрипт TestEvent может быть привязан к кнопке.

Выполнить код при нажатии указанной клавиши, можно через метод Input.GetKey() .

Чтобы выполнить действие при нажатии на клавишу, для текущего объекта надо создать скрипт, в котором создать переменные типом KeyCode .

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

RPG Maker. KeyCode

Теперь можно выполнять код при нажатии на указанную клавишу через метод Input.GetKey() .

Управление для клавиш клавиатуры и геймпада также можно настроить в Edit → Project Settings → Input Manager.

Unity. InputManager

Параметр Name указывает имя клавиши, по которой можно будет обратиться через код.

Данный урок описывает основные моменты создания лифта с кнопками управления. Причем расположить кнопки можно как в самом лифте так и за его пределами. В этом и была фишка урока.

Давно хотел описать принцип работы лифта в Unity3D вот решился на это событие. Итак для создания лифта запускаем Unity3d и создаем проект.

В новый проект лучше добавить элементы управления персонажем чтобы нам не отвлекаться на лишние действия. Для этого нажимаем кнопку Asset packages.

Ставим галку на против пакета Characters (игрок по русски), это добавит компоненты для управления игроком.

В целом ничего не измениться даже если Вы установите все галки но после этого ваш проект будет огромным с кучей пока что не нужного барахла. Если это Вас не пугает, делать огромные бесполезные пробные проекты, тогда вперед. Итак все выбрали и запускаем создание нового проекта.

Ура Unity3D запустился и мы видим прекрасную сцену с одинокой камерой смотрящей в даль.

Для того чтобы наш будущий игрок мог ходить по полу его нужно создать. Итак добавим на сцену обычный куб который в дальнейшем станет полом для игрока. Для этого выберем пункт GameObject >> Cube

Кубик создастся размером по всем осям координат в единицу. Для какого то применения данный размер может и подойдет например для Minecraft но нам нужен пол.

Для изменения его размеров в инспекторе выставим размеры по ширине X и длине Z объекту например 100 на 100 и увидим как кубик превратился в импровизированный пол. Ура сцена есть.

Далее настроим камере управление чтобы мы могли двигаться по уровню и выполнять какие то действия. Для этого выделим камеру и добавим в ее компоненты систему управления. для этого выберем в меню следующий пункт.

Данный контроллер очень сложный скрипт позволяющий делать интересные эффекты с персонажем и отвечает он за перемещение, полеты, вращение головой и так далее. Нам достаточно будет того что наша камера будет просто двигаться. Поэтому найдем в параметрах пункт Walk Speed (скорость ходьбы) и выставим ее например в 1 чтобы камера смещалась при ходьбе с этой скоростью. Если будет стоять ноль то мы никуда не двинемся.

При запуске игры после этих манипуляций можно будет вращать камерой вверх в низ и двигаться по нашему уровню. Итак далее нужно создать лифт. У лифта будет набор органов управления.

1) кнопки управления внутри лифта.

2) кнопка вызова лифта на этаже.

Первым делом делаем лифт и опишем его поведение.

Создаем платформу из кубика которая будет символический лифтом.

Чтобы лифт отличался и его можно было увидеть на полу. Создадим простой материал и далее присвоим его лифту.

1) Чтобы создать материал щелкаем мышкой в Assets Store и и выбираем

2) тащим материал прям на объект сцены который будем раскрашивать

3) в полученном материале настраиваем цвет как хочется. Главное чтобы наша площадка выделялась и была видна.

Итак теперь опишем поведение данной площадки лифта. Если подумать как работает мотор лифта то можно узнать что у лифта есть всего 3 состояния.

1) лифт стоит на месте

2) лифт едет вверх

3) лифт едет вниз

Далее скорость лифта не меняется и она при движении постоянна.

Итак объявим 2 переменные одна будет означать направление движения лифта по оси Y

1) если значение 1 то двигаемся вверх

2) если значение 0 то стоим на месте

3) если значение -1 то двигаться вниз

Вторая переменная будет скорость движения платформы ( лифта ).

Unity3D переменные для движения лифта

public class EngineLift : MonoBehaviour

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

Чтобы двигать лифт нужно менять координату Y в параметре Transform.position относительно переменной направления умножив ее на скорость и прошедшие секунды. Добавим данное действие в функцию Update()

Unity3D функция движения лифта

public class EngineLift : MonoBehaviour

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

//получим текущую позицию лифта

Vector3 P = this.transform.position;

//задаем движение относительно оси Y

P.y = P.y + SpeedMove * VectorMove * Time.deltaTime;

//меняем координаты лифта на новые

this.transform.position = P;

Далее сохраняем и тащим наш скрипт на платформу чтобы он начал на ней работать при запуске игры

Запускаем и прямо во время игры задаем скорость и направление для движения лифта вверх. Всегда обнулив параметр VectorMove мы сможем остановить лифт а если поставить его в -1 то мы его просто заставим опускаться вниз.

Итак наш мотор работает поднимает и опускает кабину лифта. Теперь займемся кнопками управления. Что делает кнопка. Она включается в момент вызова лифта и отключается в момент когда лифт достиг ее высоты. Таким образом у кнопки есть 2 состояния и один параметр.

1) лифт вызван (кнопка горит)

3) Параметр на какой высоте должен остановиться лифт чтобы отключить кнопку.

Далее лифт не может двигаться бесконечно вверх или вниз поэтому зададим ему ограничения по высоте. Для этого объявим две переменные Max_Y и Min_Y которые будут ограничивать движение нашего лифта вверх и в низ.

Текстовое поле

//ограничение

public float Max_Y=10, //Максимальная высота

Min_Y=1; //минимальная высота

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

//получим текущую позицию лифта

Vector3 P = this.transform.position;

//задаем движение относительно оси Y

P.y = P.y + SpeedMove * VectorMove * Time.deltaTime;

if (P.y > Min_Y) //проверяем максимальную высоту

Создаем 2 материал вызвав контекстное меню в окошке assets store и даем ему имя off

Выделим данный материал и назначим ему цвет например синий.

Отлично далее создадим новый файл скрипта в котором опишем поведение нашей кнопки. Назовем его ButtonKlick и опишем в нем смену состояния кнопки во время щелчка по ней. Опишем в коде массив материалов в котором будут храниться цвета кнопок.

Unity3D массив материалов.

public Material[] MatOnOff;

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

Добавим кнопке переменную которая будет означать в каком она состоянии находиться в текущий момент. Она будет логического типа:

если значение будет true (правда)

значит мы на нее нажали; если значение будет (false) ложь значит мы на нее не нажали.

Далее сменим материал во время смены состояния кнопки.

Unity3D переменная состояния кнопки

public Material[] MatOnOff;

//переменная обозначения нажатия кнопки

public bool ON=false; //по умолчанию отключена

void ChangeON()

//присваиваем переключателю обратный вид

void OnMouseDown()

// Use this for initialization

// Update is called once per frame

void Update ()

//получаем параметр материала

Renderer rend = GetComponent ();

//если материал загружен в скрипт

//меняем цвет материала в зависимости от того нажата кнопка или нет

Кнопка будет хранить в себе координату в какой точке она ждет лифт (по сути координаты этажа куда нужно попасть чтобы погасить кнопку). Потом мы будем эту координату использовать при определении куда нужно ехать лифту. Итак добавляем это значение (переменную) нашей кнопке.

Unity3D координаты этажа кнопки

public float VY = 0;

Теперь чтобы кнопки у нас были одинаковые создадим в Assets контейнер (prefab)

и разместим в нем нашу настроенную кнопку, просто перетащив его из окна Hitrarhy сферу в созданный префаб.

Итак теперь мы готовы описать логику вызова лифта на нужный нам этаж.

Теперь мы можем описать алгоритм движения лифта на указанную высоту проходя вызванные кнопки. Создаем скрипт MoveLift.

Для текущей задачи добавим в код одну кнопку и ссылку на платформу лифта которой будем управлять с помощью этой кнопки.

Текстовое поле

public GameObject ButtonLift;

//лифт которым будем управлять

public GameObject Lift;

По идее, данный код можно будет повесить на весь лифт, например на стену лифта или на его основную панель управления. Главное чтобы при старте игры он фигурировал в ней. Я повешу его на камеру. Но нужно понимать что это не принципиально где он будет расположен.

Итак попробуем описать сначала запуск движения лифта на основе первой самой нижней кнопки. Для этого в скрипт добавим 2 переменные. Первая переменная будет ссылка на кнопку лифта которая должна управлять платформой, вторая переменная будет ссылка на платформу.

Unity3D кнопка управления лифтом

public GameObject ButtonLift;

//лифт которым будем управлять

public GameObject Lift;

Следующим шагом опишем поведение лифта в виде функции MoveLifts

Текстовое поле

//получаем данные о кнопке

ButtonKlick S = ButtonLift.GetComponent ();

EngineLift Engine = Lift.GetComponent ();

//получаем значение кнопки

//если кнопка включена то получаем направление в какую сторону двигать лифт

//получаем текущее положение лифта

float PozaLift = Lift.transform.position.y;

//получаем направление лифта

float Direct = S.VY - PozaLift;

//округлим координату чтобы не париться с дробями и точными значениями

//значит направление вверх

Engine.VectorMove = 1; //задаем лифту направление вверх

if (Direct Итак запустим проект и посмотрим что получилось. Как видим задав кнопке значение высоты мы заставляем платформу ехать в направлении этого значения пока лифт не достигнет его. Как только лифт достиг желанной точки он останавливается и отключает кнопку.

Итак модифицируем нашу переменную которая является ссылкой на кнопку и сделаем из нее массив кнопок. Для этого изменим строку


public void Fire()
<
Instantiate(bullet,transform.position,transform.rotation);
GetComponent().Play();
counter = 0;
>

Добавь в инспекторе в условие того триггера объект на котором висит этот скрипт (можно повесить скрпит на этот же объект, на котором триггер). Выбери публичную функцию "Fire" в выпадающем меню и PROFIT!

PS Может я не правильно выразился. Не удаляй объект EventSystem, который добавляется автоматом при создании канваса. Убери компонент Event System с кнопки, если ты туда его добавлял.

Я тут подумал. Тебе скорее всего хочется сделать так, чтобы при нажатой кнопки воспроизводилось действие. Тогда код будет такой:

public void StartFire()
<
isPresed = true;
>

public void FinishFire()
<
isPresed = false;
>

public void Update()
<
if(isPresed)
<
Instantiate(bullet,transform.position,transform.rotation);
GetComponent().Play();
counter = 0;
>
>

А в триггере нужно указать, что при "PointerDown" вызывается функция - StartFire, а при "PointerUp" - FinishFire.
Flist - social platform
PuzzleSystem - Open-source Unity Asset
[2D] Mission: Defender

Читайте также: