माउस के साथ काम करना (इनपुट सिस्टम पैकेज संस्करण)

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

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

विंडोज़
  • विंडोज 11
एकता संपादक
  • 2020.3.25f1
इनपुट सिस्टम पैकेज
  • 1.2.0

इस टिप के लिए आवश्यक शर्तें

इस टिप के विवरण के लिए एक आधार के रूप में निम्नलिखित सेटिंग्स पहले से बनाई गई हैं।

माउस की स्थिति प्राप्त करें

गेम स्क्रीन पर माउस की स्थिति में प्राप्त किया जा सकता Mouse.position है। यहां, मैं स्थान की जानकारी प्रदर्शित करना चाहता हूं।

कैनवास पर एक पाठ ऑब्जेक्ट रखता है जो माउस जानकारी प्रदर्शित करता है।

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

स्क्रिप्ट निम्नानुसार दर्ज करें:

using System.Text;              // 追加
using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class MouseInfo : MonoBehaviour
{
  /// <summary>情報を表示するテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  private StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      TextObject.text = "";
      return;
    }

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.currentआप वर्तमान में सक्रिय माउस के बारे में जानकारी प्राप्त कर सकते हैं। Mouse.position माउस की वर्तमान स्थिति है, इसलिए ReadValue आप विधि का उपयोग करके Vector2 प्रपत्र में मान प्राप्त कर सकते हैंVector2Control

अधिग्रहित माउस स्थिति किसी पाठ ऑब्जेक्ट पर सेट है. StringBuilder उपयोग करने के बारे में बहुत अधिक चिंता न करें, क्योंकि यह बाद में जोड़ने के लिए है।

स्क्रिप्ट सहेजने के बाद EventSystem , इसे ऑब्जेक्ट से अनुलग्न करें. पाठ ऑब्जेक्ट के बारे में जानकारी प्रदर्शित करने के लिए पाठ ऑब्जेक्ट पर सेट किया गया है.

गेम चलाने और माउस को स्थानांतरित करने का प्रयास करें। मुझे लगता है कि माउस की स्थिति वास्तविक समय में स्क्रीन पर दिखाई देगी।

वैसे, माउस स्थिति के निर्देशांक गेम स्क्रीन के निचले बाएं कोने में (0, 0) हैं। एक्स अक्ष (बाएं और दाएं) सकारात्मक हो जाता है क्योंकि आप दाईं ओर जाते हैं और जैसे ही आप बाईं ओर जाते हैं, नकारात्मक हो जाता है। जैसे-जैसे आप ऊपर जाते हैं वाई-अक्ष (ऊपर और नीचे) सकारात्मक हो जाता है और नीचे जाने पर नकारात्मक हो जाता है। इसलिए, प्रत्येक अक्ष का अधिकतम मान गेम स्क्रीन के ऊपरी दाएं कोने में है।

इसके अलावा, कृपया ध्यान दें कि यह निर्देशांक केवल गेम स्क्रीन स्पेस के लिए है, इसलिए गेम में पिक्सेल आकार और डिवाइस के स्क्रीन निर्देशांक का पिक्सेल आकार मेल नहीं खा सकता है।

पहिया के स्क्रॉल की मात्रा प्राप्त करें

माउस व्हील के साथ स्क्रॉल करना भी स्क्रिप्ट में पुनर्प्राप्त किया जा सकता है। स्क्रॉलिंग राशि Mouse.scroll के साथ प्राप्त किया जा सकता है। माउस स्थिति के विपरीत, आप केवल तुरंत स्क्रॉल की गई राशि प्राप्त कर सकते हैं। ध्यान दें कि आप यह नहीं समझ सकते कि आपने कितनी दूर स्क्रॉल किया है।

मैं इसे पहले बनाए गए MouseInfo स्क्रॉल ऑपरेशन में जोड़ूंगा।

// 省略

public class MouseInfo : MonoBehaviour
{
  // 省略

  /// <summary>スクロールした量を保持する。</summary>
  private Vector2 ScrollValue = Vector2.zero;

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // スクロール量を取得し保持する
    ScrollValue += mouse.scroll.ReadValue();

    Builder.Clear();

    // マウスの位置を取得する
    Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");
    // スクロール量を表示
    Builder.AppendLine($"ScrollValue={ScrollValue}");

    TextObject.text = Builder.ToString();
  }
}

Mouse.current अब तक स्क्रॉल की गई राशि को पकड़ नहीं पाता है, इसलिए स्क्रॉलिंग राशि रखने के लिए एक समर्पित फ़ील्ड ScrollValue निर्धारित करें.

Mouse.scroll फिर, आप उस समय स्क्रॉल की गई राशि प्राप्त कर सकते हैं, इसलिए हम उस मूल्य को जमा करेंगे। उदाहरण के लिए, यदि आप पहिया को दो बार स्क्रॉल करते हैं, तो ScrollValue दो बार स्क्रॉल की गई मात्रा को बरकरार रखा जाएगा।

बाकी इस मान को पाठ के रूप में प्रदर्शित करना है।

अब गेम चलाएं और व्हील को स्पिन करें। मुझे लगता है कि आप स्क्रॉलिंग की मात्रा देखेंगे।

Mouse.scrollVector2 का मान है, लेकिन अगर यह एक ऊर्ध्वाधर स्क्रॉल-केवल पहिया है, तो मुझे लगता है कि केवल वाई का मान सेट किया जाएगा।

वैसे, यदि आप नीचे स्क्रॉल करते हैं, तो मूल्य 120 इकाइयों में ऊपर और नीचे जाएगा। यह Windows द्वारा परिभाषित मान है, इसलिए अन्य परिवेशों और माउस प्रकारों के आधार पर संख्या बदल सकती है.

निर्धारित करें कि माउस बटन कब क्लिक किया जाता है

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

सबसे पहले, एक टेक्स्ट ऑब्जेक्ट को स्थानांतरित करने के लिए रखें। आकार और स्थिति उपयुक्त हैं।

क्लिक प्रक्रिया के लिए कोई स्क्रिप्ट बनाएँ. MouseButtonClick नाम को इस रूप में छोड़ दें।

स्क्रिप्ट इस तरह दिखती है:

using UnityEngine;
using UnityEngine.InputSystem;  // 追加
using UnityEngine.UI;           // 追加

public class MouseButtonClick : MonoBehaviour
{
  /// <summary>情報を表示するテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;
  [SerializeField] private Canvas CanvasObject;

  /// <summary>Canvas の RectTransform の参照です。</summary>
  private RectTransform CanvasRect;

  // 最初のフレーム更新の前に開始が呼び出されます
  void Start()
  {
    if (CanvasObject == null)
    {
      Debug.Log($"{nameof(CanvasObject)} が null です。");
      return;
    }

    // Canvas から RectTransform を取得しておきます。
    CanvasRect = CanvasObject.GetComponent<RectTransform>();
  }

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }
    if (CanvasObject == null)
    {
      Debug.Log($"{nameof(CanvasObject)} が null です。");
      return;
    }

    var mouse = Mouse.current;
    if (mouse == null)
    {
      Debug.Log("マウスがありません。");
      return;
    }

    var transform = TextObject.transform;

    // マウスの位置を取得する
    var mousePosition = mouse.position.ReadValue();

    // マウスの位置を Canvas の座標に変換する
    var mouseOnCanvas = new Vector2(mousePosition.x - CanvasRect.sizeDelta.x / 2, mousePosition.y - CanvasRect.sizeDelta.y / 2);

    // 左ボタンがクリックしたタイミングか判定
    if (mouse.leftButton.wasPressedThisFrame)
    {
      transform.localPosition = mouseOnCanvas;
    }
  }
}

मैं टेक्स्ट ऑब्जेक्ट को क्लिक की गई स्थिति में ले जाने की प्रक्रिया करता हूं। यूआई ऑब्जेक्ट की स्थानीय स्थिति कैनवास का समन्वय है, इसलिए यह माउस की स्थिति से अलग है, जो स्क्रीन समन्वय है।

चूंकि कैनवास (0, 0) की उत्पत्ति केंद्र में है,RectTransform.sizeDelta इसलिए कैनवास के आधे आकार को प्राप्त करने के लिए उपयोग करें। माउस निर्देशांक की उत्पत्ति को केंद्र में स्थानांतरित कर दिया गया है।

आप यह निर्धारित कर सकते हैं कि आपने क्लिक किया है या नहीं mouse.xxxxxxxx.wasPressedThisFrame , और क्लिक करने के क्षण ही true वापस आ सकते हैं। यदि आप बटन को क्लिक करके रखते हैं, तो यह तब तक वापस आता रहेगा जब तक आप false इसे फिर से क्लिक नहीं करते।

स्क्रिप्ट सहेजने के बाद EventSystem , इसे अनुलग्न करें. इस बार, हम कैनवास का भी उपयोग करेंगे, इसलिए कैनवास और टेक्स्ट ऑब्जेक्ट सेट करें।

गेम चलाने का प्रयास करें और देखें कि पाठ ऑब्जेक्ट क्लिक किए गए स्थान पर जाता है या नहीं। चूंकि यह केवल क्लिक किए जाने के क्षण को संसाधित करता है, इसलिए क्लिक करते समय माउस को स्थानांतरित करने पर भी टेक्स्ट ऑब्जेक्ट नहीं हिलता है।

निर्धारित करें कि आप माउस बटन कब छोड़ते हैं

यद्यपि यह एक नमूने के रूप में सूचीबद्ध नहीं है, wasPressedThisFrame आप इसके बजाय उपयोग करके रिलीज का समय निर्धारित कर सकते हैं wasReleasedThisFrame

बटन क्लिक करते समय जज करें

mouse.xxxxxxxx.isPressed जब तक आप बटन क्लिक करते हैं, तब तक true लौटना जारी रखें. यहां, मैं सही बटन दबाते समय पाठ को घुमाना चाहता हूं।

स्क्रिप्ट बाएँ-क्लिक से मोड़ दी गई है। इसे निम्नानुसार संशोधित करें:

// 省略

public class MouseButtonClick : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // 右ボタンを押している間はオブジェクトを回転させる
    if (mouse.rightButton.isPressed)
    {
      transform.Rotate(0, 0, 1);
    }
  }
}

स्क्रिप्ट सहेजने के बाद, इसे जांचने के लिए चलाएं। जब तक सही बटन दबाया जाता है तब तक ऑब्जेक्ट घूमता रहता है।