Sprite'ları taşıma, döndürme ve ölçeklendirme

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • pencereler 11
Unity Düzenleyicisi
  • 2020.3.25f1
Giriş Sistemi Paketleri
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipuçlarının açıklanması için bir önkoşul olarak önceden yapılandırılmıştır.

Sprite'ı hareket ettirme

Oyunlarda, karakterinizi hareket ettirmek için genellikle bir denetleyici kullanırsınız. Bu sefer, ekranda görüntülenen hareketli grafiği hareket ettirmek için klavyeyi kullanmak istiyorum.

Komut dosyasını değiştirirseniz, klavyeye ek olarak bir gamepad ile taşıyabilirsiniz. Her giriş, Giriş sistemi için ipuçları bölümünde özetlenmiştir, bu nedenle lütfen buna bakın.

Sprite Yerleşimi

Görünüme bir hareketli grafik yerleştirin. Sprite yerleştirmeyle ilgili talimatlar için önceki ipuçlarına bakın. Şimdilik, görüntünün türü ve boyutu, görünümde göründüğü sürece herhangi bir şey olabilir.

Operasyon açıklamasının bir metni de vardır, ancak bu operasyonu etkilemez.

Sprite'ları klavyeyle taşımanıza izin veren bir komut dosyası oluşturun

Sprite'ı giriş işlemiyle taşımak için bir komut dosyası oluşturmanız gerekir, bu nedenle projenizde bir komut dosyası oluşturun. İsim keyfidir, ancak bu durumda SpriteMove .

Komut dosyasını oluşturup açtıktan sonra aşağıdakileri girin: Bu komut dosyası, taşınacak hareketli görüntüye ekleneceği varsayımına dayanır.

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

Sprite'ı düzenli olarak hareket ettirmek Update için, işlemi bir yöntemde tanımlamanız gerekir. FixedUpdate Bu durumda, onu orada oluşturduk ve açıkladık.

Ayrıntıları başka bir zaman ayrıntılı olarak açıklayacağım, ancakUpdate bir yöntemin saniyede kaç kez çağrıldığı, çalıştığı ortama bağlıdır. Bu nedenle, hareket hızı yürütme ortamına bağlı olarak değişebilir. FixedUpdate Yöntemin saniyede kaç kez çağrıldığı ayar değeri tarafından belirlenir, böylece hareketli grafiği herhangi bir ortamda aynı hızda hareket ettirebilirsiniz.

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

Bu sefer Keyboard.current klavye ile çalıştırılacağı varsayıldığı için klavye bilgileri ile elde edilir. Buradaki kodu değiştirirseniz, fare veya gamepad ile de alabilirsiniz.

Değiştirmek isterseniz, lütfen aşağıdaki ipuçlarına bakın.

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

SpriteMove Devraldığınız sınıf, iliştirdiğiniz nesne MonoBehaviour hakkında bilgi içerir. transform Özelliklere eriştiğinizde, örneğin nesnenin konumunu değiştirebilirsiniz.

Transform.Translate Nesnenin konumunu geçerli konumundan taşımak için bir yöntem çağırabilirsiniz. X ve Y koordinatları sırasıyla imleç tuşlarına göre hareket ettirilir.

Space.World , aşağıda açıklanan döndürmeden etkilenmeden hareket edebilirsiniz.

// スプライトの移動処理
// 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 Bir nesneyi geçerli durumundan döndürmek için bir yöntem çağırabilirsiniz. Bağımsız değişken, belirtilen eksene göre dönme miktarıdır. X ekseni sol ve sağ eksendir, Y ekseni yukarı ve aşağı eksendir ve Z ekseni geriye doğru giden eksendir. Bu nedenle, 2B'de, dönüşü Z eksenine göre çarparsanız, saat yönünde ve saat yönünün tersine dönecektir.

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

Bu arada, yöntemde Space.World daha önce Translate belirtmiştim, ancak Bu belirtilmezse, hareket yönü dönüş yönüne göre dönecektir.

Örneğin, aşağıdaki şekilde Space.World , belirtilmiş ve 45°'lik bir dönüş ile doğru hareket işlemi gerçekleştirilmiştir.

Aşağıdaki şekilde, Space.World belirtilmeden 45° dönüş ile doğru hareket işlemi gerçekleştirilmiştir.

Space.World Bu şekilde belirtmezseniz, hareketin yönü döndürdüğünüz yöne göre değişir. Bu, 3D ve radyo kontrollü işlemleri uygulamak için kullanışlıdır.

Ölçeklendirme için, ölçeği geçerli ölçeğe göre artırma veya azaltma yöntemi yoktur. localScale Özellik üzerinde hesaplamalar yapın.

Mevcut değeri bir büyütme ile çarparsanız, tuşa basmaya göre ölçeklendirebilirsiniz. Vector2 ile ayarlarsanız, yalnızca X yönünü yakınlaştırabilir, yalnızca Y yönünü yakınlaştırabilirsiniz, vb.

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

Komut dosyanızı kaydettikten sonra, hareketli grafiğinize ekleyin. Hiyerarşideki hareketli grafiğin adı dosya adıyla aynıdır, bu nedenle gerekirse daha kolay anlaşılır hale getirmek için değiştirin.

Bundan sonra oyunu çalıştırın ve klavyenizle çalışıp çalışmadığına bakın.

Dikey veya yatay bir atış oyununda geminizi hareket ettirmek için bunun yeterli olduğunu düşünüyorum. Tabii ki, düşmanın hareketini otomatik olarak hesaplarsanız, aynı kodla hareket ettirebilirsiniz.