Моя игра за ночь.
В поддержку пятничного тэга.
Месяц назад одной из групп ВКонтакте по Unity3D проходил конкурс "игра за ночь". Ну и я склипал поделку. Сегодня разбирал прототипы, и нашел проект. Суть в том чтобы пройти уровень, но есть одно но: уровень виден далеко не всегда и не весь. Вот сижу и думаю, может доделать...
Кому интересно, ссылка на сборку для браузера в комментариях.
Месяц назад одной из групп ВКонтакте по Unity3D проходил конкурс "игра за ночь". Ну и я склипал поделку. Сегодня разбирал прототипы, и нашел проект. Суть в том чтобы пройти уровень, но есть одно но: уровень виден далеко не всегда и не весь. Вот сижу и думаю, может доделать...
Кому интересно, ссылка на сборку для браузера в комментариях.
Азы программирования на C# под unity3d
Я разберу азы программирования, сегодня вы познакомитесь с библиотеками, классами, циклами.
БИБЛИОТЕКИ
Любой код программы начинается с объявления библиотек, и объявления библиотек начинается с оператора using, напрем :
using System ;
using System.Data ;
КЛАССЫ
Программы на C# используют классы, каждый класс выполняет свою задачу . Когда вы открываете скрипт в unity, то можете найти там надпись :
public class Test : MonoBehaviour
В этом отрывке кода вы можете увидеть объявления публичного класса Test, который наследует методы от класса MonoBehaviour .
Классы содержат методы, для выполнения различных действий класс использует метод .
ПЕРЕМЕННЫЕ
Указать переменную, значит, указать программе тип и её имя .
Переменные :
bool - правда или лож
float - дробное число
char - любой символ
int - целое число
Gameobject - игровой объект
string - текст
Transform - переменная содержащая позицию объекта
Vector3 - переменная содержащая 3 координаты(x,y,z)
Вот стандартные переменные из языка C#, и пару часто используемых переменных unity.
ЦИКЛЫ
Циклы - заставляют программу выполнять набор операторов до тех пор, пока значение не станет true или false
Цикл while, в этом цикле операторы выполняются, пока условие имеет значение true
while(x>5){
x = x-3 ;
}
Цикл будет выполняться, пока значение х будет больше 5
Цикл for состоит из 3 операторов. Первый задаёт начало цикла, 3 будет выполняться, пока условие, заданное 2 оператором будет соблюдаться. Пример :
for(int i =0 ; i
БИБЛИОТЕКИ
Любой код программы начинается с объявления библиотек, и объявления библиотек начинается с оператора using, напрем :
using System ;
using System.Data ;
КЛАССЫ
Программы на C# используют классы, каждый класс выполняет свою задачу . Когда вы открываете скрипт в unity, то можете найти там надпись :
public class Test : MonoBehaviour
В этом отрывке кода вы можете увидеть объявления публичного класса Test, который наследует методы от класса MonoBehaviour .
Классы содержат методы, для выполнения различных действий класс использует метод .
ПЕРЕМЕННЫЕ
Указать переменную, значит, указать программе тип и её имя .
Переменные :
bool - правда или лож
float - дробное число
char - любой символ
int - целое число
Gameobject - игровой объект
string - текст
Transform - переменная содержащая позицию объекта
Vector3 - переменная содержащая 3 координаты(x,y,z)
Вот стандартные переменные из языка C#, и пару часто используемых переменных unity.
ЦИКЛЫ
Циклы - заставляют программу выполнять набор операторов до тех пор, пока значение не станет true или false
Цикл while, в этом цикле операторы выполняются, пока условие имеет значение true
while(x>5){
x = x-3 ;
}
Цикл будет выполняться, пока значение х будет больше 5
Цикл for состоит из 3 операторов. Первый задаёт начало цикла, 3 будет выполняться, пока условие, заданное 2 оператором будет соблюдаться. Пример :
for(int i =0 ; i
Unity Network. Создание игры с мультиплеером
Unity Network значительная вещь в создании игр, с помощью неё можно создать кооператив в своей игре . Unity Network чаще всего используют в создании мультеплеера до 5-6 человек, далее лучше использовать Photon, с которым мы познакомимся позже. Сегодня же я вам расскажу об основах, вы сможете создавать комнату и использовать простейшие функции. Пример построения кода некоторых функций :
1. Network.InitializeServer(5,2500, true);
С помощью этой функции мы создаём сервер, первое значение отвечает за максимальное количество игроков на сервере, второе это порт, треть отвечать за использование NAT.
2. Network.Connect("127.0.01", 2500);
С помощью этой функции мы подключаемся к серверу, первое значение это IP сервера, в данном случае используется стандартный локальный ip, второе значение это порт
3. Network.Disconnect();
С помощью этой функции мы отключаемся от сервера.
Вот три самых основных функции при работе с сервером.
Построение комнаты с использованием блока RPC. Пример построения кода :
1. void Update () {
2. if(GUI.Button(new Rect(1,1,1,1), "Start Room")){
3. networkView.RPC("LoadLevel", RPCMode.All);
4. }
5. }
6. [RPC]
7. void LoadLevel(){
8. Application.loadLevel(1);
1- Открываем функцию Update ()
2 - Создаём кнопку "Start Room", и если мы на неё нажмём, то выполнится третья строка.
3- Выполняем блок RPC, в нём выполняем функцию LoadLevel, второе значение отвечает за то, что каким игрокам будет отдаваться эта команда, в данном случаи она будет отдаваться все.
4 - Закрываем условие кнопки.
5 - Закрываем функцию Update()
6 - Открываем блок RPC
7 - Объявляем функцию LoadLevel
8 - Выполняем загрузку 1 уровня
Вот стандартные функции и небольшой пример, надеюсь вам поможет
1. Network.InitializeServer(5,2500, true);
С помощью этой функции мы создаём сервер, первое значение отвечает за максимальное количество игроков на сервере, второе это порт, треть отвечать за использование NAT.
2. Network.Connect("127.0.01", 2500);
С помощью этой функции мы подключаемся к серверу, первое значение это IP сервера, в данном случае используется стандартный локальный ip, второе значение это порт
3. Network.Disconnect();
С помощью этой функции мы отключаемся от сервера.
Вот три самых основных функции при работе с сервером.
Построение комнаты с использованием блока RPC. Пример построения кода :
1. void Update () {
2. if(GUI.Button(new Rect(1,1,1,1), "Start Room")){
3. networkView.RPC("LoadLevel", RPCMode.All);
4. }
5. }
6. [RPC]
7. void LoadLevel(){
8. Application.loadLevel(1);
1- Открываем функцию Update ()
2 - Создаём кнопку "Start Room", и если мы на неё нажмём, то выполнится третья строка.
3- Выполняем блок RPC, в нём выполняем функцию LoadLevel, второе значение отвечает за то, что каким игрокам будет отдаваться эта команда, в данном случаи она будет отдаваться все.
4 - Закрываем условие кнопки.
5 - Закрываем функцию Update()
6 - Открываем блок RPC
7 - Объявляем функцию LoadLevel
8 - Выполняем загрузку 1 уровня
Вот стандартные функции и небольшой пример, надеюсь вам поможет
Исследование UI в Unity 4.6 beta
Я помню что у вас тут были люди которые писали про Unity3D, так что вот вам заметочка:)
На днях начал изучать новый UI. Все что на оф сайте в видео туториалах естетсвенно было просмотрено, но там нет ничего о том как новый UI работает. Доков я тоже не увидел и естественно захотелось разобраться как это все работает. Итак, кратко о том что я понял:
Исходя из исследований методом тыка, основным объектом без которого построение UI невозможно является Canvas. Он отвечает за отрисовку элементов интерфейса и проброс событий к ним. Так же у канваса есть 3 варианта отрисовки UI: ScreenSpace - Overlay, ScreenSpace - Camera и WorldSpace.
ScreenSpace - Overlay и ScreenSpace - Camera
Как видно из названия режимов, они работают с экранными координатами. Это позволяет собирать PixelPerfect интерфейс, но если Вам нужно чтобы интерфейс выглядел одинаково на всех разрешениях, или Вы хотите создать 3D UI - эти варианты Вам не подходят.
WordlSpace
Этот режим отрисовывает элементы в мировом пространстве, так что если у вас нет камеры в которую они будут попадать, то вы их можете не увидеть. Этот режим меня заинтересовал, так как позволяет создавать UI, который будет выглядеть одинаково независимо от разрешения экрана. Единсвенная небольшая проблема - это то что Canvas, в отличии от предыдущих режимов, не реагирует на изменение аспекта экрана. Но эта проблема решается простым скриптом, управляющим шириной/высотой канваса при старте.
Отдельные элементы я описывать не буду, все равно с ними можно ознакомиться методом математического тыка. А вот на систему сообщений стоит взглянуть поподробнее.
Во первых:
Чтобы Ваш UI работал, необходимо иметь на сцене EventSystem. EventSystem это компонент который занимается обработкой событий пользователя и передачей их в UI.
Обработка событий происходит в InputModule компонентах. Я встретил 2 (StandaloneInputModule для ПК, консолей и веба и TouchInputModule для мобильников и планшетов). Причем судя по их настройках они могут хотябы частично быть взаимозаменяемыми.
InputModule отлавливает события пользователя и передает их в EventSystem, которая уже направляет все это дело в UI. Но как же определяется активный элемент был нажат? За это отвечает GraphicRaycaster.
GraphicRaycaster
Этот компонент находится на Canvas-е и в ответ на нажатие мыши/тач определяет какому объекту надо послать событие. Всего в новом UI есть 3 типа рэйкастеров: рэйкастер для 2D физики, рейкастер для 3D физики и рэйкастер для графических элементов. По умолчанию на гейм объект добавляется последний.
У этого рейкастера есть один огромный недостаток: чтобы объект получил событие, он должен иметь графическую составляющую. Другими словами, если Вы хотите создать прозрачную область экрана, которая будет запускать то или иное действие по нажатию, Вам придется создавать компонент с графикой и делать его полностью прозрачным. По моему это очень неудобно, хорошо что есть возможность расширить эту систему введением новых рейкастеров.
Немного о коде.
Систему UI можно разделить на 3 части: система генерации событий (UnityEngine.Events) - нововведение в Unity 4.6, затрагивает не только UI, но и системы физики и рендера, система отлова событий (UnityEngine.EventSystems) и непосредственно логику UI (UnityEngine.UI). Причем первая система является частью основной билиотеки движка, а остальные 2 частью библиотеки UI.
Events
В этом пространстве имен собраны класы описывающие базовую струкру евентов. Существует 2 типа классов: UnityAction (источник события) и UnityEvent (слушатель события, при этом есть возможность слушать несколько событий). Они могут принимать до 4х параметров следующих типов: EventDefined, Void, Object, Int, Float, String, Bool (исходя из описания в Enum PresustentListenerMode).
EventSystems
Это простарнство имен содержит в себе классы и интерфейсы обеспечивающие обработку событий вля элдементов UI, при этом на каждое событие существует свой интерфейс. Также в этом пространстве имен находятся рейкастеры для физики и базовый класс для описания поведения UI элементов - UIBehaviour и настройки режимов ввода.
UI
Тут находятся классы непосредственно связянные с элементами UI. В том числе и описание для GraphicRaycaster-а, а также куча интерфейсов связанных с событиями. Это пространство имен я еще только начал исследовать, именно там кроется ключ к написанию собственных элементов UI.
Следующую часть я напишу когда разберусь как все-таки создать собственные элементы управления. На этом всем спасибо, если у Вас есть аналогичный опыт, буду рад прочитать о нем в комментариях.
На днях начал изучать новый UI. Все что на оф сайте в видео туториалах естетсвенно было просмотрено, но там нет ничего о том как новый UI работает. Доков я тоже не увидел и естественно захотелось разобраться как это все работает. Итак, кратко о том что я понял:
Исходя из исследований методом тыка, основным объектом без которого построение UI невозможно является Canvas. Он отвечает за отрисовку элементов интерфейса и проброс событий к ним. Так же у канваса есть 3 варианта отрисовки UI: ScreenSpace - Overlay, ScreenSpace - Camera и WorldSpace.
ScreenSpace - Overlay и ScreenSpace - Camera
Как видно из названия режимов, они работают с экранными координатами. Это позволяет собирать PixelPerfect интерфейс, но если Вам нужно чтобы интерфейс выглядел одинаково на всех разрешениях, или Вы хотите создать 3D UI - эти варианты Вам не подходят.
WordlSpace
Этот режим отрисовывает элементы в мировом пространстве, так что если у вас нет камеры в которую они будут попадать, то вы их можете не увидеть. Этот режим меня заинтересовал, так как позволяет создавать UI, который будет выглядеть одинаково независимо от разрешения экрана. Единсвенная небольшая проблема - это то что Canvas, в отличии от предыдущих режимов, не реагирует на изменение аспекта экрана. Но эта проблема решается простым скриптом, управляющим шириной/высотой канваса при старте.
Отдельные элементы я описывать не буду, все равно с ними можно ознакомиться методом математического тыка. А вот на систему сообщений стоит взглянуть поподробнее.
Во первых:
Чтобы Ваш UI работал, необходимо иметь на сцене EventSystem. EventSystem это компонент который занимается обработкой событий пользователя и передачей их в UI.
Обработка событий происходит в InputModule компонентах. Я встретил 2 (StandaloneInputModule для ПК, консолей и веба и TouchInputModule для мобильников и планшетов). Причем судя по их настройках они могут хотябы частично быть взаимозаменяемыми.
InputModule отлавливает события пользователя и передает их в EventSystem, которая уже направляет все это дело в UI. Но как же определяется активный элемент был нажат? За это отвечает GraphicRaycaster.
GraphicRaycaster
Этот компонент находится на Canvas-е и в ответ на нажатие мыши/тач определяет какому объекту надо послать событие. Всего в новом UI есть 3 типа рэйкастеров: рэйкастер для 2D физики, рейкастер для 3D физики и рэйкастер для графических элементов. По умолчанию на гейм объект добавляется последний.
У этого рейкастера есть один огромный недостаток: чтобы объект получил событие, он должен иметь графическую составляющую. Другими словами, если Вы хотите создать прозрачную область экрана, которая будет запускать то или иное действие по нажатию, Вам придется создавать компонент с графикой и делать его полностью прозрачным. По моему это очень неудобно, хорошо что есть возможность расширить эту систему введением новых рейкастеров.
Немного о коде.
Систему UI можно разделить на 3 части: система генерации событий (UnityEngine.Events) - нововведение в Unity 4.6, затрагивает не только UI, но и системы физики и рендера, система отлова событий (UnityEngine.EventSystems) и непосредственно логику UI (UnityEngine.UI). Причем первая система является частью основной билиотеки движка, а остальные 2 частью библиотеки UI.
Events
В этом пространстве имен собраны класы описывающие базовую струкру евентов. Существует 2 типа классов: UnityAction (источник события) и UnityEvent (слушатель события, при этом есть возможность слушать несколько событий). Они могут принимать до 4х параметров следующих типов: EventDefined, Void, Object, Int, Float, String, Bool (исходя из описания в Enum PresustentListenerMode).
EventSystems
Это простарнство имен содержит в себе классы и интерфейсы обеспечивающие обработку событий вля элдементов UI, при этом на каждое событие существует свой интерфейс. Также в этом пространстве имен находятся рейкастеры для физики и базовый класс для описания поведения UI элементов - UIBehaviour и настройки режимов ввода.
UI
Тут находятся классы непосредственно связянные с элементами UI. В том числе и описание для GraphicRaycaster-а, а также куча интерфейсов связанных с событиями. Это пространство имен я еще только начал исследовать, именно там кроется ключ к написанию собственных элементов UI.
Следующую часть я напишу когда разберусь как все-таки создать собственные элементы управления. На этом всем спасибо, если у Вас есть аналогичный опыт, буду рад прочитать о нем в комментариях.