Presúvanie, otáčanie a zmena mierky zložených položiek

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupné systémové balíky
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia sú vopred nakonfigurované ako predpoklad na vysvetlenie týchto tipov.

Pohyb sprite

V hrách často používate ovládač na pohyb svojej postavy. Tentokrát by som chcel použiť klávesnicu na pohyb sprite zobrazeného na obrazovke.

Ak skript zmeníte, môžete ho okrem klávesnice presúvať aj pomocou gamepadu. Každý vstup je zhrnutý v Tipoch pre vstupný systém, preto si ho prosím prečítajte.

Umiestnenie šprota

Umiestnite jeden sprit do pohľadu. Pokyny na umiestnenie spritov nájdete v predchádzajúcich tipoch. V súčasnosti môže byť typ a veľkosť obrázka čokoľvek, pokiaľ je viditeľný na pohľade.

Existuje aj text vysvetlenia operácie, ale nemá to vplyv na túto operáciu.

Vytvorte skript, ktorý vám umožní presúvať zložené položky pomocou klávesnice

Ak chcete presunúť sprite vstupnou operáciou, musíte vytvoriť skript, takže vytvorte skript vo vašom projekte. Názov je ľubovoľný, ale v tomto prípade SpriteMove je to .

Po vytvorení a otvorení skriptu zadajte nasledovné: Tento skript je založený na predpoklade, že bude pripojený k sprite, ktorý sa má presunúť.

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

Ak chcete Update sprite pravidelne presúvať, musíte tento proces opísať metódou. FixedUpdate V tomto prípade sme to tam vytvorili a popísali.

Podrobnosti podrobne vysvetlím inokedy, aleUpdate počet vyvolaní metódy za sekundu závisí od prostredia, v ktorom beží. Preto sa rýchlosť pohybu môže meniť v závislosti od prostredia vykonávania. FixedUpdate Počet vyvolaní metódy za sekundu je určený hodnotou nastavenia, takže sprite môžete pohybovať rovnakou rýchlosťou v akomkoľvek prostredí.

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

Keďže sa predpokladá, že tentoraz sa bude ovládať pomocou klávesnice, informácie o klávesnici sa získavajú Keyboard.current pomocou . Ak tu zmeníte kód, môžete ho získať aj pomocou myši alebo gamepadu.

Ak ho chcete zmeniť, pozrite si nasledujúce tipy.

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

SpriteMove Trieda, z ktorej dedíte, obsahuje informácie o objekte, ku ktorému pripájate MonoBehaviour . transform Keď pristupujete k vlastnostiam, môžete napríklad manipulovať s umiestnením objektu.

Transform.Translate Môžete zavolať metódu na presunutie polohy objektu z jeho aktuálnej polohy. Súradnice X a Y sa pohybujú podľa klávesov kurzora.

Space.World , môžete sa pohybovať bez toho, aby vás ovplyvnila rotácia opísaná nižšie.

// スプライトの移動処理
// 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 Môžete zavolať metódu na otočenie objektu z jeho aktuálneho stavu. Argument je veľkosť otáčania vzhľadom na zadanú os. Os X je ľavá a pravá os, os Y je os nahor a nadol a os Z je os, ktorá ide dozadu. Preto v 2D, ak vynásobíte rotáciu vzhľadom na os Z, bude sa otáčať v smere a proti smeru hodinových ručičiek.

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

Mimochodom, v metóde som špecifikoval Space.World skôr Translate , ale Ak to nie je špecifikované, smer pohybu sa bude otáčať podľa smeru otáčania.

Napríklad na obrázku Space.World nižšie je špecifikovaný a správna pohybová operácia sa vykonáva otočením o 45 °.

Na nasledujúcom obrázku Space.World sa správna pohybová operácia vykonáva s otočením o 45° bez špecifikácie .

Space.World Ak týmto spôsobom neurčíte, smer pohybu sa zmení so smerom, v ktorom sa otáčate. To je užitočné pre implementáciu 3D a rádiom riadených operácií.

Pre škálovanie neexistuje žiadna metóda na zvýšenie alebo zmenšenie stupnice vzhľadom na aktuálnu stupnicu. localScale Vykonajte výpočty na vlastnosti.

Ak jednoducho vynásobíte aktuálnu hodnotu zväčšením, môžete ju zmeniť podľa stlačenia klávesu. Vector2 Ak ho nastavíte pomocou , môžete priblížiť iba v smere X, priblížiť iba v smere Y atď.

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

Po uložení skriptu ho pripojte k sprite. Názov sprite v hierarchii je rovnaký ako názov súboru, takže ak je to potrebné, zmeňte ho, aby bol zrozumiteľnejší.

Potom spustite hru a zistite, či funguje s klávesnicou.

Myslím si, že to stačí na pohyb vašej lode vo vertikálnej alebo horizontálnej strieľačke. Samozrejme, ak automaticky vypočítate pohyb nepriateľa, môžete ho presunúť rovnakým kódom.