Найти в Дзене

Space Engineers - первый скрипт управления поршнем

(Демонстрационное видео в конце статьи) В прошлой статье мы подготовили Visual Studio для работы по созданию скриптов. Теперь самое время, чтобы рассмотреть три загадочные функции, которые мы вставили в код класса. Напомню их: namespace Template
{
public sealed class Program : MyGridProgram
{
#region Copy
public Program() { }
public void Main(string argument, UpdateType updateSource) { }
public void Save() { }
#endregion
}
} public Program() Это метод, который выполняется первым, сразу после компиляции скрипта "Программируемым блоком". В нем удобно создавать новые экземпляры классов, устанавливать значения по умолчанию, загружать значения переменных, сохраненные методом Save() и тому подобное. public void Save() Данный метод выполняется последним при остановке скрипта и позволяет сохранить значения необходимых вам переменных, чтобы в будущем загрузить их в методе Program(). Скажу сразу, я не любитель его использования, т.к. предпочитаю хранить данные в поле "Custom data" блоков, разм
Оглавление

(Демонстрационное видео в конце статьи)

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

namespace Template
{
public sealed class Program : MyGridProgram
{
#region Copy

public Program() { }
public void Main(string argument, UpdateType updateSource) { }
public void Save() { }

#endregion
}
}

public Program()

Это метод, который выполняется первым, сразу после компиляции скрипта "Программируемым блоком". В нем удобно создавать новые экземпляры классов, устанавливать значения по умолчанию, загружать значения переменных, сохраненные методом Save() и тому подобное.

public void Save()

Данный метод выполняется последним при остановке скрипта и позволяет сохранить значения необходимых вам переменных, чтобы в будущем загрузить их в методе Program(). Скажу сразу, я не любитель его использования, т.к. предпочитаю хранить данные в поле "Custom data" блоков, размещенных на вашем корабле или станции.

public void Main()

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

Создание тестового мира

Создадим тестовый креативный мир в игре для отработки скриптов. Есть нюансы, о которых не знают новые игроки:

  1. В главном меню игры зайдите в "Настройки" --> "Игра" и установите чекбокс "Экспериментальный режим".
  2. При создании новой игры нажмите кнопку "Расширенные" и установите чекбокс "Внутриигровые скрипты". Без этого не будет работать программируемый блок.

Наконец-то мир загружен. Для теста попробуем запрограммировать работу поршня. Возможно, пригодится на буровой установке. Строим простейший грид: кресло пилота, поршень, батарея и программируемый блок:

Здесь важное уточнение. Существует несколько способов получить ссылку на объект, управляемый скриптом, но в данном примере будем получать по имени. Поэтому проверьте в терминале имя поршня. В моем примере будет просто "Поршень". У вас может быть "Поршень 12", или "Piston" или как-то еще. Поменяйте имя блока в игре на "Поршень", чтобы было меньше проблем.

Сохраняемся и переходим в Visual Studio. Открываем там ранее созданный проект и, наконец-то, пишем код между тегами "region Copy" и "endregion":

// Создаем переменную Piston типа IMyPistonBase
private readonly IMyPistonBase Piston;
public Program()
{
// Получаем ссылку на поршень по имени "Поршень"
Piston = GridTerminalSystem.GetBlockWithName("Поршень") as
IMyPistonBase;
// Устанавливаем лимит задвижения поршня в 0 м. Можно сделать и руками в терминале, но зачем каждый раз проверять настройки?
Piston.MinLimit = 0;
// Лимит выдвижения поршня ставим на максимум: 10 м
Piston.MaxLimit = 10;
// Принудительно задвигаем поршень со скоростью 5 м/с. Отрицательное значение - задвижение поршня, положительное - выдвижение
Piston.Velocity = -5;
}
public void Main(string argument, UpdateType updateSource)
{
switch (updateSource)
{
case UpdateType.Trigger:
// Меняем скорость поршня на противоположную, т.е. выдвигаем/задвигаем
Piston.Velocity = -Piston.Velocity;
break;
}
}

Обратите внимание, я удалил метод Save(), т.к. не буду его использовать.

В игровом терминале находим "Программируемый блок", нажимаем кнопку "Редактировать". В открывшемся окне удаляем весь код и вставляем наш. Жмем "Проверить код", затем "ОК".

В коде скрипта я использовал switch-case. В конкретной ситуации это лишнее, но будет заделом на будущее. Внутри этого блока скрипт проверяет значение параметра updateSource метода Main(). Параметр принимает значение Trigger в ситуации, когда игрок нажимает кнопку в кокпите.

Садимся в кокпит. Вызываем панель инструментов нажатием кнопки G. Ищем наш программируемый блок и перетаскиваем в первую ячейку. Выбираем функцию "Выполнить". Появится окно "Аргумент", в котором капсом пишем "TEST".

-2

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

Нажмите "Confirm" и закройте панель. Теперь, сидя в кокпите вы можете нажимать кнопку "1" и управлять положением поршня. Конечно, сейчас это ни чем не отличается от метода "Реверс", но в следующей статье добавим в скрипт простейшую автоматизацию.

#csharp #spaceengineers