نقل الكائنات وتدويرها وقياسها

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 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;
}

بمجرد حفظ النص البرمجي الخاص بك، قم بإرفاقه بالكائن الخاص بك. اسم الكائن في التسلسل الهيكلي هو نفس اسم الملف، لذا إذا لزم الأمر، قم بتغييره لتسهيل فهمه.

بعد ذلك ، قم بتشغيل اللعبة ومعرفة ما إذا كانت تعمل مع لوحة المفاتيح.

أعتقد أن هذا يكفي لتحريك سفينتك في لعبة إطلاق نار رأسية أو أفقية. بالطبع ، إذا قمت بحساب حركة العدو تلقائيا ، فيمكنك تحريكها بنفس الرمز.