Przesuwanie, obracanie i skalowanie sprite'ów
Ś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.