Переміщення, обертання та масштабування спрайтів
Середовище верифікації
- Вікна
-
- Вікна 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;
}
Після того, як ви зберегли сценарій, прикріпіть його до спрайту. Ім'я спрайту в ієрархії збігається з ім'ям файлу, тому при необхідності змініть його, щоб було простіше зрозуміти.
Після цього запустіть гру і подивіться, чи працює вона з вашою клавіатурою.
Думаю, цього достатньо для переміщення вашого корабля у вертикальній або горизонтальній стрілялці. Звичайно, якщо автоматично обчислити рух противника, то можна переміщати його за допомогою того ж коду.