ย้าย หมุน และปรับขนาดสไปรท์

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2020.3.25f1
แพ็คเกจระบบอินพุต
  • 1.2.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ถูกกําหนดค่าไว้ล่วงหน้าเป็นข้อกําหนดเบื้องต้นสําหรับคําอธิบายของเคล็ดลับเหล่านี้

ย้ายสไปรท์

ในเกมคุณมักจะใช้คอนโทรลเลอร์เพื่อย้ายตัวละครของคุณ คราวนี้ฉันต้องการใช้แป้นพิมพ์เพื่อย้ายสไปรท์ที่แสดงบนหน้าจอ

หากคุณเปลี่ยนสคริปต์คุณสามารถย้ายได้ด้วยเกมแพดนอกเหนือจากแป้นพิมพ์ อินพุตแต่ละรายการสรุปไว้ในเคล็ดลับสําหรับระบบอินพุตดังนั้นโปรดดู

ตําแหน่งสไปรท์

วางสไปรท์หนึ่งอันในมุมมอง สําหรับคําแนะนําในการวางสไปรท์ โปรดดูเคล็ดลับก่อนหน้านี้ ในขณะนี้ประเภทและขนาดของภาพสามารถเป็นอะไรก็ได้ตราบใดที่มองเห็นได้บนมุมมอง

นอกจากนี้ยังมีข้อความของคําอธิบายการดําเนินการ แต่ไม่มีผลต่อการดําเนินการนี้

สร้างสคริปต์ที่ช่วยให้คุณสามารถย้ายสไปรท์ด้วยแป้นพิมพ์

ในการย้ายสไปรท์โดยการดําเนินการป้อนข้อมูลคุณต้องสร้างสคริปต์ดังนั้นสร้างสคริปต์ในโครงการของคุณ ชื่อเป็นโดยพลการ แต่ในกรณีนี้ SpriteMove คือ .

เมื่อคุณสร้างและเปิดสคริปต์แล้วให้ป้อนข้อมูลต่อไปนี้: สคริปต์นี้ตั้งอยู่บนสมมติฐานว่าจะแนบมากับสไปรท์ที่จะย้าย

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 สไปรท์เป็นประจําคุณต้องอธิบายกระบวนการในวิธีการ FixedUpdate ในกรณีนี้เราได้สร้างและอธิบายไว้ที่นั่น

ฉันจะอธิบายรายละเอียดโดยละเอียดอีกครั้ง แต่Update จํานวนครั้งที่เรียกว่าวิธีการต่อวินาทีขึ้นอยู่กับสภาพแวดล้อมที่กําลังทํางานอยู่ ดังนั้นความเร็วในการเคลื่อนที่อาจเปลี่ยนแปลงได้ขึ้นอยู่กับสภาพแวดล้อมการดําเนินการ FixedUpdate จํานวนครั้งที่วิธีการเรียกว่าต่อวินาทีจะถูกกําหนดโดยค่าการตั้งค่าดังนั้นคุณสามารถย้ายสไปรท์ด้วยความเร็วเท่ากันในทุกสภาพแวดล้อม

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

เนื่องจากสันนิษฐานว่าจะดําเนินการกับแป้นพิมพ์ในครั้งนี้ Keyboard.current ข้อมูลแป้นพิมพ์จะได้รับด้วย หากคุณเปลี่ยนรหัสที่นี่คุณสามารถรับได้ด้วยเมาส์หรือเกมแพด

หากคุณต้องการเปลี่ยนโปรดดูเคล็ดลับต่อไปนี้

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

SpriteMove คลาสที่คุณสืบทอดมาจากมีข้อมูลเกี่ยวกับวัตถุที่คุณกําลัง MonoBehaviour แนบ transform เมื่อคุณเข้าถึงคุณสมบัติ คุณสามารถจัดการตําแหน่งของวัตถุได้ เป็นต้น

Transform.Translate คุณสามารถเรียกวิธีการย้ายตําแหน่งของวัตถุจากตําแหน่งปัจจุบัน พิกัด X และ Y จะถูกย้ายตามปุ่มเคอร์เซอร์ตามลําดับ

Space.World คุณสามารถย้ายได้โดยไม่ได้รับผลกระทบจากการหมุนที่อธิบายไว้ด้านล่าง

// スプライトの移動処理
// 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 คุณสามารถเรียกวิธีการหมุนวัตถุจากสถานะปัจจุบันได้ อาร์กิวเมนต์คือจํานวนการหมุนที่เกี่ยวกับแกนที่ระบุ แกน X คือแกนซ้ายและขวาแกน Y คือแกนขึ้นและลงและแกน Z คือแกนที่ถอยหลัง ดังนั้นใน 2D หากคุณคูณการหมุนด้วยความเคารพต่อแกน Z มันจะหมุนตามเข็มนาฬิกาและทวนเข็มนาฬิกา

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

โดยวิธีการที่ฉันระบุไว้ในSpace.Worldวิธีการก่อนหน้านี้ Translate แต่ หากไม่ได้ระบุทิศทางการเคลื่อนที่จะหมุนตามทิศทางการหมุน

ตัวอย่างเช่นในรูป Space.World ด้านล่างมีการระบุและการดําเนินการเคลื่อนไหวที่ถูกต้องจะดําเนินการด้วยการหมุน 45 °

ในรูป Space.World ต่อไปนี้การดําเนินการเคลื่อนไหวที่ถูกต้องจะดําเนินการด้วยการหมุน 45 °โดยไม่ระบุ

Space.Worldหากคุณไม่ได้ระบุด้วยวิธีนี้ทิศทางของการเคลื่อนไหวจะเปลี่ยนไปตามทิศทางที่คุณหมุน สิ่งนี้มีประโยชน์สําหรับการใช้ 3D และการควบคุมด้วยวิทยุ

สําหรับการปรับขนาดไม่มีวิธีการเพิ่มหรือลดสเกลที่เกี่ยวกับมาตราส่วนปัจจุบัน localScale ทําการคํานวณเกี่ยวกับทรัพย์สิน

หากคุณเพียงแค่คูณค่าปัจจุบันด้วยการขยายคุณสามารถปรับขนาดได้ตามการกดปุ่ม Vector2 หากคุณตั้งค่าด้วยคุณสามารถซูมเฉพาะทิศทาง X ซูมในทิศทาง Y เท่านั้น

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

เมื่อคุณบันทึกสคริปต์ของคุณแล้ว ให้แนบสคริปต์นั้นไปกับสไปรท์ของคุณ ชื่อของสไปรท์ในลําดับชั้นจะเหมือนกับชื่อไฟล์ ดังนั้นหากจําเป็น ให้เปลี่ยนเพื่อให้เข้าใจง่ายขึ้น

หลังจากนั้นให้เรียกใช้เกมและดูว่าใช้งานได้กับแป้นพิมพ์ของคุณหรือไม่

ฉันคิดว่านี่เพียงพอสําหรับการเคลื่อนย้ายเรือของคุณในเกมยิงแนวตั้งหรือแนวนอน แน่นอนถ้าคุณคํานวณการเคลื่อนไหวของศัตรูโดยอัตโนมัติคุณสามารถย้ายมันด้วยรหัสเดียวกัน