Pindah, putar dan skala sprites

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2020.3.25f1
Pakej Sistem Input
  • 1.2.0

Prasyarat untuk petua ini

Tetapan berikut telah diprakonfigurasi sebagai prasyarat untuk penjelasan petua ini.

Menggerakkan sprite

Dalam permainan, anda sering menggunakan pengawal untuk menggerakkan watak anda. Kali ini, saya ingin menggunakan papan kekunci untuk menggerakkan sprite yang dipaparkan pada skrin.

Jika anda menukar skrip, anda boleh mengalihkannya dengan pad permainan sebagai tambahan kepada papan kekunci. Setiap input diringkaskan dalam Petua untuk sistem input, jadi sila rujuk kepadanya.

Penempatan Sprite

Letakkan satu sprite dalam pandangan. Untuk arahan mengenai meletakkan sprites, rujuk petua sebelumnya. Buat masa ini, jenis dan saiz imej boleh menjadi apa-apa selagi ia kelihatan pada pandangan.

Terdapat juga teks penjelasan operasi, tetapi ia tidak menjejaskan operasi ini.

Buat skrip yang membolehkan anda menggerakkan sprites dengan papan kekunci

Untuk menggerakkan sprite dengan operasi input, anda perlu membuat skrip, jadi buat skrip dalam projek anda. Nama itu sewenang-wenangnya, tetapi dalam kes SpriteMove ini , ia adalah .

Sebaik sahaja anda telah mencipta dan membuka skrip, masukkan yang berikut: Skrip ini berdasarkan andaian bahawa ia akan dilampirkan pada sprite yang akan dipindahkan.

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

Update Untuk memindahkan sprite secara teratur, anda perlu menerangkan proses dalam kaedah. FixedUpdate Dalam kes ini, kami telah mencipta dan menerangkannya di sana.

Saya akan menerangkan butiran secara terperinci pada masa lain, tetapiUpdate bilangan kali kaedah dipanggil sesaat bergantung kepada persekitaran di mana ia berjalan. Oleh itu, kelajuan pergerakan mungkin berubah bergantung kepada persekitaran pelaksanaan. FixedUpdate Bilangan kali kaedah dipanggil sesaat ditentukan oleh nilai penetapan, jadi anda boleh menggerakkan sprite pada kelajuan yang sama dalam mana-mana persekitaran.

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

Oleh kerana diandaikan bahawa ia akan dikendalikan dengan papan kekunci kali ini, Keyboard.current maklumat papan kekunci diperoleh dengan . Jika anda menukar kod di sini, anda juga boleh mendapatkannya dengan tetikus atau pad permainan.

Jika anda ingin mengubahnya, sila rujuk petua berikut.

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

SpriteMove Kelas yang anda warisi mengandungi maklumat mengenai objek yang anda MonoBehaviour lampirkan. transform Apabila anda mengakses sifat, anda boleh memanipulasi lokasi objek, sebagai contoh.

Transform.Translate Anda boleh memanggil kaedah untuk memindahkan kedudukan objek dari kedudukan semasanya. Koordinat X dan Y dipindahkan mengikut kekunci kursor, masing-masing.

Space.World , anda boleh bergerak tanpa terjejas oleh putaran yang diterangkan di bawah.

// スプライトの移動処理
// 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 Anda boleh memanggil kaedah untuk memutarkan objek daripada keadaan semasanya. Hujah adalah jumlah putaran berkenaan dengan paksi yang ditentukan. Paksi X ialah paksi kiri dan kanan, paksi Y ialah paksi atas dan bawah, dan paksi Z ialah paksi yang menghala ke belakang. Oleh itu, dalam 2D, jika anda mengalikan putaran berkenaan dengan paksi Z, ia akan berputar mengikut arah jam dan lawan jam.

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

Dengan cara ini, saya nyatakan dalam kaedah yang Space.World lebih awal Translate , tetapi Jika ini tidak dinyatakan, arah pergerakan akan berputar mengikut arah putaran.

Sebagai contoh, dalam gambar Space.World di bawah, ditentukan, dan operasi pergerakan yang betul dilakukan dengan putaran 45°.

Dalam angka berikut, Space.World operasi pergerakan yang betul dilakukan dengan putaran 45° tanpa menyatakan .

Space.World Jika anda tidak menentukan dengan cara ini, arah pergerakan berubah dengan arah di mana anda berputar. Ini berguna untuk melaksanakan operasi 3D dan kawalan radio.

Untuk penskalaan, tidak ada kaedah untuk meningkatkan atau mengurangkan skala berkenaan dengan skala semasa. localScale Lakukan pengiraan ke atas hartanah.

Jika anda hanya mengalikan nilai semasa dengan pembesaran, anda boleh menskalakannya mengikut akhbar utama. Vector2 Jika anda menetapkannya dengan , anda boleh zum masuk hanya arah X, zum masuk hanya arah Y, dsb.

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

Sebaik sahaja anda telah menyimpan skrip anda, lampirkannya pada sprite anda. Nama sprite dalam hierarki adalah sama dengan nama fail, jadi jika perlu, ubahnya untuk menjadikannya lebih mudah difahami.

Selepas itu, jalankan permainan dan lihat sama ada ia berfungsi dengan papan kekunci anda.

Saya rasa ini cukup untuk menggerakkan kapal anda dalam permainan menembak menegak atau mendatar. Sudah tentu, jika anda secara automatik mengira pergerakan musuh, anda boleh memindahkannya dengan kod yang sama.