Przesuwanie, obracanie i skalowanie sprite'ów

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacyjne

Windows
  • Okna 11
Edytor aparatu Unity
  • 2020.3.25f1
Pakiety systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia są wstępnie skonfigurowane jako warunek wstępny wyjaśnienia tych wskazówek.

Przesuwanie duszka

W grach często używasz kontrolera do poruszania swoją postacią. Tym razem chciałbym użyć klawiatury do przesuwania sprite'a wyświetlanego na ekranie.

Jeśli zmienisz skrypt, możesz go przesuwać nie tylko za pomocą klawiatury, ale także gamepada. Każde dane wejściowe są podsumowane w sekcji Wskazówki dotyczące systemu wprowadzania, więc zapoznaj się z nimi.

Rozmieszczenie sprite'ów

Umieść jednego duszka w widoku. Aby uzyskać instrukcje dotyczące umieszczania sprite'ów, zapoznaj się z poprzednimi wskazówkami. Na razie rodzaj i rozmiar obrazu może być dowolny, o ile jest widoczny na widoku.

Istnieje również tekst objaśnienia operacji, ale nie ma to wpływu na tę operację.

Utwórz skrypt, który umożliwia przesuwanie sprite'ów za pomocą klawiatury

Aby przesunąć duszka za pomocą operacji wejściowej, musisz utworzyć skrypt, więc utwórz skrypt w swoim projekcie. Nazwa jest umowna, ale w tym przypadku SpriteMove jest to .

Po utworzeniu i otwarciu skryptu wprowadź następujące informacje: Ten skrypt opiera się na założeniu, że zostanie on dołączony do duszka, który ma zostać przeniesiony.

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;
    }
  }
}

Aby regularnie przesuwać Update duszka, musisz opisać ten proces metodą. FixedUpdate W tym przypadku tam go stworzyliśmy i opisaliśmy.

Szczegóły wyjaśnię szczegółowo innym razem, aleUpdate liczba wywołań metody na sekundę zależy od środowiska, w którym jest uruchomiona. W związku z tym prędkość ruchu może się zmieniać w zależności od środowiska wykonywania. FixedUpdate Liczba wywołań metody na sekundę zależy od wartości ustawienia, dzięki czemu można przesuwać duszka z tą samą szybkością w dowolnym środowisku.

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

Ponieważ zakłada się, że tym razem będzie obsługiwana za pomocą klawiatury, informacje o klawiaturze Keyboard.current uzyskuje się za pomocą . Jeśli zmienisz kod tutaj, możesz go również uzyskać za pomocą myszy lub gamepada.

Jeśli chcesz to zmienić, zapoznaj się z poniższymi wskazówkami.

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

SpriteMove Klasa, po której dziedziczysz, zawiera informacje o obiekcie, do którego dołączasz MonoBehaviour . transform Uzyskując dostęp do właściwości, można na przykład manipulować położeniem obiektu.

Transform.Translate Można wywołać metodę, aby przesunąć położenie obiektu z jego bieżącego położenia. Współrzędne X i Y są przesuwane odpowiednio zgodnie z kursora.

Space.World , możesz poruszać się bez wpływu obrotu opisanego poniżej.

// スプライトの移動処理
// 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 Możesz wywołać metodę, aby obrócić obiekt z jego bieżącego stanu. Argumentem jest wielkość obrotu względem określonej osi. Oś X to lewa i prawa oś, oś Y to oś góra i dół, a oś Z to oś biegnąca do tyłu. Dlatego w 2D, jeśli pomnożysz obrót względem osi Z, obróci się on zgodnie z ruchem wskazówek zegara i przeciwnie do ruchu wskazówek zegara.

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

Nawiasem mówiąc, określiłem w metodzie Space.World wcześniej Translate , ale Jeśli nie zostanie to określone, kierunek ruchu będzie się obracał zgodnie z kierunkiem obrotu.

Na przykład na poniższym rysunku Space.World jest określony, a operacja ruchu w prawo jest wykonywana z obrotem o 45°.

Na poniższym rysunku Space.World wykonywana jest operacja ruchu w prawo z obrotem o 45° bez określania .

Space.World Jeśli nie określisz w ten sposób, kierunek ruchu zmieni się wraz z kierunkiem obrotu. Jest to przydatne do realizacji operacji 3D i sterowanych radiowo.

W przypadku skalowania nie ma metody zwiększania lub zmniejszania skali w odniesieniu do bieżącej skali. localScale Wykonaj obliczenia na nieruchomości.

Jeśli po prostu pomnożysz aktualną wartość przez powiększenie, możesz ją przeskalować zgodnie z naciśnięciem. Vector2 Jeśli ustawisz go za pomocą , możesz powiększać tylko w kierunku X, powiększać tylko w kierunku Y itp.

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

Po zapisaniu skryptu dołącz go do duszka. Nazwa ikonki w hierarchii jest taka sama jak nazwa pliku, więc jeśli to konieczne, zmień ją, aby była łatwiejsza do zrozumienia.

Następnie uruchom grę i sprawdź, czy działa z twoją klawiaturą.

Myślę, że to wystarczy do poruszania statkiem w pionowej lub poziomej strzelance. Oczywiście, jeśli automatycznie obliczysz ruch wroga, możesz go przesunąć za pomocą tego samego kodu.