Unity 2d уроки

Содержание

Unity 2d уроки

Unity для 2D

Большинство разработчиков 2D создают, запускают свою игру и получают прибыль с помощью платформы Unity. Узнайте, что она предлагает, и как вы можете извлечь из этого выгоду.

Сообщество, инструменты, ресурсы

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

Множество ресурсов

Документация, обучающие материалы, форумы и курсы

Крупнейший магазин ресурсов и инструментов

Тысячи ресурсов, ускоряющие разработку

Поддержка от ведущих игровых студий

Вдохновляйтесь, учитесь, нанимайте или находите работу

Поддержка 2D/3D

Упрощает процесс разработки в 2D, 3D или в их сочетании

Богатый функционал,

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

Подстраивается

Подстраивается под особенности рабочего процесса и ваши предпочтения

Нативная высокая производительность и графика

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

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

Благодаря встроенным IAP, рекламной сети и средствам аналитики в реальном времени

Расширяйте аудиторию на всех платформах

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

Исследуйте новые возможности

Портируйте самые успешные мобильные игры на ПК, консоли или мобильные VR-устройства

  • Полный контроль над размером файлов
  • Работайте в любимом и хорошо знакомом вам редакторе
  • Непревзойденная производительность и масштабируемость

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

Успешные разработчики 2D-игр полагаются на Unity

Свет, камера, приключение

Игра Forgotton Anne — это поистине амбициозный проект. Она объединяет в себе 500-страничный сценарий, оригинальный саундтрек, исполненный Датским филармоническим оркестром, и анимации уровня работ студии Ghibli, созданные командой выходцев из мультипликационной индустрии. Узнайте, как ThroughLine Games использовали Unity, чтобы создать один из самых высококачественных и кинематографичных приключенческих 2D-платформеров.

После смерти все становится только лучше

Узнайте, как Unity помогла студии из трех человек создать увлекательный двухмерный платформер с 93 уровнями, 15 анимационными сценами и 3 режимами сложности, который завоевал сердца игроков и привлек внимание инвесторов.

Свобода для экспериментов

Узнайте, как гибкость и богатый инструментарий Unity помог инди-разработчику Стю Денману воплотить свою идею в гипнотизирующую и увлекательную игру более чем со 160 уровнями.

Двухмерная ретро-игра для VR

У Аны Рибейро была идея создать ретро-игру в стиле GameBoy для современной платформы VR. Узнайте, как с Unity ей удалось решить технические задачи, подготовить продукт к выпуску и оптимизировать его.

Как собственные инструменты редактора помогли сэкономить время

Узнайте, как с Unity команде из 14 разработчиков различного профиля, живущих в разных уголках планеты, удалось объединить усилия и создать интересный сюжет с ярким художественным оформлением и разработать увлекательный игровой процесс для великолепной двухмерной игры в жанре hack-and-slash.

Маленькая команда, большие амбиции

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

Неожиданный поворот в 2,5D

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

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

Скрупулезная проработка графики

Cuphead — это однопользовательский / кооперативный платформер жанра run-and-gun, вдохновленный мультфильмами 1930-х годов, нарисованный вручную и озвученный оригинальными джазовыми композициями.

Загадочный и глубокий мир

Главная сила Night in the Woods в проработке персонажей и диалогов, а также стильной двумерной графике. Это интерактивное повествование начинается в городке под названием Possum Springs и помещает игрока в мир экзистенциальных и по-темному комичных историй.

Проект появился в рамках геймджема, но потом SFB Games совместно с Nintendo перенесли его на Unity и выпустили для Nintendo Switch. Эта головоломка рассчитана на совместную игру и решение простых (но только на первый взгляд!) задач и приносит невероятное удовольствие игрокам.

Управляем природой

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

2D-инструмент, меняющий процесс создания уровней

Tilemap и другие инструменты помогли двум разработчикам из разных стран в свое свободное время создать удивительный 2D-платформер, в котором все — не то, чем кажется. Узнайте, как они этого добились.

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

Студии, стоящие за шедеврами вроде Hearthstone и Hitman Go, рассказывают о переходе на Unity, в том числе о:

  • влиянии на рабочий процесс;
  • технических рекомендациях;
  • окупаемости и выгоде;
  • внедрении.

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

Разработка 2D игры на Unity (1/5) «Знакомство с редактором»

Привет, пикабу! Сим постом, начну небольшую серию «уроков» по созданию двухмерной игры на движке Unity. Надеюсь, кому-то будет интересно. И сразу скажу, что в первом уроке мы не будем кодить. Это вводный урок. Поехали!

А создавать мы, собственно, будем упрощённую копию игры «Электроника». Это та самая советская игра, в которой волк из мультфильма «Ну погоди» ловит яйца.

Для начала, давайте рассмотрим инструментарий, который нам понадобится:

1 — Игровой движок Unity. Это два в одном. И движок и визуальный редактор.
Скачать Unity можно бесплатно, на официальном сайте unity3d.com.
2 — Любой редактор растровой графики, поддерживающий альфа каналы. То есть позволяющий создавать прозрачное изображение. В моём случае это Photoshop.
3 — Визуальная среда разработки, поддерживающая язык C#. По факту, можно кодить и в блокноте. Но визуальный редактор сильно ускоряет процесс. Так, как он имеет подсветку синтаксиса, подсказки, а возможно даже и проверку валидности написанного нами кода. Я пользуюсь Visual Studio. По умолчанию с юнити поставляется Mono Develop.

Всё скачали? Поставили? Отлично!

Давайте посмотрим, чем нам ещё может быть полезен сайт unity3d.com.

1 — Обучающие материалы (unity3d.com/ru/learn/tutorials).
В этом разделе вы можете найти множество видео-уроков с примерами кода, разделённые на различные категории. Полностью изучив этот раздел, вы уже сможете создать что нибудь интересная. Но есть и минус — большинство материалов на английском.
2 — Руководство по движку ( http://docs.unity3d.com/ru/current/Manual/ ).
Практически полностью русифицированный раздел, в котором можно найти ответы на большинство возникающих вопросов. И не только у новичков. Но кому я это рассказываю? Настоящие кулхацкеры и гамедевелоперы не читают документацию =)
3 — API скриптов ( http://docs.unity3d.com/ru/current/ScriptReference/ ).
А вот этот раздел я всё таки советую добавить в закладки. Когда вы поймёте основы скриптинга в Unity и поймёте, по какому принципу можно обращаться к объектам и свойствам, вам можно будет не мучать гугл глупыми вопросами, а сразу идти и курить мануалы на оф. сайте. Так будет проще, ибо гугл не содержит ответов на действительно серьёзные вопросы.

Читать еще:  Видео уроки nx10

С этим разобрались. Давайте запустим редактор.

Для начала, давайте узнаем, с чем нам придётся работать. На картинке выше — окно редактора Unity, пятой версии. Прошу заметить, что стандартный вид данного окна — отличается от того, что вы видите у меня. Просто потому, что мне так удобнее. Для удобства повествования я выделил в редакторе пять областей. И стрелочкой указал на ещё одно важное место. Давайте посмотрим, что есть что:

1 — Окно иерархии (hierarchy). В этом окне будут размещаться все те элементы, которые вы поместите на сцену. Каждый из этих элементов будет являться 3D объектом и иметь свое положение в пространстве вашей игры.
2 — Окно сцены (scene) и окно игры (game). Именно тут вы сможете рассмотреть создаваемое вами игровое пространство. Отличаются они тем, что по окну сцены вы можете свободно перемещаться и изменять вид (с этим сильно помогут стрелочки, что находятся прямо под моей дойкой). А в окне Game, вы видите игру так, как будет её видеть игрок.
Сейчас в этом окне у меня расположена сцена из стрелялки, сделанная в сеттинге «Марио». Я снимаю видео-уроки по её созданию. Да, квадратно, да не красиво. Это обучающий материал)

3 — Окно проекта (project). Тут будут располагаться все исходники нашего проекта. Это окно, по своему содержанию, полностью соответствует папке «Assets», в корневой директории вашего проекта. А это значит, что все новые файлы вы можете добавлять и туда, и туда.

4 — Инспектор (inspector). В этом окне отображаются все свойства выбранного элемента.
5 — Консоль (console). В этом окне будут отображаться все ошибки, а так же лог, если мы вдруг будем что-то в коде дебажить. Теоретически — это окно можно не держать открытым постоянно. Но я программист, поэтому этим окошком пользуюсь всегда.
Там же, во вкладках, у меня расположены окна анимаций (animator и animation). В этих окошках мы будем анимировать объекты. Но в этой серии уроков анимации мы не коснёмся.

6 — Кнопки воспроизведения проекта. Ражимаем «Play» и можем прямо в окошке «Game» поиграть в нашу игру.

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

Туториал 5: 2Д игра платформер (урок для начинающих). Часть 2.

Введение:

Как сделать стену:

Как собирать и подсчитывать монеты:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CoinController : MonoBehaviour <

//звук сбора монеты
public AudioClip CoinSound;
//переменная количества собранных монет
public int coin;

//запустится если collider2D попал в триггер
void OnTriggerEnter2D ( Collider2D other) <
//проверка, имеет ли попавший объект тэг Coin
if (other.tag == «Coin» ) <
//увеличить счетчик монет
coin = coin + 1 ;
//проиграть звук поднятия монеты на позиции крысы
AudioSource .PlayClipAtPoint (CoinSound, transform.position);
//удалить монету из сцены
Destroy (other.gameObject);
>
>
>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//эта библиотека нужна для работы с интерфейсом
using UnityEngine.UI;

public class CoinController : MonoBehaviour <

//ссылка на объект с текстом
public GameObject TextObject;
//ссылка на текстовый компонент
Text textComponent;
//звук поднятия монеты
public AudioClip CoinSound;
//переменная подсчета монет
public int coin;

//запустится один раз при запуске скрипта
void Start () <
//делаем линк на текстовый компонент, который находится на текстовом объекте
textComponent = TextObject.GetComponent ();
>

//запустится если collider2D попал в триггер
void OnTriggerEnter2D ( Collider2D other) <
//проверка, имеет-ли объект тэг Coin
if (other.tag == «Coin» ) <
//увеличить переменную подсчета монет
coin = coin + 1 ;
//записать в текст результат счета монет, преобразованный в текстовую переменную
textComponent.text = coin.ToString();
//проиграть звук поднятия монеты на позиции крысы
AudioSource .PlayClipAtPoint (CoinSound, transform.position);
//удалить монету из сцены
Destroy (other.gameObject);
>
>
>

Как сделать яму:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//это библиотека для работы со сценами
using UnityEngine.SceneManagement;

public class DeadEndController : MonoBehaviour <

//запустится если 2D collider попал в триггер
void OnTriggerEnter2D ( Collider2D other) <
//проверка, имеет ли объект тэг Player
if (other.tag == «Player» ) <
//ппосмотреть название текущей сцены и загрузить её (reload)
SceneManager .LoadScene ( SceneManager .GetActiveScene().name);
>
>
>

Как сделать простого врага:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//библиотека для управления сценами
using UnityEngine.SceneManagement;

public class MushroomController : MonoBehaviour <

//как далеко гриб может отойти от начальной точки
public float distanceToRun;
//скорость движения
public float speed;
//направление взгляда гриба
public bool isLookingLeft = true ;
//стартовая позиция
Vector3 startPos;
//линк на компонент Rigidbody2D
Rigidbody2D rb;

//выполнится 1 раз при старте игры
void Start () <
//делаем линк на Rigidbody2D компонент
rb = GetComponent ();
//запоминаем стартовую точку гриба
startPos = transform.position;
//будем сравнивать квадрат вектора расстояния с квадратом расстояния
//так как извлечение корня медленный процесс
distanceToRun = distanceToRun * distanceToRun;
>

//выполняется на каждом фиксированном интервале
void FixedUpdate () <
//проверить, смотрит-ли гриб влево
if (isLookingLeft) <
//посчитать вектор направления от стартовой точки к грибу
Vector2 dist = transform.position — startPos;
//проверить, что гриб слева от стартовой точки
//и расстояние между грибом и стартовой точкой больше разрешенного удаления
if (transform.position.x distanceToRun) <
//вызвать функцию поворота гриба
TurnTheMushroom ();
//начать движение направо
rb.velocity = new Vector2 (speed, rb.velocity.y);
//если проверка была негативной
> else <
//продолжить движение влево
rb.velocity = new Vector2 (-speed, rb.velocity.y);
>
>
//проверить, что гриб смотрит вправо
if (!isLookingLeft) <
//посчитать вектор направления от стартовой точки к грибу
Vector2 dist = transform.position — startPos;
//проверить, что гриб справа от стартовой точки
///и расстояние между грибом и стартовой точкой больше разрешенного удаления
if (transform.position.x > startPos.x && dist.sqrMagnitude > distanceToRun) <
//вызвать функцию поворота гриба
TurnTheMushroom ();
//начать движение налево
rb.velocity = new Vector2 (-speed, rb.velocity.y);
//если проверка была негативной
> else <
//продолжить движение направо
rb.velocity = new Vector2 (speed, rb.velocity.y);
>
>
>
//функция поворота гриба
void TurnTheMushroom ()
<
//инвертировать (изменить на противоположный) указатель направления взгляда
isLookingLeft = !isLookingLeft;
//повернуть гриб
transform.localScale = new Vector3 (transform.localScale.x * -1 , transform.localScale.y, transform.localScale.z);
>

//запустится, если коллайдер коснулся другого коллайдера
void OnCollisionEnter2D ( Collision2D other) <
//проверить, что у коллайдера тэг Player
if (other.collider.gameObject.tag == «Player» ) <
//посмотреть имя загруженной сцены и загрузить такую сцену (reload)
SceneManager .LoadScene ( SceneManager .GetActiveScene().name);
>
>

//запустится, если другой коллайдер попал в триггер
void OnTriggerEnter2D ( Collider2D other) <
//проверить, что у коллайдера тэг Player
if (other.tag == «Player» ) <
//удалить гриб
Destroy (gameObject);
>
>
>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ExplosionsDestroyer : MonoBehaviour <

//как долго взрыв будет в сцене
public float timeToDestroy;

//выполнится один раз при старте скрипта
void Start () <
//удалить взрыв из сцены
Destroy (gameObject, timeToDestroy);
>
>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//библиотека для управления сценами
using UnityEngine.SceneManagement;

public class MushroomController : MonoBehaviour <

//префаб взрыва
public GameObject Explosion;
//звук взрыва
public AudioClip Boom;
//как далеко гриб может отойти от начальной точки
public float distanceToRun;
//скорость движения гриба
public float speed;
//направление взгляда гриба
public bool isLookingLeft = true ;
//стартовая позиция гриба
Vector3 startPos;
//линк на компонент Rigidbody2D
Rigidbody2D rb;

//выполнится один раз при старте гриба
void Start () <
//делаем линк на компонент Rigidbody2D
rb = GetComponent ();
//запоминаем стартовую позицию гриба
startPos = transform.position;
//будем сравнивать квадрат вектора расстояния с квадратом расстояния
//так как извлечение корня медленный процесс
distanceToRun = distanceToRun * distanceToRun;
>

//выполняется на каждом фиксированном интервале
void FixedUpdate () <
//проверить, что гриб смотрит налево
if (isLookingLeft) <
//посчитать вектор направления от стартовой точки к грибу
Vector2 dist = transform.position — startPos;
//проверить, что гриб слева от стартовой точки
//и расстояние между грибом и стартовой точкой больше разрешенного удаления
if (transform.position.x distanceToRun) <
//вызвать функцию поворота
TurnTheMushroom ();
//начать движение направо
rb.velocity = new Vector2 (speed, rb.velocity.y);
//если проверка была отрицательной
> else <
//продолжить движение налево
rb.velocity = new Vector2 (-speed, rb.velocity.y);
>
>
//проверить, что гриб смотрит направо
if (!isLookingLeft) <
//посчитать вектор направления от стартовой точки к грибу
Vector2 dist = transform.position — startPos;
//проверить, что гриб справа от стартовой точки
//и расстояние между грибом и стартовой точкой больше разрешенного удаления
if (transform.position.x > startPos.x && dist.sqrMagnitude > distanceToRun) <
//вызвать функцию поворота
TurnTheMushroom ();
//начать движение налево
rb.velocity = new Vector2 (-speed, rb.velocity.y);
//если проверка была отрицательной
> else <
//продолжить движение направо
rb.velocity = new Vector2 (speed, rb.velocity.y);
>
>
>
//функция поворота гриба
void TurnTheMushroom ()
<
//изменить указатель направления взгляда на противоположный
isLookingLeft = !isLookingLeft;
//повернуть гриб
transform.localScale = new Vector3 (transform.localScale.x * -1 , transform.localScale.y, transform.localScale.z);
>

///запустится, если коллайдер коснулся другого коллайдера
void OnCollisionEnter2D ( Collision2D other) <
//проверить, что у коллайдера тэг Player
if (other.collider.gameObject.tag == «Player» ) <
//посмотреть имя загруженной сцены и загрузить такую сцену (reload)
SceneManager .LoadScene ( SceneManager .GetActiveScene().name);
>
>

Читать еще:  Бабушкин квадрат по испански видео уроки

//запустится, если другой коллайдер попал в триггер
void OnTriggerEnter2D ( Collider2D other) <
//проверить, что у коллайдера тэг Player
if (other.tag == «Player» ) <
//спавн взрыва
Instantiate (Explosion, transform.position, Quaternion .identity);
//проиграть звук взрыва
AudioSource .PlayClipAtPoint (Boom, transform.position);
//удалить гриб
Destroy (gameObject);
>
>
>

Восприятие звука:

Как сделать движущуюся платформу:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformMoving : MonoBehaviour <

//скорость движения платформы
public float speed;
//позиция, где платформа должна повернуть назад
public Transform endPoint;
//позиция начала движения
Vector3 startPoint;
//ссылочная переменная для компонента Rigidbody2D
Rigidbody2D rb;
//скорость платформы в текущий момент
float currentSpeed;

//выполнится при запуске скрипта
void Start () <
//запомнит стартовую точку платформы
startPoint = transform.position;
//сделать ссыдку на Rigidbody2D
rb = GetComponent ();
//начальное направление движения
currentSpeed = speed;
>

//выполнятся через интервалы
void FixedUpdate () <
//проверка, находится-ли платформа выше конечной точки
if (transform.position.y > endPoint.position.y)
//скорость для вектора движения вниз
currentSpeed = -speed;
//проверка, находится-ли платформа ниже начальной точки
if (transform.position.y < startPoint.y)
//скорость для вектора движения вверх
currentSpeed = speed;
//направить платформу по вектору движения
rb.velocity = new Vector3 ( 0 , currentSpeed, 0 );
>
>

Как добавить физические объекты:

Конец уровня:

Как сделать движущийся фон с эффектом параллакс:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Parallax : MonoBehaviour <

//ссылочная переменная на игрока
GameObject player;
//позиция игрока в предыдущем кадре
//и разница в позиции между кадрами
Vector3 lastPos, offset;
//скорость движения фона
public float speed;

//выполнится один раз при запуске скрипта
void Start () <
//делаем линк на игрока
player = GameObject .FindWithTag ( «Player» );
//запоминаем его позицию
lastPos = player.transform.position;
>

//выполняется каждый кадр
void Update () <
//посчитать разницу в позициях между кадрами
offset = player.transform.position — lastPos;
//пересчитать разницу в зависимости от скорости и передвинуть фон по полученному вектору
//Time.deltaTime корректировка для разного фпс
transform.Translate (offset * speed * Time .deltaTime);
//перезаписать позицию в текущем кадре
lastPos = player.transform.position;
>
>

Как добавить фоновую музыку:

Теперь простое. Импортируйте звуковой файл Music. Выберите Rat в иерархии. Перетащите Music на Rat ы иерархии (или добавьте Audio Source и поместите Music в поле AudioClip field). Включите Loop.

Проверьте сцену.

Оптимизация 2D игр на Unity

Обновленная версия статьи всегда по адресу: https://mopsicus.ru/all/optimization-unity-2d-games/

На Youtube куча уроков по созданию простейших 2D игр на Unity. Реально, сделать неплохой платформер можно за день, при наличии опыта и готовых ассетов. Но многие начинающие игроделы сделав проект и протестировать его на ПК, с ужасом наблюдают как их творение тормозит на мобильном устройстве.

В мануалах, что встречаются в сети, большинство советов собрано к версии Unity 4.6+, кроме того, они почти все на английском, что для некоторых является преградой. В этом посте, я постарался собрать те моменты, которые помогли мне избавится от лагов на iOS и Android. Но важно понимать — не все можно решить лишь настройками, очень важна и архитектура приложения, и подготовленные текстуры, и знание более оптимальных алгоритмов.

Что нужно предпринять, чтобы повысить производительность, поднять FPS, снизить CPU?

1. Кешируем все!

Все, что будет использоваться больше одного раза лучше закешировать. Операции типа GameObject.Find() или GetComponent() достаточно ресурсозатратны, а если они вызываются где-нибудь в цикле или в Update (), то производительность может упасть.

void Awake () <
_cachedTransform = transform;
>
void Update () <
_cachedTransform.localPosition = _newPosition;
>

2. Настройки графики

В Unity есть 6 стандартных пресетов настройки качества графики. Но так как мы говорим про оптимизацию для 2D и для мобильных устройств, то все что выше Simple нет смысла ставить. Конечно, если у вас есть какие-то специфические моменты, частицы, и т. д., то с параметры можно поэкспериментировать найдя оптимальный баланс.

3. Используем FrameRate

По-умолчанию FrameRate равен 30. И зачастую этого бывает достаточно. Но например, при создании UI где есть прокручивающие списки и движущие элементы, может появится дрожание или шлейф. Я это заметил при тестировании на iPhone, поэтому вручную повысил FrameRate. А понижая FrameRate на сценах или игровых меню, где ничего не двигается, можно значительно снизить CPU, а следовательно продлить жизнь батарее устройства. Пользователи не любят когда игра сжирает аккумулятор за час.

public int _frameRate = 60;

void Start () <
# if UNITY_IOS
QualitySettings.vSyncCount = 0;
# endif >

void Update () <
# if UNITY_IOS
if (_frameRate != Application.targetFrameRate) <
Application.targetFrameRate = _frameRate;
>
# endif
>

4. Атлас текстур

Определенно, нужно упаковывать все свои спрайты в атласы. Для этого есть как встроенный инструмент Sprite Packer , так и продвинутый TexturePacker . Для работы встроенного упаковщика, достаточно задавать теги в настройках импорта, объединяя текстуры и спрайты по смыслу и месту использования.

Таким образом уменьшается количество вызовов отрисовок ваших спрайтов. Проверить как идет отрисовка можно с помощью встроенного инструмента Frame Debugger .

5. Используем пул объектов

GameObject.Instantiate () — очень дорогая операция! Если есть возможность не использовать ее в процессе игры — не используйте. Для большого количества однотипных объектов надо использовать пул объектов. Один раз инициализировав определенное количество, например пуль, они будут использоваться снова и снова, вместо создания и уничтожения каждый раз. Урок по пулу объектов и готовый шаблон , для начала будет достаточно.

6. Меньше Update — больше событий

Метод Update () вызывается каждый кадр, FixedUpdate () в некоторых случаях еще чаще. Если у вас в этих местах происходит много различных проверок и действий, это можно сказаться на производительности. Я использую событийную модель: вместо проверки условия в Update (), когда происходит какое-либо действие, отправляется событие, а в нужном месте это событие «слушается» и обрабатывается в зависимости от переданных параметров. Для этого можно использовать менеджер событий о котором я писал ранее.

7. Выключаем неиспользуемые компоненты

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

8. Настройки билда

Билд под конкретную платформу, тоже можно оптимизировать. Например, если акселерометр не используется в игре, его лучше вообще отключить. Кроме того, я не использую автовыбор графического API, а задаю его сам убирая все остальные, опять же, если вы не используете какие-то специфические функции из OpenGLES 3.0, а так второй версии вполне хватает, она уже давно протестирована. Включаем статичный и динамический батчинг, а для Android многопоточный рендеринг. Для iOS включаем Script Call Optimization в Fast but no Exceptions, но тут момент — если будет какое-то исключение, то игра крашится.

9. Используем Profiler

Не стоит обделять вниманием профайлер. Обязательно протестируйте свою игру и посмотрите, в какие моменты идет максимальная нагрузка. Эти места нужно оптимизировать в первую очередь. Большинство ответов можно найти на stackoverflow.com или форуме Unity, просто загуглив название метода который тратит больше всего ресурсов.

10. Использование материала для UI Image и SpriteRenderer

Если у вас сложный интерфейс и много компонентов, особенно UI Image, то они существенно будут влиять на FPS. Чтобы повысить производительность, улучшить плавность анимаций, можно применить такой хак: там где вы не используете маски, у картинок нужно задать материал Sprites-Default . Если это сделать вместе с маской, то маска не сработает и получите примерно такой варнинг:

Material Sprites-Default doesn’t have _Stencil property

Чтобы убрать эту ошибку нужно немного изменить стандартный шейдер, сделать новый материал и применить его там где есть маска, тогда все сработает. Ссылка на измененный шейдер.
Цена плавности — повышение CPU 🙁

11. Уменьшаем размер текстур

Отличная утилита которая позволяет снизить потребления памяти для текстур до 3х раз. Как это работает и ссылка на Github, в статье на Хабре.

12. Практическое руководство по оптимизации Unity игр

Подойдет как для 2D, так и для 3D. Много полезной информации которую в документации вряд ли найдешь. Тут и про инструменты, и про опыт. Рассказывает специалист по эксплуатации из Unity Technologies — очень интересно. Узнал про memory profiler и то, что Camera.main не закеширована О_О. Обязательно смотреть всем.

13. Используем оптимизированный код

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

14. Используем одинаковые материалы

Если на объектах стоят разные материалы, они не будут батчится и будет больше вызовов отрисовки. Соответственно, нужно по возможности использовать как можно меньше разных шейдеров и материалов. Для понимания, как работает начальная оптимизация графики 2D, на Lynda.com есть небольшой курс .

15. Размеры атласов и спрайтов

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

Читать еще:  Полиглот немецкий язык 1 урок конспект

16. Используйте UI Profiler

В Unity 2017 появился UI Profiler! Крутая штука, теперь можно выяснить почему в интерфейсе много вызовов отрисовки, увидеть какие материалы на объектах и всё это оптимизировать. Особенно актуально, если у вас сложные интерфейсы со множеством элементов, которые например, прокручиваются в ScrollRect.

17. Уголок оптимизатора

На сайте Unity появился специальный раздел посвященный оптимизации — Optimization corner . Там и про UI, и профайлеры, и основные ошибки, в общем, стоит ознакомиться.

Пока все. Тут не было про физику, потому что пока я ее не использовал. Возможно, в будущем добавлю.
__________________________________________________________________________________________

Все последние обновления этой и других статей, вы можете найти у меня в блоге https://mopsicus.ru

Подписывайтесь, чтобы не пропустить что-то интересное

#mopsicus

Оптимизация 2D игр на Unity

Этот пост будет периодически дополняться и обновляться.
Обновлено 28.11.2019

На Youtube куча уроков по созданию простейших 2D игр на Unity. Реально, сделать неплохой платформер можно за день, при наличии опыта и готовых ассетов. Но многие начинающие игроделы сделав проект и протестировать его на ПК, с ужасом наблюдают как их творение тормозит на мобильном устройстве.

В мануалах, что встречаются в сети, большинство советов собрано к версии Unity 4.6+, кроме того, они почти все на английском, что для некоторых является преградой. В этом посте, я постарался собрать те моменты, которые помогли мне избавится от лагов на iOS и Android. Но важно понимать — не все можно решить лишь настройками, очень важна и архитектура приложения, и подготовленные текстуры, и знание более оптимальных алгоритмов.

Что нужно предпринять, чтобы повысить производительность, поднять FPS, снизить CPU?

1. Кешируем все!

Все, что будет использоваться больше одного раза лучше закешировать. Операции типа GameObject.Find() или GetComponent() достаточно ресурсозатратны, а если они вызываются где-нибудь в цикле или в Update (), то производительность может упасть.

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

2. Настройки графики

В Unity есть 6 стандартных пресетов настройки качества графики. Но так как мы говорим про оптимизацию для 2D и для мобильных устройств, то все что выше Simple нет смысла ставить. Конечно, если у вас есть какие-то специфические моменты, частицы, и т. д., то с параметры можно поэкспериментировать найдя оптимальный баланс.

3. Используем FrameRate

По-умолчанию FrameRate равен 30. И зачастую этого бывает достаточно. Но например, при создании UI где есть прокручивающие списки и движущие элементы, может появится дрожание или шлейф. Я это заметил при тестировании на iPhone, поэтому вручную повысил FrameRate. А понижая FrameRate на сценах или игровых меню, где ничего не двигается, можно значительно снизить CPU, а следовательно продлить жизнь батарее устройства. Пользователи не любят когда игра сжирает аккумулятор за час.

4. Атлас текстур

Определенно, нужно упаковывать все свои спрайты в атласы. Для этого есть как встроенный инструмент Sprite Packer, так и продвинутый TexturePacker. Для работы встроенного упаковщика, достаточно задавать теги в настройках импорта, объединяя текстуры и спрайты по смыслу и месту использования.

Таким образом уменьшается количество вызовов отрисовок ваших спрайтов. Проверить как идет отрисовка можно с помощью встроенного инструмента Frame Debugger.

5. Используем пул объектов

GameObject.Instantiate () — очень дорогая операция! Если есть возможность не использовать ее в процессе игры — не используйте. Для большого количества однотипных объектов надо использовать пул объектов. Один раз инициализировав определенное количество, например пуль, они будут использоваться снова и снова, вместо создания и уничтожения каждый раз. Урок по пулу объектов и готовый шаблон, для начала будет достаточно.

6. Меньше Update — больше событий

Метод Update () вызывается каждый кадр, FixedUpdate () в некоторых случаях еще чаще. Если у вас в этих местах происходит много различных проверок и действий, это можно сказаться на производительности. Я использую событийную модель: вместо проверки условия в Update (), когда происходит какое-либо действие, отправляется событие, а в нужном месте это событие «слушается» и обрабатывается в зависимости от переданных параметров. Для этого можно использовать менеджер событий о котором я писал ранее.

7. Выключаем неиспользуемые компоненты

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

8. Настройки билда

Билд под конкретную платформу, тоже можно оптимизировать. Например, если акселерометр не используется в игре, его лучше вообще отключить. Кроме того, я не использую автовыбор графического API, а задаю его сам убирая все остальные, опять же, если вы не используете какие-то специфические функции из OpenGLES 3.0, а так второй версии вполне хватает, она уже давно протестирована. Включаем статичный и динамический батчинг, а для Android многопоточный рендеринг. Для iOS включаем Script Call Optimization в Fast but no Exceptions, но тут момент — если будет какое-то исключение, то игра крашится.

9. Используем Profiler

Не стоит обделять вниманием профайлер. Обязательно протестируйте свою игру и посмотрите, в какие моменты идет максимальная нагрузка. Эти места нужно оптимизировать в первую очередь. Большинство ответов можно найти на stackoverflow.com или форуме Unity, просто загуглив название метода который тратит больше всего ресурсов.

10. Использование материала для UI Image и SpriteRenderer

Если у вас сложный интерфейс и много компонентов, особенно UI Image, то они существенно будут влиять на FPS. Чтобы повысить производительность, улучшить плавность анимаций, можно применить такой хак: там где вы не используете маски, у картинок нужно задать материал Sprites-Default. Если это сделать вместе с маской, то маска не сработает и получите примерно такой варнинг:

Material Sprites-Default doesn’t have _Stencil property

Чтобы убрать эту ошибку нужно немного изменить стандартный шейдер, сделать новый материал и применить его там где есть маска, тогда все сработает. Ссылка на измененный шейдер.
Цена плавности — повышение CPU 🙁

11. Уменьшаем размер текстур

Отличная утилита которая позволяет снизить потребления памяти для текстур до 3х раз. Как это работает и ссылка на Github, в статье на Хабре.

12. Практическое руководство по оптимизации Unity игр

Подойдет как для 2D, так и для 3D. Много полезной информации которую в документации вряд ли найдешь. Тут и про инструменты, и про опыт. Рассказывает специалист по эксплуатации из Unity Technologies — очень интересно. Узнал про memory profiler и то, что Camera.main не закеширована О_О. Обязательно смотреть всем.

13. Используем оптимизированный код

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

14. Используем одинаковые материалы

Если на объектах стоят разные материалы, они не будут батчится и будет больше вызовов отрисовки. Соответственно, нужно по возможности использовать как можно меньше разных шейдеров и материалов. Для понимания, как работает начальная оптимизация графики 2D, на Lynda.com есть небольшой курс.

15. Размеры атласов и спрайтов

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

16. Используйте UI Profiler

В Unity 2017 появился UI Profiler! Крутая штука, теперь можно выяснить почему в интерфейсе много вызовов отрисовки, увидеть какие материалы на объектах и всё это оптимизировать. Особенно актуально, если у вас сложные интерфейсы со множеством элементов, которые например, прокручиваются в ScrollRect.

17. Уголок оптимизатора

На сайте Unity появился специальный раздел посвященный оптимизации — Optimization corner. Там и про UI, и профайлеры, и основные ошибки, в общем, стоит ознакомиться.

18. Несколько советов по оптимизации UI

Раннее уже упоминали про Camera.main, но в новой статье описаны ещё несколько интересных особенностей оптимизации UI.

19. Сборник советов от FunCorp

Хорошая статья про оптимизацию UI. Многое уже описано тут, но есть и замечания по новым компонентам, например TextMeshPro.

20. Оптимизация UI без кода

Статья от Banzai Games про основные способы не делать неправильно Unity UI. Есть и интересные замечания. Зачем только снова про древний текстовый компоненты говорить. Думаю уже все перебрались на TMP.

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

Образование Онлайн
Добавить комментарий