Перемещение, поворот и масштабирование спрайтов
Проверочная среда
- Виндоус
-
- 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;
}
После того, как вы сохранили сценарий, прикрепите его к спрайту. Имя спрайта в иерархии совпадает с именем файла, поэтому при необходимости измените его, чтобы было проще понять.
После этого запустите игру и посмотрите, работает ли она с вашей клавиатурой.
Я думаю, что этого достаточно для перемещения вашего корабля в вертикальной или горизонтальной стрелялке. Конечно, если вы автоматически просчитываете движение противника, вы можете перемещать его с помощью того же кода.