स्प्रिट्स को स्थानांतरित करें, घुमाएं और स्केल करें

पेज अद्यतन :
पेज निर्माण की तारीख :

सत्यापन वातावरण

विंडोज़
  • विंडोज 11
एकता संपादक
  • 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 आप ऑब्जेक्ट की स्थिति को उसकी वर्तमान स्थिति से स्थानांतरित करने के लिए एक विधि कह सकते हैं। एक्स और वाई निर्देशांक क्रमशः कर्सर कुंजियों के अनुसार स्थानांतरित किए जाते हैं।

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 आप किसी ऑब्जेक्ट को उसकी वर्तमान स्थिति से घुमाने के लिए एक विधि कह सकते हैं। तर्क निर्दिष्ट अक्ष के संबंध में घूर्णन की मात्रा है। एक्स अक्ष बाएं और दाएं अक्ष है, वाई अक्ष ऊपर और नीचे अक्ष है, और जेड अक्ष वह अक्ष है जो पीछे की ओर जाता है। इसलिए, 2 डी में, यदि आप जेड अक्ष के संबंध में घूर्णन को गुणा करते हैं, तो यह घड़ी के अनुसार और प्रतिघड़ी में घूमेगा।

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

वैसे, मैंने पहले विधि में निर्दिष्ट किया था Space.World Translate , लेकिन यदि यह निर्दिष्ट नहीं है, तो आंदोलन की दिशा रोटेशन दिशा के अनुसार घूमेगी।

उदाहरण के लिए, नीचे दिए गए आंकड़े Space.World में, निर्दिष्ट किया गया है, और सही आंदोलन ऑपरेशन 45 ° रोटेशन के साथ किया जाता है।

निम्नलिखित चित्र में, Space.World सही आंदोलन ऑपरेशन निर्दिष्ट किए बिना 45 ° रोटेशन के साथ किया जाता है।

Space.World यदि आप इस तरह से निर्दिष्ट नहीं करते हैं, तो आंदोलन की दिशा उस दिशा के साथ बदल जाती है जिसमें आप घूमते हैं। यह 3 डी और रेडियो-नियंत्रित संचालन को लागू करने के लिए उपयोगी है।

स्केलिंग के लिए, वर्तमान पैमाने के संबंध में पैमाने को बढ़ाने या घटाने की कोई विधि नहीं है। localScale गुण पर गणना करें।

यदि आप वर्तमान मान को केवल आवर्धन से गुणा करते हैं, तो आप इसे कुंजी प्रेस के अनुसार स्केल कर सकते हैं। Vector2 यदि आप इसे सेट करते हैं, तो आप केवल एक्स दिशा में ज़ूम कर सकते हैं, केवल वाई दिशा में ज़ूम कर सकते हैं, आदि।

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

एक बार जब आप अपनी स्क्रिप्ट सहेज लेते हैं, तो इसे अपने स्प्राइट से संलग्न करें। पदानुक्रम में स्प्राइट का नाम फ़ाइल नाम के समान है, इसलिए यदि आवश्यक हो, तो इसे समझना आसान बनाने के लिए इसे बदलें।

उसके बाद, गेम चलाएं और देखें कि यह आपके कीबोर्ड के साथ काम करता है या नहीं।

मुझे लगता है कि यह आपके जहाज को ऊर्ध्वाधर या क्षैतिज शूटिंग गेम में स्थानांतरित करने के लिए पर्याप्त है। बेशक, यदि आप स्वचालित रूप से दुश्मन के आंदोलन की गणना करते हैं, तो आप इसे उसी कोड के साथ स्थानांतरित कर सकते हैं।