यूनिटी में एक नया इनपुट सिस्टम है जहां पुराना OnMouseDown() {} अब काम नहीं करता है।

माइग्रेशन गाइड में वे इसे बदलने का उल्लेख करते हैं Mouse.current.leftButton.isPressed के साथ। और अन्य फ़ोरम पोस्ट में वे InputAction का उपयोग करने का उल्लेख करते हैं। समस्या यह है कि ये विकल्प केवल वस्तु के बजाय दृश्य में कहीं भी माउस क्लिक का पता लगाते हैं:

public InputAction clickAction;

void Awake() {
      clickAction.performed += ctx => OnClickedTest();
}

void OnClickedTest(){
      Debug.Log("You clicked anywhere on the screen!");
}

// this doesn't work anymore in the new system
void OnMouseDown(){
      Debug.Log("You clicked on this specific object!");
}

मैं यूनिटी में नए इनपुट सिस्टम के साथ एक विशिष्ट गेमऑब्जेक्ट पर माउस क्लिक का पता कैसे लगा सकता हूं?

3
Kokodoko 13 सितंबर 2020, 19:02

2 जवाब

सबसे बढ़िया उत्तर

सुनिश्चित करें कि आपके पास एक इवेंट सिस्टम है जिसमें दृश्य में एक InputSystemUIInputModule है और आपके पर एक PhysicsRaycaster या Physics2DRaycaster है। >कैमरा, और उसके बाद ऑब्जेक्ट पर IPointerClickHandler इंटरफ़ेस का उपयोग करें, जिसमें कोलाइडर स्वयं या उसके बच्चों पर हो:

 using UnityEngine;
 using UnityEngine.EventSystems;
 public class MyClass : MonoBehaviour, IPointerClickHandler {
    public void OnPointerClick (PointerEventData eventData)
    {
        Debug.Log ("clicked");
    }
 }
1
Stephan van der Feest 14 अक्टूबर 2020, 16:41

इस कोड के साथ आपके दृश्य में कहीं:

using UnityEngine.InputSystem;
using UnityEngine;

public class MouseClicks : MonoBehaviour
{
    [SerializeField]
    private Camera gameCamera; 
    private InputAction click;

    void Awake() 
    {
        click = new InputAction(binding: "<Mouse>/leftButton");
        click.performed += ctx => {
            RaycastHit hit; 
            Vector3 coor = Mouse.current.position.ReadValue();
            if (Physics.Raycast(gameCamera.ScreenPointToRay(coor), out hit)) 
            {
                hit.collider.GetComponent<IClickable>()?.OnClick();
            }
        };
        click.Enable();
    }
}

आप उन सभी GameObjects में एक IClickable इंटरफ़ेस जोड़ सकते हैं जो क्लिक का जवाब देना चाहते हैं:

public interface IClickable
{
    void OnClick();
}

तथा

using UnityEngine;

public class ClickableObject : MonoBehaviour, IClickable
{
    public void OnClick() 
    {
        Debug.Log("somebody clicked me");
    }
}
2
Kolja 22 फरवरी 2021, 14:09