Flytta, rotera och skala sprites
Miljö för verifiering
- Windows
-
- Windows 11 (på engelska)
- Unity-redigeraren
-
- 2020.3.25f1
- Paket för indatasystem
-
- 1.2.0
Förutsättningar för det här tipset
Följande inställningar är förkonfigurerade som en förutsättning för förklaringen av dessa tips.
Flytta sprajten
I spel använder du ofta en handkontroll för att flytta din karaktär. Den här gången skulle jag vilja använda tangentbordet för att flytta sprajten som visas på skärmen.
Om du ändrar skriptet kan du flytta det med en gamepad utöver tangentbordet. Varje inmatning sammanfattas i Tips för inmatningssystemet, så se den.
Placering av sprite
Placera en sprajt i vyn. Instruktioner om hur du placerar sprites finns i de tidigare tipsen. För närvarande kan bildens typ och storlek vara vad som helst så länge den är synlig på vyn.
Det finns också en text med åtgärdsförklaringen, men den påverkar inte den här åtgärden.
Skapa ett skript som låter dig flytta sprites med tangentbordet
För att kunna flytta spriten genom inmatningsåtgärd måste du skapa ett skript, så skapa ett skript i projektet.
Namnet är godtyckligt, men i det här fallet SpriteMove
är det .
När du har skapat och öppnat skriptet anger du följande: Det här skriptet är baserat på antagandet att det kommer att kopplas till sprajten som ska flyttas.
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;
}
}
}
För att Update
kunna flytta sprajten regelbundet måste du beskriva processen i en metod.
FixedUpdate
I det här fallet har vi skapat och beskrivit det där.
Jag kommer att förklara detaljerna i detalj en annan gång, menUpdate
antalet gånger en metod anropas per sekund beror på miljön där den körs.
Därför kan rörelsehastigheten ändras beroende på körningsmiljön.
FixedUpdate
Hur många gånger metoden anropas per sekund bestäms av inställningsvärdet, så du kan flytta spriten med samma hastighet i alla miljöer.
public class SpriteMove : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// :
}
}
Eftersom det antas att den kommer att användas med tangentbordet den här gången, hämtas tangentbordsinformationen Keyboard.current
med .
Om du ändrar koden här kan du också få den med en mus eller gamepad.
Om du vill ändra det, se följande tips.
// キーボードの情報を取得
var keyboard = Keyboard.current;
if (keyboard == null)
{
Debug.Log("キーボードがありません。");
return;
}
SpriteMove
Klassen som du ärver från innehåller information om det objekt som du MonoBehaviour
kopplar till.
transform
När du öppnar egenskaper kan du till exempel ändra objektets placering.
Transform.Translate
Du kan anropa en metod för att flytta objektets position från dess aktuella position.
X- och Y-koordinaterna flyttas enligt markörtangenterna.
Space.World
kan du röra dig utan att påverkas av rotationen som beskrivs nedan.
// スプライトの移動処理
// 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
Du kan anropa en metod för att rotera ett objekt från dess aktuella läge.
Argumentet är rotationsmängden i förhållande till den angivna axeln. X-axeln är vänster och höger axel, Y-axeln är upp- och nedaxeln och Z-axeln är axeln som går bakåt.
Därför, i 2D, om du multiplicerar rotationen med avseende på Z-axeln, kommer den att rotera medurs och moturs.
// スプライトの回転処理
// Rotate メソッドでスプライトが回転します
if (keyboard.spaceKey.isPressed)
{
transform.Rotate(0, 0, 5f);
}
Förresten, jag specificerade i Space.World
metoden tidigare Translate
, men
Om detta inte anges kommer rörelseriktningen att rotera enligt rotationsriktningen.
Till exempelample, i figuren Space.World
nedan, anges, och den högra rörelseoperationen utförs med en 45° rotation.
I följande bild Space.World
utförs den högra rörelseoperationen med en 45° rotation utan att ange .
Space.World
Om du inte anger på det här sättet ändras rörelseriktningen med den riktning som du roterar i.
Detta är användbart för att implementera 3D- och radiostyrda operationer.
För skalning finns det ingen metod för att öka eller minska skalan i förhållande till den aktuella skalan.
localScale
Utför beräkningar på fastigheten.
Om du bara multiplicerar det aktuella värdet med en förstoring kan du skala det enligt tangenttryckningen.
Vector2
Om du ställer in den med kan du zooma i endast X-riktningen, zooma i endast Y-riktningen osv.
// スプライトの拡大縮小
// メソッドはないので localScale プロパティに倍率をかけます
if (keyboard.aKey.isPressed)
{
transform.localScale *= 1.02f;
}
if (keyboard.zKey.isPressed)
{
transform.localScale /= 1.02f;
}
När du har sparat skriptet bifogar du det till sprajten. Namnet på spriten i hierarkin är samma som filnamnet, så om det behövs kan du ändra det så att det blir lättare att förstå.
Efter det, kör spelet och se om det fungerar med ditt tangentbord.
Jag tror att detta räcker för att flytta ditt skepp i ett vertikalt eller horisontellt skjutspel. Naturligtvis, om du automatiskt beräknar fiendens rörelse, kan du flytta den med samma kod.