Verplaatsen, roteren en schalen van sprites

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatie omgeving

Ramen
  • Vensters 11
Unity-editor
  • 2020.3.25f1
Pakketten met invoersystemen
  • 1.2.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf geconfigureerd als voorwaarde voor de uitleg van deze tips.

De sprite verplaatsen

In games gebruik je vaak een controller om je personage te bewegen. Deze keer wil ik het toetsenbord gebruiken om de sprite die op het scherm wordt weergegeven te verplaatsen.

Als u het script wijzigt, kunt u het naast het toetsenbord ook met een gamepad verplaatsen. Elke invoer wordt samengevat in Tips voor het invoersysteem, dus raadpleeg deze.

Sprite-plaatsing

Plaats één sprite in de weergave. Voor instructies over het plaatsen van sprites, zie de vorige tips. Voorlopig kan het type en de grootte van de afbeelding van alles zijn, zolang deze maar zichtbaar is op de weergave.

Er is ook een tekst van de uitleg van de operatie, maar deze heeft geen invloed op deze operatie.

Maak een script waarmee je sprites kunt verplaatsen met het toetsenbord

Om de sprite te verplaatsen door middel van invoerbewerking, moet u een script maken, dus maak een script in uw project. De naam is willekeurig, maar in dit geval SpriteMove is het .

Nadat u het script hebt gemaakt en geopend, voert u het volgende in: Dit script is gebaseerd op de veronderstelling dat het wordt gekoppeld aan de te verplaatsen sprite.

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

Om de sprite regelmatig te Update verplaatsen, moet je het proces in een methode beschrijven. FixedUpdate In dit geval hebben we het daar gemaakt en beschreven.

Ik zal de details een andere keer in detail uitleggen, maarUpdate het aantal keren dat een methode per seconde wordt aangeroepen, hangt af van de omgeving waarin deze wordt uitgevoerd. Daarom kan de bewegingssnelheid veranderen afhankelijk van de uitvoeringsomgeving. FixedUpdate Het aantal keren dat de methode per seconde wordt aangeroepen, wordt bepaald door de instelwaarde, zodat je de sprite in elke omgeving met dezelfde snelheid kunt verplaatsen.

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

Aangezien wordt aangenomen dat het deze keer met het toetsenbord zal worden bediend, wordt de Keyboard.current toetsenbordinformatie verkregen met . Als je de code hier wijzigt, kun je deze ook met een muis of gamepad krijgen.

Als u dit wilt wijzigen, raadpleeg dan de volgende tips.

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

SpriteMove De klasse waarvan u erft, bevat informatie over het object waaraan u MonoBehaviour koppelt. transform Wanneer u eigenschappen opent, kunt u bijvoorbeeld de locatie van het object manipuleren.

Transform.Translate U kunt een methode aanroepen om de positie van het object van de huidige positie te verplaatsen. De X- en Y-coördinaten worden respectievelijk verplaatst volgens de cursortoetsen.

Space.World , kunt u bewegen zonder te worden beïnvloed door de hieronder beschreven rotatie.

// スプライトの移動処理
// 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 U kunt een methode aanroepen om een object te roteren vanuit de huidige staat. Het argument is de hoeveelheid rotatie ten opzichte van de opgegeven as. De X-as is de linker- en rechteras, de Y-as is de op- en omlaag-as en de Z-as is de as die achteruit gaat. Daarom, in 2D, als je de rotatie vermenigvuldigt ten opzichte van de Z-as, zal deze met de klok mee en tegen de klok in draaien.

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

Trouwens, ik heb eerder Translate in de Space.World methode gespecificeerd, maar Als dit niet is gespecificeerd, zal de bewegingsrichting roteren volgens de draairichting.

In de onderstaande afbeelding Space.World wordt bijvoorbeeld gespecificeerd en wordt de juiste bewegingsbewerking uitgevoerd met een rotatie van 45°.

In de volgende afbeelding Space.World wordt de juiste bewegingsbewerking uitgevoerd met een rotatie van 45° zonder specificatie .

Space.World Als u niet op deze manier specificeert, verandert de bewegingsrichting met de richting waarin u draait. Dit is handig voor het uitvoeren van 3D- en radiogestuurde operaties.

Voor schaalvergroting is er geen methode om de schaal te vergroten of te verkleinen ten opzichte van de huidige schaal. localScale Voer berekeningen uit op het onroerend goed.

Als u de huidige waarde eenvoudig vermenigvuldigt met een vergroting, kunt u deze schalen op basis van de toetsaanslag. Vector2 Als u het instelt met , kunt u alleen inzoomen op de X-richting, alleen inzoomen op de Y-richting, enz.

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

Zodra je je script hebt opgeslagen, voeg je het toe aan je sprite. De naam van de sprite in de hiërarchie is hetzelfde als de bestandsnaam, dus wijzig deze indien nodig om het begrijpelijker te maken.

Start daarna het spel en kijk of het werkt met je toetsenbord.

Ik denk dat dit genoeg is om je schip te verplaatsen in een verticaal of horizontaal schietspel. Natuurlijk, als je automatisch de beweging van de vijand berekent, kun je deze met dezelfde code verplaatsen.