Найти в Дзене
Dima Garanin

Всё, что нужно знать начинающему программисту Unity

Основано на реальных событиях Речь сейчас пойдёт об игровом движке Unity, замечательном языке программирования С#  и о простых вещах и понятиях, которые просто необходимо знать хотя-бы самому начинающему специалисту Unity. Но вы должны знать, что помимо Unity работодатели требуют ещё некоторые навыки по типу Git, JSon и тому подобного, чего я сам до конца не знаю. Итак, я представляю вашему вниманию азбуку для программиста Unity(Unity Developer). Всё будет рассказано на понятном языке и будут показаны реальные примеры применения. Быть может благодаря этой статье у вас улучшится понимание этой целой науки. И возможно подыщите хорошую работу для себя и главное - любимою. Классы(Любой объект игры) Пример: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { } Краткое описание: Класс - это простым языком любой объект, предмет и даже животное в нашей искусственной вселенной. Класс обладает свойствами и поведением. Свойства -
Оглавление

Основано на реальных событиях

Речь сейчас пойдёт об игровом движке Unity, замечательном языке программирования С#  и о простых вещах и понятиях, которые просто необходимо знать хотя-бы самому начинающему специалисту Unity. Но вы должны знать, что помимо Unity работодатели требуют ещё некоторые навыки по типу Git, JSon и тому подобного, чего я сам до конца не знаю.

Итак, я представляю вашему вниманию азбуку для программиста Unity(Unity Developer). Всё будет рассказано на понятном языке и будут показаны реальные примеры применения. Быть может благодаря этой статье у вас улучшится понимание этой целой науки. И возможно подыщите хорошую работу для себя и главное - любимою.

Классы(Любой объект игры)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
}

Краткое описание:

Класс - это простым языком любой объект, предмет и даже животное в нашей искусственной вселенной. Класс обладает свойствами и поведением. Свойства - это переменные класса, а поведение - это функции(иногда их называют методами) класса. О них пойдёт речь чуть позже.

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

Классы бывают публичными(приставка public) и локальными(приставка либо отсутствует либо прописана как private). Это называется инкапсуляция(Компонент ООП). Также, вы заметили, что после имени класса в примере идёт двоеточие, а за ним прописано MonoBehaviour. Это называется наследованием, но об этом, опять-же, речь пойдёт чуть позже.

О using сегодня речь не пойдёт. Главное, что вам нужно знать, что чтобы в вашем классе появились новые функции недоступные ранее, вам нужно просто объявить нужное пространство имён(или namespace). К примеру, если вы хотите создать элемент игрового интерфейса, то вам нужно прописать до объявления класса using UnityEngine.UI, которое даст доступ к классам интерфейса.

Переменные(Свойства класса)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
}

Краткое описание:

Переменные можно представить как коробку, в которую можно что-то поместить(присвоить значение) или оставить пустой(иметь значение null). Кстати, скорее-всего у вас будет часто возникать ошибка null reference exception. Она будет возникать, когда вы будете пытаться достать какое-нибудь значение из пустой переменной.

Это не относиться к фундаментальным переменным вроде int или string, это будет относиться к классам. К примеру если вы не поместите в переменную Transform какое-нибудь значение и будете пытаться его оттуда достать, то у вас возникнет ошибка.

Функции(Поведение класса)

Пример:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Player : MonoBehaviour
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
void Start()
{
health = 50.0f;
}
void Update()
{
}
void Kill(Player player, string message)
{
health = 0.0f;
}
}

Краткое описание:

Так-как наш класс наследуется от класса MonoBehaviour, то вместе с ним ему достались некоторые функции этого родительского класса. Главные, которые вам будет достаточно знать на начальном этапе, это Update(), Start() и OnEnable().

Update() - вызывается каждый игровой кадр, то-есть работает постоянно. Start() - вызывается когда мы запускаем игру(по нажатию кнопки Play). А OnEnable() вызывается когда наш класс появляется на сцене(можно использовать вместо Start()).

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

Условные операторы(Вся игра построена на условиях)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
void Start()
{
health = 50.0f;
}
void Update()
{
if(health <= 0)
{
Kill(this, "You are dead, not big suprise!");
}
}
void Kill(Player player, string message)
{
health = 0.0f;
}
}

Краткое описание:

Условных операторов несколько, но самый простой, понятный и тот, который будет самым удобным на первое время - это if(). "If" - переводиться как "если", а в скобках мы указываем, какие два значения мы хотим сравнить. В примере мы поместили наше условие в Update(), и поэтому оно будет проверяться постоянно(систему это сильно не нагрузит). И оно сравнивает два значения - health и цифру 0. А между ними стоит логический оператор <=, который проверяет, меньше или равно первое значение по отношению ко второму?

То есть получается, что логические операции возвращают либо true(истинна), либо false(ложь) и называется это соответственно логической переменной bool. Но если мы начнём говорить о всех переменных, то придётся писать отдельную статью. Да и вообще эта статья просто указывает на то, какие вам необходимы фундаментальные знания и как они называются. Разбираться со всеми ними вам придётся по отдельности.

Как и с функциями, внутри фигурных скобках указывается действие, которое должно производиться, если условие является истинным. Оператор this, прописанный в функции Kill(), указывает на класс

Вывод сообщений в консоль(Помогает точно проверять работу кода)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
void Start()
{
health = 50.0f;
}
void Update()
{
if(health <= 0)
{
Kill(this, "You are dead, not big suprise!");
}
}
void Kill(Player player, string message)
{
health = 0.0f;
Debug.Log(message);
}
}

Краткое описание:

Debug.Log() - это функция, которая позволяет выводить сообщения в консоль Unity. Вы просто можете внутри скобок написать любую переменную и узнать её значение во время плейтеста(string не обязателен).

Массивы и коллекции(Множество переменных)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
public Transform[] goals;
public List<Transform> completedGoals;
void Start()
{
health = 50.0f;
}
void Update()
{
if(health <= 0)
{
Kill(this, "You are dead, not big suprise!");
}
}
void Kill(Player player, string message)
{
health = 0.0f;
Debug.Log(message);
}
}

Краткое описание:

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

Если вам нужно создать тот-же массив только с расширенным функционалом(добавлять, удалять элементы), то коллекция List<> идеально вам подойдёт. List<> объявляется как переменная с угловатыми скобками, внутрь которых надо вставить класс, чьё множество мы хотим создать.

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

Циклы(Способ перебрать все элементы массива и коллекции)

Пример:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public string name = "Ivan";
public int health = 100;
public float speed = 5.0f;
public Transform goalPosition;
public Transform[] goals;
public List<Transform> completedGoals;
void Start()
{
health = 50.0f;
}
void Update()
{
if(health <= 0)
{
Kill(this, "You are dead, not big suprise!");
}
}
void Kill(Player player, string message)
{
health = 0.0f;
Debug.Log(message);
for (int i = 0; i < goalPosition; i++)
{
completedGoals.RemoveAt(0);
}
}
}

Краткое содержание:

Если вам нужно перебрать какой нибудь массив или коллекцию или просто повторить несколько раз одно и то-же действие, то вам нужно будет вызвать цикл. Цикл for далеко не единственный из всех циклов этого языка программирования, но самый простой и удобный.

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

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

Заключение

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