Простой и понятный обзор некоторых из самых мощных инструментов в наборе инструментов разработчика игр.

Одно из самых важных качеств разработчика программного обеспечения — всегда находиться в режиме обучения. Если вы разработчик игр 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? Или, может быть, вы на пути к завершению своей первой инди-игры и не можете сделать следующий шаг? Если да, ознакомьтесь с другими моими статьями о разработке инди-игр и о том, как управлять ею в одиночку или в небольшой команде.