C# — Помощь с unity

Содержание

Туториал 0: Юнити и C# скрипт — основы

Вступление:

Скажу честно, я не программист, так что вполне возможно будут какие-то неточности. Это не игровой туториал. Я постараюсь рассказать, как работают скрипты в Юнити 3Д.

С# относительно не сложный язык. Точнее сама основа языка простая, сложности начинаются, когда уже совсем далеко углубляешься в него. Но на самом деле с помощью Юнити3Д можно делать простенькие игрушки только используя основы С#. C# объектно ориентированный язык програмирования. Это пишут все, но как я понял большинство не особо понимает смысл этого, как и я. Но учитывая, что придется работать со скриптами, это не так и важно для начала. Не стоит пытаться создать один огромный трудно понимаемый скрипт для всей игры. Пробуйте разделить игру на части. В свою очередь эти части могут взамодействовать друг с другом. Используйте эти части как кирпичи для создания итоговой игры. В C# используется >

Небольшой пример:

Как использовать C# скрипты ?

Не забываем, это не игровой туториал, только вкратце о принципе работы с Юнити3Д.

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
>

//Update is called once per frame
void Update () <
>
>

Небольшое объяснение строчек:

Using UnityEngine; Добавляем доступ на UnityEngine библиотеку. Это набор различных классов/функций от Юнити3Д.
using System.Collections; Это стандартная библиотека от Microsoft .NET.
public class Moving : MonoBehaviour < public даёт возможность доступа на этот скрипт с других скриптов. class Moving название нашего скрипта/класса. MonoBehaviour это основной класс от Юнити3Д, в нём такие важные функции как Update(), Start (). Смотрите Unity Documentation для более точного описания.
// Use this for initialization Это просто комментарий. Только для вашего удобства.
void Start () <> void Обозначение, что последующая функция не будет возвращать параметр (то-есть никаких вернувшихся переменных после её вызова не намечается). Start () <> эта функция выполнится один раз при старте скрипта.
void Update () <> Эта функция будет выполняться заново каждый игровой кадр.

Теперь мы можем передвинуть астероид в центр игрового мира (находится на координатах (0, 0, 0)). Позиция игрового объекта определяется в Transform компоненте. Нам надо присоединить наш скрипт к астероиду. С этого скрипта мы можем менять переменные в Transform компонент. Эти переменные и определяют положение объекта в сцене.

Например мы хотим переместить астероид в центр при старте игры.

Если надо получить доступ на какой-то компонент игрового объекта, то обычно надо сделать следующие шаги:

1. Найти нужный игровой объект: Тут много разных вариантов, все зависит от условий.
— Можно использовать поиск из C# скрипта GameObject.Find («Name») / GameObject.FindWithTag («Tag»). Это поиск по имени или тэгу.
— можно создать переменную типа игровой объект public GameObject; и потом в эдиторе указать к какому объекту привязана эта переменная.
— можно получить линк на игровой объект с различных функций. Например: (Trigger, Raycast. ).
— и не нужен поиск объекта, если скрипт уже находится на этом объекте.

2. Получить доступ на компонент этого объекта: через команду gameobject.GetComponent (); или GetComponent (); если скрипт на том-же объекте.

Доступ к Transform компоненту:

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
//сменить местоположение игрового объекта
transform.position = new Vector3 ( 0 , 0 , 0 );
>

//Update is called once per frame
void Update () <
>
>

Если мы запустим нашу игру, то астероид будет перемещён в центр игрового мира.
Теперь посмотрим на Transform компонент:

Используйте команду transform. для доступа к Transform компоненту на том-же игровом объекте. И в нём можно изменить позицию, вращение и размер игрового объекта (пример: transform.localScale = new Vector3 (0.5F, 1, 1);). Ваш IDE (редактор) будет пытаться помочь в наборе команд и будут показанны различные возможные варианты.

Можно не только изменять переменные, но и просто запросить их значения.

Теперь посмотрим как работать с другими компонентами. У нашего астероида есть компонент для его отрисовки (рендерер).

Например мы хотим зеркально повернуть астероид вдоль y-оси. Так как наш скрипт уже прикреплён к астероиду, то нам не нужен его поиск в игровом мире. Мы можем получить доступ на компонент командой GetComponent ().. Название компонента можно посмотреть в инспекторе игрового объекта (только осторожно с пробелами). C# команда будет:
GetComponent SpriteRenderer >().flipY = true ;
И скрипт будет:

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//доступ к компоненту отрисовки и сменить переменную, отвечающую за зеркальное отображение по оси Y
GetComponent SpriteRenderer >().flipY = true ;
>

//Update is called once per frame
void Update () <
>
>

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
>

//Update is called once per frame
void Update () <
>
>

Похожим образом мы можем получить и доступ к компонентам на других игровых объектах.
Для начала нам надо «найти» другой игровой объект. Как я уже и писал, тут довольно много различных вариантов в зависимости от ситуации. Например в сцене есть другой игровой объект. Его имя Ship и тэг Player (Tag используется для идентификации объектов (похоже на имя, только скорость обработки быстрее)).

1. Если игровой объект находится в сцене с самого начала и не пропадает до запроса к нему, то мы можем создать открытую ссылочную переменную playerShip (с тимпом GameObject) в нашем скрипте и добавить этот объект в эту переменную через инспектор (просто перетащить объект на переменную в редакторе). И тогда через эту переменную у нас будет доступ на игровой объект. Например мы хотим поместить корабль на позицию (1, 1, 0) при старте игры. C# строчка будет:
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
>

//Update is called once per frame
void Update () <
>
>

2. Мы можем найти игровой объект в сцене через поиск и сделать на него ссылку через скрипт с помощью команды GameObject.Find («Name») or GameObject.FindWithTag («Tag»). Поиск по тэгу производится быстрее чем по имени. C# строчка будет:
playerShip = GameObject .Find( «Ship» );
или:
playerShip = GameObject .FindWithTag( «Player» );

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового оьъекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//ищем в сцене корабль игрока и делаем ссылку на него
playerShip = GameObject .FindWithTag( «Player» );
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
>

//Update is called once per frame
void Update () <
>
>

using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//декларация ссылочной переменной для компонента отрисовки спрайтов
SpriteRenderer sr;
//публичная ссылочная переменная для корабля игрока
public GameObject playerShip;

// Use this for initialisation
void Start () <
//сменить местоположение игрового объекта
transform.position = new Vector3 ( 0 , 0 , 0 );
//делаем ссылку на компонент
sr = GetComponent SpriteRenderer >();
//меняем переменную, отвечающую за зеркальное отображение по оси Y
sr.flipY = true ;
//ищем в сцене корабль игрока и делаем ссылку на него
playerShip = GameObject .FindWithTag( «Player» );
//получаем доступ к transform компоненту игрока и меняем его местоположение
playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
//указываем, что работаем с кораблем игрока, получаем доступ к компоненту отрисовки и зеркально отображаем по оси Х
playerShip.GetComponent SpriteRenderer > ().flipX = true ;
>

//Update is called once per frame
void Update () <
>
>

3. Мы можем получть объект с различных игровых функций. Я покажу некотрые из них в последующих туториалах (как пример: OnTriggerEnter2D (Collider2D otherCollider) <> Ссылка на объект попавший в триггер будет в otherCollider переменной).

Наверняка уже заметили, что создание игры в Юнити — это просто работа с переменными в компонентах игровых объектов (я сейчас не говорю о создании музыки, моделей, текстов . Это уже совсем другая история). Теперь посмотрим на основы С# скриптов. Описание будет довольно коротким и затронет только базовые части. Так что для подробностей придется немножко погуглить или побродить по форумам.

Основы С# скриптов:

1. Переменные:

2. Ссылочные переменные классов:

Spoiler GameObject:
Все объекты в сцене Юнити это игровые объекты. Поэтому GameObject как базовый класс используется довольно часто. Как и большинство классов содержит в себе не только различные переменные, но и функции. Смотрите Unity Documentation для более точного описания. GameObject player;
//поиск оьъекта с тэгом Enemy и создание переменной с ссылкой на него
GameObject enemy = GameObject .FindWithTag ( «Enemy» );
Transform:
Один из очень часто используемых компонентов. Этот компонент есть у любого игрового объекта в Юнити. Отвечает за местоположение и размеры объекта в игровом мире. Так как в Юнити есть упрощённый доступ к компонету Transform у игрового объекта через команду gameobject.transform. , то используется как ссылочная переменная не так уж и часто. Смотрите Unity Documentation для более точного описания. Transform enemyPosition;
//считывание координаты х из трансформ компонента
float x = enemyPosition.position.x;
Sprite:
Класс представляющий 2Д картинку (спрайт) в качестве рессурса в Юнити. Если вы импортируете спрайт в Юнити, то будет автоматически создан новый класс содержащий этот спрайт с его различными настройками. В качестве ссылочной переменной понадобится при работе с компонентом отрисовки спрайтов. Смотрите Unity Documentation для более точного описания. Sprite enemyBullet;
SpriteRenderer:
Класс отвечающий за отрисовку (рендеринг) спрайта на экране. Рессурс для отрисовки берется из Sprite (см. выше). Как и большинство компонентов содержит в себе различные переменные и функции. Смотрите Unity Documentation для более точного описания. SpriteRenderer sr;
//активация переменной, отвечающей за зеркальное отображение по оси Y
GetComponent SpriteRenderer >().flipY = true ;
С# скрипты и другие компоненты:
Как я уже говорил, ваши скрипты являются компонентами в Юнити. Поэтому ссылочные переменные работают аналогичным образом.
1. создаёте переменную по типу компонента (используйте его название).
2. получаете доступ к компоненту через ссылочную переменную: variable = GetComponent ();

В качестве примера скрипт из вступления: Moving moving;
moving = GetComponent Moving >();
moving.playerShip.transform.position = new Vector3 ( 1 , 1 , 0 );
Все остальные компоненты работают аналогично. Не стану их описывать, так как их просто огромное количество.

3. Массивы (статические и динамические):

4. Модификаторы доступа:

5. Области видимости(действия) переменных:

Spoiler глобально в классе:
Переменная декларированная в классе, но не входящая в функции этого класса может быть использована глобально всеми функциями этого класса.
локально в функции:
Переменная декларированная в функции, может быть использована только в этой функции.
локально в цикле:
Область видимости такой переменной ещё меньше, она используется только локально в пределах цикла. using UnityEngine;
using System.Collections;

public class Moving : MonoBehaviour <

//переменная speed может быть использованна любой функцией этого класса
public int speed;

void RandomFunction () <
//переменная isMoving может быть использованна только в пределах RandomFunction () <. >
bool isMoving = true;
//переменная i может быть использованна только в пределах цикла
for ( int i = speed; i 0 ; i—) <
speed = i;
>
isMoving = false;
>
>

6: Арифметические операторы:

7. Математические функции:

8. Условия и логические операторы:

Spoiler логические операторы сравнения:
Результат сравнения это бинарный результат, то есть ложно или истинно (true/false). Возможны следующие сравнения:
== — равно
!= — не равно
> — больше
— меньше
>= — больше или равно
— меньше или равно

условные операторы:
Условные операторы позволяют провести сравнение и выполнить определенную часть кода в зависимости от результата.
if . else:
Краткая форма этого условного оператора состоит только из условия и выполняемой части кода, если условие истинно. if (hp 0 ) <
isDead = true ;
canFight = false ;
> Полная форма состоит из условия, выполняемой части кода, если условие истинно и выполняемой части кода, если условие ложно. if (hp 0 ) <
isDead = true ;
canFight = false ;
> else <
isDead = false ;
canFight = true ;
> Возможно объединение различных условий в одну конструкцию. if (hp 0 ) <
isDead = true ;
canFight = false ;
> else if (hp == 100 ) <
isDamaged = false ;
> бинарные логические операторы:
С помощью таких операторов можно создавать более сложные условия, состоящих из нескольких подусловий.
&& — логическое И . Будет истинно, если оба условия истинны. Или ложно, если оба или одно из них ложно.
|| — логическое ИЛИ . Будет истинно, если одно из условий истинно. И ложно, если оба условия ложны.
if (hp 0 || hp > 0 ) <
isZero = false ;
> else <
isZero = true ;
> switch:
Этот логический оператор используется для обработки множества вариантов при нахождении истинного значения. string direction = «left» ;

//искомое выражение
switch (direction) <
//возможный вариант, если совпадает, то выполняется последующий код
case ( «up» ):
move = Vector2 .up;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//возможный вариант, если совпадает, то выполняется последующий код
case ( «down» ):
move = Vector2 .down;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//в данном примере выполнится эта часть кода и работа логического оператора будет завершена
case ( «left» ):
move = Vector2 .left;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//возможный вариант, если совпадает, то выполняется последующий код
case ( «right» ):
move = Vector2 .down;
isMoving = true ;
//прерывает дальнейшее выполнение логического оператора (при совпадении варианта)
break ;
//если ни один из вариантов не был истинной, то выполняется часть кода стоящая после default
default :
move = Vector2 .zero;
isMoving = false ;
//прерывает дальнейшее выполнение логического оператора
break ;
>

9. Циклы:

Spoiler for:
Этот цикл выполняется определённое количество раз. //для примера, декларация массива на 10 целых элементов
public int [] numbers = new int [ 10 ];

//int i = 0; декларация с инициализацией счетчика цикла
//i
//i++; изменение счетчика цикла
for ( int i = 0 ; i 10 ; i++) <
//исполняемая часть кода при каждом новом цикле
//в данном примере, заполнение массива числами от 0 до 9
numbers [i] = i;
> Хоть это и не обязательно, но советую использовать в счетчиках циклов целые значения, чтобы избежать ошибок от дробных вычислений.

while:
Этот цикл выполняется пока условие истинно. //для примера, декларация массива на 10 целых элементов
public int [] numbers = new int [ 10 ];
//декларация с инициализацией переменной к, которую будем использовать для проверки условия цикла
int k = 9 ;

//проверка условия цикла, выполнить цикл, если условие истинно
while (k >= 0 ) <
//выполняемый фрагмент кода в фигурных скобках
//заполнение массива числами от 9 до 0 в обратном порядке
numbers [k] = k; //уменьшение переменной на 1 (чтобы получить ложное условие)
k—;
> Будьте осторожны с циклами, чтобы не получить «вечный» цикл, когда условие всегда истинно и цикл повторяется вечно.

do. while:
Отличие этого цикла от цикла while только в том, что проверка условия производится после выполнения фрагмента кода. Поэтому этот цикл выполнится всегда как минимум один раз. //декларация публичной текстовой переменной
public string testText;
//декларация и инициализация целой переменной, для условия цикла
int j = 0 ;

//выполнение фрагмента кода цикла
do <
//добавление к текстовой переменной цифры преобразованной в текстовый символ
testText = testText + j.ToString();
//увеличение j на единицу
j ++;
//проверка условия, повторить цикл, если условие истинно
> while (j 10 );
//результат работы цикла это текст «0123456789»
foreach:
Цикл для работы с массивами. Перебирает все элементы по одному. //декларация и инициализация массива
int [] numbers = new int [ 5 ] < 21 , 28 , 13 , 4 , 15 >;
//декларация массива для копирования
int [] numbersCopy = new int [ 5 ];

//вспомогательная переменная для индекса массива
int i = 0 ;
//запуск цикла проходяшего по всем элементам массива
//переменная number должна совпадать с типом элементов массива
foreach ( int number in numbers) <
//копирование текущего элемента в другой массив
numbersCopy [i] = number;
//увеличение индекса на 1, для доступа к следующему элементу в массиве для копии
i++;
>
//итог цикла это копирование элементов в новый массив
операторы break и continue:
Эти операторы помогают управлять исполнением циклов.
break — этот оператор полностью прекращает цикл и переходит к дальнейшему исполнению программы
continue — этот оператор прекращает текущее исполнение цикла и начинает новое
//вспомогательная переменная для индекса массива
int i = 0 ;
//запуск цикла проходяшего по всем элементам массива
//переменная number должна совпадать с типом элементов массива
foreach ( int number in numbers) <
//копирование текущего элемента в другой массив
numbersCopy [i] = number;
//увеличение индекса на 1, для доступа к следующему элементу в массиве для копии
i++;
//как переменная для индекса стала равна 3, прекращаем исполнение цикла
if (i == 3 )
break ;
>

10. Функции:

Spoiler стандартные функции от Юнити:
Существует много различных функций в Юнити. Тут я точно не смогу показать и малой части. Поэтому пока ограничимся несколькими примерами. В дальнейшем в туториалах будут попадаться и новые функции.

Instantiate:
Эта функция помещает клон объекта в сцену. Обычно используется для клонирования префаба(образца). //создаёт клон префаба в сцене на заданной позиции (Vector3) с заданным вращением (Quaternion)
Instantiate (prefab, position, rotation); Destroy:
Эта функция удаляет объект из сцены. //удаляет игровой объект из сцены после заданного интервала (или сразу, если время не указать)
Destroy (gameobject, time); функции классов:
Часто, если используете какой-то компонент (класс), то он содержит различные функции для работы с ним. Список этих функций можно увидеть в редакторе C# после набора ссылочной переменной (+ точка) указывающей на этот компонент. //изменяет дробную переменную в компоненте аниматор
GetComponent Animator > ().SetFloat ( «Speed» , 0 );
функции пользователя:
Конечно можно использовать и свои функции для выполнения нужных задач. //функция нанесения повреждений
public void DoDamage ( int damage) <
hp = hp — damage;
if (hp 0 )
Destroy (gameObject);
>

C# и еще 7 языков для Unity

Благодаря Unity сегодня разработкой игр может заниматься любой желающий, достаточно за несколько месяцев пройти экспресс-обучение работе с платформой и подтянуть один из языков программирования. Многие новички ошибочно полагают, что для работы с Unity необходимым и достаточным является C#, однако возможности платформы куда шире.

Такое мнение относительно C# в Unity — не пустой слух. Помимо того, что это относительно простой и производительный язык программирования, есть и исключительно аппаратная причина. Unity использует open-source проект Mono, который является одной из многочисленных реализаций платформы Microsoft. NET. По факту, все библиотеки Unity написаны на C#.

Так что использовать все возможности платформы, не зная C#, у вас не получится. Но это не означает, что нельзя ограничиться базовым уровнем языка. Напротив, движок Unity тем и хорош, что здесь основными могут быть несколько языков — в зависимости от задач и разработчика. Но C# необходим. К счастью, его довольно легко изучить, а применять можно далеко за пределами Unity.

JavaScript

UnityScript был вторым базовым языком платформы. Вы можете убедиться в этом, открыв описания скриптов, где коды даны как на C#, так и на UnityScript. Если вам знаком и симпатичен синтаксис JavaScript — вам понравится работать с Unity.

Но будет ошибкой полагать, что UnityScript — это тот же JavaScript, но с другим названием. К примеру, US поддерживает классы, но при этом в нем нельзя переназначать переменные и использовать необязательные точки с запятой.

Плохая новость в том, что с лета 2020 года разработчики усиленно искореняют UnityScript из платформы. Это не ограничивается прекращением поддержки в оболочке — создатели пакетов со скриптами получают предупреждения о необходимости перевести весь код в C#.

К счастью, есть компилятор на GitHub, который все еще позволяет работать с JavaScript в Unity, и эту лазейку никто не собирается закрывать. Но удовольствие определенно потеряно.

Продолжая тему языков, от которых отказались разработчики Unity, вспомним Boo. По структуре он похож на Python, прост в освоении, у него краткий и удобный синтаксис, который поддерживается .NET и Mono. В Unity он появился благодаря одному из создателей платформы — Родриго Де Оливейре, который также разработал Boo.

От языка отказались по банальной причине — из-за низкой популярности. Boo не привносил новых возможностей в Unity, не привлекал армию разработчиков, так что его поддержка была жестом доброй воли. Поэтому, когда пути Оливейры и Unity разошлись, Boo оставили за бортом.

IronPython и IronRuby

Для любителей Python все же есть возможность поработать с Unity. Решение — IronPython, набор библиотек, расположенных в GitHub. Позволяет запускать «змеиные» скрипты прямо из C#-кода. Полезное расширение — возможность вызывать .NET-библиотеки из Python.

Аналогичной функциональностью обладают библиотеки под общим названием IronRuby. Синтаксис похожий, поэтому придется потратить время лишь на подключение исходников, зато в ответ Unity станет поддерживать еще один язык.

Lua не входит в топ самых популярных языков программирования. Но он обитает преимущественно в играх, так что в Unity должен быть представлен. За это отвечает MoonSharp — интерпретатор для Mono, платформы .NET и Unity. MoonSharp не заменяет C#, а дает разработчику возможность подключить сторонний код на Lua. Такой принцип реализован, к примеру, в WoW, где огромное количество модов написано именно на Lua.

Как и в подавляющем большинстве продуктов, где требуется быстродействие, определенный фронт работ поручают C или C++. Unity не требует установки дополнительных надстроек или подключения библиотек, здесь «из коробки» можно создавать DLL-плагины.

Кстати, если вы решили заниматься в будущем именно гейм-дизайном, то начать погружение в профессию стоит именно с этих языков. В них собраны почти все фундаментальные понятия в программировании, а учиться дальше после C# — проще простого.

Чтобы повысить скорость обработки информации, в Unity можно использовать другой язык — Rust. Функции и методы напрямую писать не получится, но их можно вызвать из Unity-кода. Пик популярности Rust позади, но, по свежим рейтингам, до 1,5 % программистов периодически используют его в работе. И им эта функция Unity наверняка придется по душе.

Как видите, несмотря на необходимость знать C# хотя бы на базовом уровне, Unity позволяет использовать еще несколько разношерстных языков. Если захотите разнообразить свою работу в гейм-дизайне, вы теперь знаете, как это сделать.

Благодаря Unity сегодня разработкой игр может заниматься любой желающий, достаточно за несколько месяцев пройти экспресс-обучение работе с платформой и подтянуть один из языков программирования. Многие новички ошибочно полагают, что для работы с Unity необходимым и достаточным является C#, однако возможности платформы куда шире.

Такое мнение относительно C# в Unity — не пустой слух. Помимо того, что это относительно простой и производительный язык программирования, есть и исключительно аппаратная причина. Unity использует open-source проект Mono, который является одной из многочисленных реализаций платформы Microsoft. NET. По факту, все библиотеки Unity написаны на C#.

Так что использовать все возможности платформы, не зная C#, у вас не получится. Но это не означает, что нельзя ограничиться базовым уровнем языка. Напротив, движок Unity тем и хорош, что здесь основными могут быть несколько языков — в зависимости от задач и разработчика. Но C# необходим. К счастью, его довольно легко изучить, а применять можно далеко за пределами Unity.

JavaScript

UnityScript был вторым базовым языком платформы. Вы можете убедиться в этом, открыв описания скриптов, где коды даны как на C#, так и на UnityScript. Если вам знаком и симпатичен синтаксис JavaScript — вам понравится работать с Unity.

Но будет ошибкой полагать, что UnityScript — это тот же JavaScript, но с другим названием. К примеру, US поддерживает классы, но при этом в нем нельзя переназначать переменные и использовать необязательные точки с запятой.

Плохая новость в том, что с лета 2020 года разработчики усиленно искореняют UnityScript из платформы. Это не ограничивается прекращением поддержки в оболочке — создатели пакетов со скриптами получают предупреждения о необходимости перевести весь код в C#.

К счастью, есть компилятор на GitHub, который все еще позволяет работать с JavaScript в Unity, и эту лазейку никто не собирается закрывать. Но удовольствие определенно потеряно.

Продолжая тему языков, от которых отказались разработчики Unity, вспомним Boo. По структуре он похож на Python, прост в освоении, у него краткий и удобный синтаксис, который поддерживается .NET и Mono. В Unity он появился благодаря одному из создателей платформы — Родриго Де Оливейре, который также разработал Boo.

От языка отказались по банальной причине — из-за низкой популярности. Boo не привносил новых возможностей в Unity, не привлекал армию разработчиков, так что его поддержка была жестом доброй воли. Поэтому, когда пути Оливейры и Unity разошлись, Boo оставили за бортом.

IronPython и IronRuby

Для любителей Python все же есть возможность поработать с Unity. Решение — IronPython, набор библиотек, расположенных в GitHub. Позволяет запускать «змеиные» скрипты прямо из C#-кода. Полезное расширение — возможность вызывать .NET-библиотеки из Python.

Аналогичной функциональностью обладают библиотеки под общим названием IronRuby. Синтаксис похожий, поэтому придется потратить время лишь на подключение исходников, зато в ответ Unity станет поддерживать еще один язык.

Lua не входит в топ самых популярных языков программирования. Но он обитает преимущественно в играх, так что в Unity должен быть представлен. За это отвечает MoonSharp — интерпретатор для Mono, платформы .NET и Unity. MoonSharp не заменяет C#, а дает разработчику возможность подключить сторонний код на Lua. Такой принцип реализован, к примеру, в WoW, где огромное количество модов написано именно на Lua.

Как и в подавляющем большинстве продуктов, где требуется быстродействие, определенный фронт работ поручают C или C++. Unity не требует установки дополнительных надстроек или подключения библиотек, здесь «из коробки» можно создавать DLL-плагины.

Кстати, если вы решили заниматься в будущем именно гейм-дизайном, то начать погружение в профессию стоит именно с этих языков. В них собраны почти все фундаментальные понятия в программировании, а учиться дальше после C# — проще простого.

Чтобы повысить скорость обработки информации, в Unity можно использовать другой язык — Rust. Функции и методы напрямую писать не получится, но их можно вызвать из Unity-кода. Пик популярности Rust позади, но, по свежим рейтингам, до 1,5 % программистов периодически используют его в работе. И им эта функция Unity наверняка придется по душе.

Как видите, несмотря на необходимость знать C# хотя бы на базовом уровне, Unity позволяет использовать еще несколько разношерстных языков. Если захотите разнообразить свою работу в гейм-дизайне, вы теперь знаете, как это сделать.

Unity. Создание кнопок с помощью скрипта

Работаю с движком Unity, на языке c#. Я не знаю как сделать так, что бы кнопки созданные с помощью скрипта выполняли какой то метод, а именно присваивание определенного значению моему иксу и удаляли сами себя после присваивания. Мне нужно будет создать таких кнопок около 100, и они должны нести в себе случайное число, как на гифке( в верхней части гиф кнопки созданы без использования скрипта и работают как нужно, за исключением удаления самой себя, а в нижней части кнопки создаются скриптом, но не работают) Подкиньте статью на эту тему или может даже решение проблемы, если вам не трудно

Как создать простую 2D-игру на Unity

На создание игры обычно уходит много времени и сил, но если воспользоваться движком Unity, можно значительно ускорить процесс.

Unity — это движок для создания игр в 2D и 3D. Он позволяет в несколько раз ускорить разработку, потому что берет на себя огромную часть задач программиста:

Сейчас Unity очень популярен, на движке делают игры практически для всех платформ. Причем пользуются им не только инди-разработчики, но и крупные студии. С помощью Unity сделаны такие игры, как:

  • Outlast;
  • Hearthstone;
  • Cuphead;
  • Rust;
  • Firewatch;
  • Inside;
  • Cities: Skylines и другие.

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

Из этой статьи вы узнаете, из каких компонентов создается игра и как написать свой первый проект.

Как установить Unity

Скачать Unity можно на официальном сайте. Новичкам будет достаточно бесплатного тарифа “Personal”.

Важный момент! Последняя версия движка, которую предлагается скачать по умолчанию, может не поддерживаться на старых компьютерах; подходящую под возможности вашего компьютера версию стоит поискать в архиве версий. Игра для этой статьи написана на Unity 5.5.0f3. Интерфейс более поздних версий не сильно менялся, поэтому это руководство подойдет и для них.

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

Запустите установщик и следуйте инструкциям. Кроме самого движка, вам предложат установить Microsoft Visual Studio — интегрированную среду разработки. Она предоставляет лучшие возможности по работе со скриптами в Unity, но занимает много места на диске.

Если она уже установлена или если используется другой редактор кода, уберите галочку. Альтернативами могут быть Microsoft Visual Studio Code (более легкая версия Visual Studio) или MonoDevelop — встроенный редактор Unity.

Когда установка завершится, пора приступать к разработке своей первой игры.

Как создать проект в Unity

Для начала запустите Unity и нажмите кнопку New или New project.

Unity C# Developer

Мы молодая, опытная, творческая и амбициозная команда Phygitalism.

Немного о том, чем мы занимаемся:

Более 3 лет реализовываем впечатляющие мультимедийные проекты,

Разрабатываем технологические продукты для бизнеса,

Внедряем инновации в сферу маркетинга, инструментов продаж, а также искусства,

Проводим исследования в области человеко-машинного взаимодействия,

Пропагандируем собственную phygital-философию,

Мы НЕ делаем игры.

Работаем с технологиями:

XR (виртуальная, дополненная и смешанная реальности) — Unity3D, ARKit, ARCore, Vuforia, SteamVR

ML — Tensorflow, Keras, Scikit-learn, Gensim

CG — Unity3D, Cinema 4D, 3DS max, Substance Painter, Substance Designer, Corona Renderer, Redshift Renderer

Web-сервисы — Node.js, React, Redux, React-Native, Реляционные и NoSQL базы данных, Flask

Middle Unity Developer

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

Вам потребуется:

Боевой опыт работы с игровыми движками (Unity/Unreal Engine)

Опыт разработки под VR приложений (HTC Vive/Oculus Rift/WMR/Google VR и т.д.)

Опыт разработки AR приложений (ARkit/ARcore/ Vuforia/Microsoft Hololens и т.д.)

Опыт интеграции и использования сторонних сервисов в Unity3D проекты (например Firebase SDK)

Опыт разработки приложений под iOS/Android

Уверенное знание C#, понимание принципов ООП

Уверенное владение Git, gitflow, Jira

Опыт работы с сетью, общение с сервером;

Опыт многопоточного программирования

Опыт написания модульных и интеграционных тестов

Знания по алгоритмам, структурам данных, умение применять их на практике

Английский язык на уровне чтения технической литературы

Желание разбираться в работе рендера Unity

Желание совершенствовать навыки

Приветствуется:

Знания принципов работы сети(TCP/IP, REST API, WebSocket)

Знания других языков (JS/Python/C++)

Опыт написания шейдеров (ShaderLab/HLSL)

Опыт разработки мобильных приложений (iOS/Android)

Опыт с 360 видео в Unity

Опыт работы с UniRx, Zenject и др

Понимание принципов работы 3D-моделирования

Бонусы

Как мы работаем:

У нас действительно гибкий график

Решаем сложные и интересные задачи, которые иногда никто не решал

Одними из первых тестируем новые девайсы

Мы против офисной культуры. У нас дружная амбициозная команда и семейная обстановка

Нас 25 человек — команда работает в Москве и удаленно распределена по России и Украине

Стараемся работать по Agile

Уютный лофт в центре Москвы

Совместные обеды / частые вечеринки

Совместные недельные зимние / летние выезды на рабочие каникулы

Индивидуальные занятия английскому языку на платформе Skyeng

Много свободы и творчества, а также личной ответственности :)

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

Мы в постоянном поиске различных специалистов в команду — разработчики, дизайнеры и менеджеры проектов (в том числе и стажеры).

Работа программист unity

1-20 из 16655 результатов

Программист Unity/ C#

100 000 — 200 000 руб.

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity программист

Grata advertising, Рекламное агентство

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity3D программист

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity-программист

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Программист Unity 3D

50 000 — 70 000 руб.

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity C# разработчик

110 000 — 130 000 руб.

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Программист UNITY3 D

30 000 — 40 000 руб.

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity 3D-разработчик

100 000 — 130 000 руб.

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Unity-программист

Полезная ли была для вас вакансия?

Пожалуйста, опишите проблему

Программист С#/Unity

45 000 — 55 000 руб.

разработка интересных игровых проектов преимущественно для десктопных платформ. Требования:

Unity Программирование игр на С#

385

О чем этот курс?

Программирование игр на С# состоит из 5 подробных видеоуроков по самым важным, ключевым моментам написания скриптов в Unity3D. Этот курс рекомендован после изучения основ – «Unity Базовый курс» для освоения материала о скриптах, переменных, методах, условных конструкциях, циклах, массивах данных и многом другом. Вы узнаете, что такое скрипты – когда и зачем они используются, а также научитесь применять эти знания практично, написав простую игру по пройденному материалу.

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

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

H Простая система событий в Unity в черновиках Из песочницы

Что это такое, и для чего это нужно?

Пусть у нас есть игра — шутер. При нажатии на кнопку прицеливания игрок переходит на шаг, включается камера прицела, выполняется сотня других действий. А при нажатии кнопки стрельбы — создание пули, просчет полета и т.д. Все это выльется в огромную кашу с кучей связей и программировать все это станет очень тяжело (см. картинку в первой статье), особенно если нет точной картины всей логики в голове и на схеме.
Другой важный момент — для разных платформ управление будет сильно различаться и придется править кучу скриптов, содержащих в себе ввод, и события — один из способов решения этой проблемы.
С использованием событий схема приобретет такой вид:

InputAggregator слушает ввод и как только игрок нажал клавишу/тапнул экран, говорит в эфир: «Игрок нажал кнопку Х!». Об этом сразу узнают скрипты, подписанные на это событие (а точнее методы в этих скриптах) и выполняются указанные методы. Причем эти методы могут вызываться разными событиями, например, метод «Умереть» вызывается как при получении критического урона, так и, к примеру, при выходу за границы уровня.

Обратите внимание, что нам не важно, какую клавишу нажал игрок, важно лишь то, что произошло событие. Т.е. для подгонки управления для другой платформы нам не надо лезть в 10 скриптов и все их править, достаточно будет модифицировать InputAggregator.

Зачем нужен EventController — смотрите ниже.

Как это реализовать?

Забудем про шутер и пули, давайте поставим себе простую задачу:

Мы хотим при нажатии кнопки Space сдвинуть левую сферу вверх, а нижнюю — вниз. И если какая-то из них уходит слишком далеко, вернуть их обратно.

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

Перво — наперво создадим скрипты сфер, содержащие методы телепортов и повесим их на сферы:

Аналогично для другой сферы.

Создадим скрипт EventController и повесим его куда-нибудь (я повесил на камеру).
В нем создадим делегат MethodContainer():

Если очень грубо, делегаты — это указатели на методы или контейнеры методов. Для событий делегат используется как тип и с ним самим ничего делать не надо, поэтому особо вникать в механику делегатов необязательно (но знания лишними не бывают). Важно только знать, что к делегату подходят только методы, соответствующие его сигнатуре. В нашем случае это методы, не возвращающие значений (void) и не имеющие параметров (). Соответственно и методы, вызываемые нашими событиями, должны иметь такой вид.

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

Теперь создадим скрипт InputAggregator. Создадим в нем событие типа MethodContainer, вызывающее телепорт сфер:

Т.е. наш делегат мы указываем в качестве типа. Обратите внимание, что создавать линк на EventController не нужно.
В методе Update() вызовем наше событие:

Все, теперь если мы нажмем пробел, то активируется событие OnTeleportEvent. Осталось только указать, какие методы он должен вызывать.

Вернемся в EventController и в методе Awake() (вызывается при старте игры, похож на Start()) подпишем на наше событие методы TeleportUp() и TeleportDown(). Делается это при помощи оператора +=:

Готово! Теперь при нажатии пробела вызывается событие OnTeleportEvent, которое вызывает два метода в скриптах на сферах.

Теперь попробуем сделать обработку границ.

В скрипты обеих сфер добавим событие выхода за границы (по одному на каждую):

В методах телепортов вызываем событие:

И добавим методы телепорта назад (можно назвать одними именами):

А в Awake() EventController’a подписываемся:

Все, теперь наши сферы исправно двигаются и не убегают далеко.

В данном примере наши сферы просто двигались. В реальных проектах объекты имеют привычку уничтожаться/отключаться, если того требует логика игры (например убитый враг). И если не позаботиться о том, чтобы такой объект отписывался от события при своем уничтожении, то будут сыпаться ошибки. Или мертвый враг может внезапно встать и начать стрелять в вас как ни в чем не бывало, ведь он все еще подписан на различные игровые события. Поэтому для таких объектов подписку рекомендуется оформлять в них самих в методе OnEnable(), а отписку (-=) делать в OnDisable() (эти методы вызываются движком при включении/выключении объекта).

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

Заключение
Это был простейший пример. Разумеется, для двух сфер воротить события абсолютно не нужно, но когда у вас в проекте больше двадцати скриптов, события приходят на помощь.

Это только начало, представляете, как было бы сложно делать подобное для десятков скриптов без событий? А тут все аккуратно, видно, что на что подписано.

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

Хочу выразить благодарность всем пользователям, отписавшимся в комментариях. Благодаря ним статья стала лучше, да и я сам лучше понял события.
Удачи вам в ваших проектах!

P.S. Небольшое дополнение
У вас наверняка возник вопрос, как вызвать событие из другого скрипта, ведь если попытаться сделать что-нибудь вроде

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

И тогда вызвать это событие из другого класса можно будет банальным

Немного массивно по синтаксису, но неудобств почти не добавляет.

Unity

Уроки по использованию Unity — использующей C# платформы для разработки игр от Microcoft.

Интеграция своей игры в Steam: работа с лобби в Steamworks.NET

Steam предоставляет инструменты для интеграции своих сервисов в игры с помощью Steamworks. Рассказываем о том, как создать игровое лобби и работать с ним.

Практические советы по использованию профайлера в Unity

Unity профайлер даёт конкретные данные о производительности игры и облегчает процесс её оптимизации. В этой статье научимся с ним работать.

Вакансии, где нужны знания Unity

Оптимизируем работу с физикой в Unity

В данном материале будет рассмотрено несколько полезных приёмов использования физики в играх и примеры их практического применения. Предполагается, что у читателя уже есть опыт разработки на Unity. Как быстро написать…

Как быстро написать игру для Android на Unity

В своё время Flappy Bird, не имея сложной механики и графики, стала хитом. Сегодня мы расскажем, как всего за 10 минут написать свой вариант игры на Unity под Android.

События и курсы

Создаём простое VR-приложение под Android с помощью Unity

Виртуальная реальность — это новое захватывающее направление в разработке приложений. Разберём, как создать VR-приложение с обзором в 360 градусов для Android. Навыки программирования не требуются.

Курс «Создание 2D-игры под Android»

Курс по созданию 2D-игры на Unity 5, в ходе которого вы познакомитесь с Unity, созданием скриптов, управляющих элементов и публикацией игры в Google Play.

Создание Minecraft на Unity3D. Часть вторая. Генерация мира

Это вторая часть руководства по созданию собственной Minecraft-подобной игры. В ней мы напишем генератор мира и добавим персонажа, который сможет перемещаться по миру, ставить и удалять блоки. В предыдущей части мы…

Как разрабатывать приложения смешанной реальности для Microsoft HoloLens: взаимодействие с окружающим пространством

В предыдущей части мы создали нашу первую голограмму и научились с ней взаимодействовать. Теперь мы соединим нашу голограмму с реальным миром.

Создание Minecraft на Unity3D. Часть первая. Создаем базовый куб с текстурой

Мы начинаем серию уроков, ориентированную на то, чтобы научить вас создавать простую Minecraft-подобную игру, а также изучить различные аспекты движка Unity3D. Так как это вводный урок, алгоритмы и структура объектов, представленные…

Программистов ищут в веб-студии (PHP, вёрстка), а также начинающих командах по разработке игр (Unity), платформы в сфере проектного менеджмента (UI), аналитической платформы для анализа финансовых рынков (С#)

Программист Unity3D и C++, Москва Работа в офисе Нужен опыт Регулярная зарплата (100–150k) Игровая Механика — небольшая группа разработчиков игр на PC и мобильные платформы, существующая более 1,5 лет. В декабре 2015 года…

Самый простой способ сделать игру на Unity 5

Видеокурс о создании игры на Unity 5 от самых основ до сборки под Universal Windows Platform.

Save the Penguin — рассказ о первом опыте разработки под Android

Программирование велось в Unity в свободное время и заняла около месяца. Идея для игры пришла сама собой: таймкиллер в портретной ориентации с возможностью игры одним пальцем.

Руководство по моделированию 2D водной поверхности

Рассказывает Alex Rose В этой статье мы рассмотрим создание динамической 2D воды с простейшей физикой. Мы будем использовать рендер линий, мешей, триггеры и частицы. Конечный результат с волнами и брызгами…

Создание ландшафта на Unity за 24 часа

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

Пишем Сапёр на Unity. Обработка конца игры

В заключительной части нашей серии мы будем доводить уже почти готовую игру до ума. К концу этого урока ваш Сапёр будет вполне играбельным: игрок сможет и проиграть уровень, и выиграть…

Пишем Сапёр на Unity. Взаимодействие

Мы продолжаем нашу серию уроков по написанию Сапёра на Unity. В этой части мы реализуем взаимодействие между клетками, сделаем так, чтобы они подсвечивались при наведении мыши, а также добавим возможность…

Пишем сапёр на Unity. Настройка

Логические игры часто включают в себя клеточные поля, при этом клетки имеют определенные свойства и модели поведения. В этой серии уроков мы покажем вам, как создать простую версию классической игры…

Как выполнять сохранение и загрузку игры в Unity

Совсем недавно мы опубликовали серию уроков (1 часть, 2 часть, 3 часть, 4 часть) по созданию простой игры, используя очень распространенный игровой движок — Unity. В этой статье мы покажем…

Пишем арканоид на Unity. Добавление звуков и новых уровней

Мы продолжаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем один из аспектов…

Пишем арканоид на Unity. Поведение блоков, префабы и дизайн уровней

В этой статье мы продолжаем серию уроков о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем…

Пишем арканоид на Unity. Механика мяча и платформы

Итак, мы продолжаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком. В каждой из статей мы затронем один из…

Пишем арканоид на Unity. Настройка проекта

Мы начинаем цикл статей о написании простой игры на Unity — классического арканоида. Использовать будем только 2D инструменты, предоставляемые нам движком, который, ко всему прочему, совсем недавно стал бесплатным. В…

Методы оптимизации при разработке в Unity 3D

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

Справочник скриптов C#

Есть ли справочник скриптов C#? Т.е. там где только название какой-либо переменной\функции\константы и её функции.
Что-то вроде этого: http://fi2.php.net/manual/ru/funcref.php

Добавлено через 59 секунд
Документация переменных, что-ли

12.12.2015, 13:45

Передача данных: Справочник Документ Справочник
Доброго все времени суток! я в 1С новичек, помогите пожалуйста Я понимаю, что на многие вопросы.

Создание скриптов
Нужно написать скрипт создания таблицы table1, с тремя столбцами (int, char), пятью строками;.

Программирование скриптов
Вставил готовые, а мужик сказал что за это сожают, я с дури разрадовался модельки царапать.

Конфликт скриптов
Подключил скрипт (form/main.js он нужен для страницы с контактами) и все скрипты что раньше.

Отладка скриптов
Доброго. Пишу парсер на шарпе. Скачиваю html страницу, чтобы её спарсить, но, оказывается, часть.

Цукерберг рекомендует:  Работа бота как симулировать нажатия клавиш в Python
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих