Sprite'ları taşıma, döndürme ve ölçeklendirme
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.