Простой и понятный обзор некоторых из самых мощных инструментов в наборе инструментов разработчика игр.
Одно из самых важных качеств разработчика программного обеспечения — всегда находиться в режиме обучения. Если вы разработчик игр Unity C#, это верно как никогда, поскольку Unity регулярно выпускает новые версии с множеством дополнительных инструментов и пакетов в пользовательском интерфейсе редактора Unity. Изучение новых профессий и умение быть гибким – это навыки, необходимые для самой концепции разработчика игр, особенно индивидуального разработчика.
Лямбда-выражения и делегаты в Unity C# считаются промежуточными по сложности; если у вас за плечами несколько месяцев или год опыта, это пойдет вам на пользу. Если вы наткнулись на эту статью, чтобы понять, что такое делегаты и лямбда-выражения и как их использовать в своем игровом проекте, то читайте дальше, чтобы получить нужную вам информацию!
Определения
делегат — это, по сути, ссылочный указатель на метод, который можно использовать в качестве переменной или параметра в вашем коде. Вы можете присвоить значение делегату и изменить его во время выполнения. Как вы можете себе представить, у таких вещей есть множество применений, и они могут пригодиться в самых разных сценариях. Кроме того, у вас может быть несколько методов, ссылающихся на один и тот же делегат (называемый многоадресными делегатами), поэтому при вызове делегата у него будет несколько называются методы.
Давайте обсудим некоторые подходящие варианты использования делегатов в Unity. Для этого я ввожу понятие События. Событие — это специализированный тип делегата, который позволяет вам оповещать другие классы, когда что-то происходит. Допустим, у нас есть метод OnKeyPress, которому мы хотим быть делегатом. Мы можем записать это следующим образом:
using UnityEngine; using System.Collections;
public
class
KeyPressHandler : MonoBehaviour { public
delegate void KeyPressDelegate (); public
static
event KeyPressDelegate onKeyPressDelegate;
public
void OnKeyPress(){ onKeyPressDelegate(); } }
Теперь, чтобы назначить методы, которые будут выполняться при вызове делегата, мы назначаем их следующим образом.
onKeyPressDelegate += FooBar;
Где FooBar
— это метод, который вы определяете для выполнения делегата. Это так просто — и вы можете применить это к любой части вашего проекта, где вы хотите, чтобы события обрабатывались!
Лямбда-выражения
Лямбда-методы (или анонимные) методы тесно связаны с делегатами, и их разделяют лишь некоторые мелкие детали. Лямбда-метод — это автономный, анонимно определенный встроенный метод. Если вы занимаетесь программированием какое-то время, вы наверняка сталкивались с ними в тот или иной момент:
var AddNumbers = (a, b) => a + b;
Обозначение стрелки распространено в JavaScript и других языках. Вышеупомянутый метод очень просто определяет сложение двух чисел. Теперь рассмотрите возможность определения лямбда-методас использованием типа ключевого слова delegate.
delegate void MathematicOperation(int a, int b); MathematicOperation addition = delegate (int a, int b) { print(a + b); }; addition(3, 4); // will print: 7
Хотя это может быть или не быть методом, который вы хотели бы использовать, делегаты и лямбда-методы тесно взаимодействуют.
Общие применения лямбда-выражений в Unity
Вернемся к разговору о создании игр. Существует множество вариантов использования делегатов и лямбда-выражений в разработке игр:
- Обратные вызовы анимации. У каждого уважающего себя механизма анимации есть перехватчики как минимум для OnStart, OnUpdate и OnComplete. Типичный пример ниже с участием DOTween:
myTween.OnStart( () => { print("tween started!"); }).OnComplete(() => { print("tween complete"); });
- Слушатели кнопок. Добавление и удаление методов из делегата во время выполнения — обычное дело в большинстве игр. Вы, возможно, видели, что это принимает различные формы, как показано ниже для обратного вызова прослушивателя кнопки:
myButton.onClick.AddListener(() => { print("I just pressed a button!"); });
- System.Linq: LINQ или Langauge-Integrated Query — это пакет запросов платформы .NET, который обычно используется для упрощения, компактности и удобочитаемости работы с коллекциями. В приведенном ниже примере будет выбран объект с самым низким уровнем работоспособности, например:
var lowestHealthEnemy = enemies.MinBy(enemy => enemy.health);
- Ответы API. Запросы/ответы API по своей природе асинхронны — они могут возвращать ваши данные через 100 миллисекунд или 5000. Если вы не дождетесь завершения их выполнения с Задача, затем выполнение с продолжением без надлежащего захвата результата. Вот пример с
ContinueWith
, функцией для захвата результата:
Task<string> task = Task.Run(() => Foobar()); task.ContinueWith( (task, result) => { print(result); });
Вывод
Создание надежной основы знаний C# улучшит ваши проекты по разработке игр и даст вам возможность разветвляться на новые языки и платформы. Теперь, когда у вас есть базовое представление о делегатах и лямбда-выражениях, постарайтесь включить их в свой проект, когда возникнет необходимость!
Вы заинтересованы в создании игр с Unity? Или, может быть, вы на пути к завершению своей первой инди-игры и не можете сделать следующий шаг? Если да, ознакомьтесь с другими моими статьями о разработке инди-игр и о том, как управлять ею в одиночку или в небольшой команде.
- 💰 Как заработать деньги в качестве инди-разработчика игр
- 📚 5 лучших концепций разработки игр на Unity, которые нужно запомнить как можно скорее
- ☁️ Пять причин, почему вы не сделали игру своей мечты
- 📊 Как сделать полоски здоровья в Unity от начального до продвинутого уровня
- 🤵 Почему вы можете положиться на разработку игр как на подработку в 2021 году
- 👆 Десять приемов Unity и C#, которые ускорят разработку вашей игры