Presúvanie, otáčanie a zmena mierky zložených položiek
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.