Перемещение, поворот и масштабирование спрайтов

Страница обновлена :
Дата создания страницы :

Проверочная среда

Виндоус
  • Windows 11
Редактор Unity
  • 2020.3.25f1
Системные пакеты ввода
  • 1.2.0

Необходимые условия для получения этого совета

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

Перемещение спрайта

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

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

Размещение спрайтов

Поместите один спрайт в представление. Инструкции по размещению спрайтов см. в предыдущих советах. В настоящее время тип и размер изображения могут быть любыми, если оно видно на виду.

Также есть текст пояснения к операции, но он не влияет на эту операцию.

Создайте скрипт, позволяющий перемещать спрайты с помощью клавиатуры

Для того, чтобы переместить спрайт по операции ввода, вам нужно создать скрипт, поэтому создайте скрипт в своем проекте. Название произвольное, но в данном случае SpriteMove это .

После того, как вы создали и открыли сценарий, введите следующее: Этот скрипт основан на предположении, что он будет прикреплен к перемещаемому спрайту.

using UnityEngine;
using UnityEngine.InputSystem;  // 追加

public class SpriteMove : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }

    // スプライトの回転処理
    // Rotate メソッドでスプライトが回転します
    if (keyboard.spaceKey.isPressed)
    {
      transform.Rotate(0, 0, 5f);
    }

    // スプライトの拡大縮小
    // メソッドはないので localScale プロパティに倍率をかけます
    if (keyboard.aKey.isPressed)
    {
      transform.localScale *= 1.02f;
    }
    if (keyboard.zKey.isPressed)
    {
      transform.localScale /= 1.02f;
    }
  }
}

Для того, чтобы перемещать Update спрайт на регулярной основе, необходимо описать процесс в методе. FixedUpdate В данном случае мы создали и описали его там.

Я подробно объясню детали в другой раз, ноUpdate количество вызовов метода в секунду зависит от среды, в которой он выполняется. Поэтому скорость движения может меняться в зависимости от среды выполнения. FixedUpdate Количество вызовов метода в секунду определяется значением параметра, поэтому спрайт можно перемещать с одинаковой скоростью в любой среде.

public class SpriteMove : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // :
  }
}

Поскольку предполагается, что на этот раз он будет работать с клавиатурой, Keyboard.current информация о клавиатуре получается с помощью . Если вы измените код здесь, вы также можете получить его с помощью мыши или геймпада.

Если вы хотите изменить его, воспользуйтесь следующими советами.

// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
  Debug.Log("キーボードがありません。");
  return;
}

SpriteMove Класс, от которого выполняется наследование, содержит сведения об объекте, к которому выполняется MonoBehaviour присоединение. transform При доступе к свойствам можно, например, управлять расположением объекта.

Transform.Translate Можно вызвать метод для перемещения положения объекта из его текущего положения. Координаты X и Y перемещаются в соответствии с клавишами курсора соответственно.

Space.World , вы можете перемещаться, не подвергаясь влиянию вращения, описанного ниже.

// スプライトの移動処理
// Translate メソッドでスプライトの位置が移動します
// Space.World を指定すると回転の影響をうけません
if (keyboard.leftArrowKey.isPressed)
{
  transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
  transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
  transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
  transform.Translate(0, -0.1f, 0, Space.World);
}

Transform.Rotate Можно вызвать метод для поворота объекта из его текущего состояния. Аргументом является величина поворота относительно указанной оси. Ось X — это левая и правая оси, ось Y — это ось вверх и вниз, а ось Z — это ось, идущая назад. Поэтому в 2D, если умножить вращение относительно оси Z, оно будет вращаться по часовой стрелке и против часовой стрелки.

// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
  transform.Rotate(0, 0, 5f);
}

Кстати, я указал в методе Space.World ранее Translate , но Если это не указано, направление движения будет вращаться в соответствии с направлением вращения.

Например, на рисунке Space.World ниже указана операция правого перемещения с поворотом на 45°.

На следующем рисунке Space.World операция движения вправо выполняется с поворотом на 45° без указания .

Space.World Если этот способ не указан, направление движения изменяется в зависимости от направления вращения. Это полезно для реализации 3D и радиоуправляемых операций.

Для масштабирования не существует метода увеличения или уменьшения масштаба по отношению к текущему масштабу. localScale Выполните расчеты на объекте.

Если вы просто умножите текущее значение на увеличение, вы можете масштабировать его в соответствии с нажатием клавиши. Vector2 Если вы установите его с помощью , вы можете увеличивать масштаб только в направлении X, увеличивать только в направлении Y и т. д.

// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
  transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
  transform.localScale /= 1.02f;
}

После того, как вы сохранили сценарий, прикрепите его к спрайту. Имя спрайта в иерархии совпадает с именем файла, поэтому при необходимости измените его, чтобы было проще понять.

После этого запустите игру и посмотрите, работает ли она с вашей клавиатурой.

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