הזזה, סיבוב ושינוי קנה מידה של שדונים

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2020.3.25F1
חבילות מערכת קלט
  • 1.2.0

תנאים מוקדמים לטיפ זה

ההגדרות הבאות מוגדרות מראש כתנאי מוקדם להסבר של עצות אלה.

מזיזים את הספרייט

במשחקים, לעתים קרובות אתה משתמש בבקר כדי להזיז את הדמות שלך. הפעם, אני רוצה להשתמש במקלדת כדי להזיז את הספרייט המוצג על המסך.

אם תשנה את הסקריפט, תוכל להזיז אותו באמצעות לוח משחק בנוסף למקלדת. כל קלט מסוכם בטיפים למערכת הקלט, לכן עיין בו.

מיקום ספרייט

מקם ספרייט אחד בתצוגה. לקבלת הוראות על מיקום שדונים, עיין בעצות הקודמות. לעת עתה, סוג התמונה וגודלה יכולים להיות כל דבר כל עוד היא גלויה בתצוגה.

יש גם טקסט של הסבר הפעולה, אבל זה לא משפיע על פעולה זו.

צור סקריפט המאפשר לך להזיז שדונים באמצעות לוח המקשים

כדי להזיז את ספרייט על ידי פעולת קלט, אתה צריך ליצור סקריפט, אז ליצור סקריפט בפרויקט שלך. השם הוא שרירותי, אבל במקרה SpriteMove זה , הוא .

לאחר שיצרת ופתחת את קובץ ה-script, הזן את הפרטים הבאים: תסריט זה מבוסס על ההנחה שהוא יוצמד לספרייט שיועבר.

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 מתקבל עם . אם תשנה את הקוד כאן, תוכל גם לקבל אותו באמצעות עכבר או gamepad.

אם ברצונך לשנות זאת, עיין בעצות הבאות.

// キーボードの情報を取得
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 הוא הציר שהולך אחורה. לכן, בדו-ממד, אם תכפילו את הסיבוב ביחס לציר Z, הוא יסתובב עם כיוון השעון ונגד כיוון השעון.

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

אגב, ציינתי בשיטה Space.World קודם , Translate אבל אם הדבר לא צוין, כיוון התנועה יסתובב בהתאם לכיוון הסיבוב.

לדוגמה, באיור Space.World שלהלן, צוין, ופעולת התנועה הנכונה מבוצעת עם סיבוב של 45 מעלות.

באיור הבא, Space.World פעולת התנועה הנכונה מבוצעת עם סיבוב של 45° מבלי לציין .

Space.World אם לא תציין בדרך זו, כיוון התנועה ישתנה עם כיוון הסיבוב. זה שימושי ליישום פעולות תלת-ממדיות ומבוקרות רדיו.

עבור קנה מידה, אין שיטה להגדיל או להקטין את קנה המידה ביחס לסולם הנוכחי. localScale בצע חישובים בנכס.

אם פשוט תכפילו את הערך הנוכחי בהגדלה, תוכלו לשנות את קנה המידה שלו בהתאם ללחיצה על המקשים. Vector2 אם תגדיר אותו עם , תוכל להתקרב רק לכיוון X, להתקרב רק לכיוון Y וכו'.

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

לאחר שמירת הסקריפט, צרף אותו לספרייט. שם הספרייט בהיררכיה זהה לשם הקובץ, לכן במידת הצורך, שנה אותו כדי להקל על הבנתו.

לאחר מכן, הפעל את המשחק ובדוק אם הוא עובד עם המקלדת שלך.

אני חושב שזה מספיק כדי להזיז את הספינה שלך במשחק יריות אנכי או אופקי. כמובן, אם אתה מחשב באופן אוטומטי את התנועה של האויב, אתה יכול להזיז אותו עם אותו קוד.