मेरे पास इन विधियों के साथ एक स्रोत MonoBehavior स्क्रिप्ट है:

private void Update () {
    if (Input.GetMouseButton(0)) {
        HandleInput();
    }
}

private void HandleInput () {
    Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(inputRay, out hit)) {
        var position = transform.InverseTransformPoint(hit.point);
        Coordinates coords = Coordinates.FromPosition(position);
        HexCell cell = null;        
        if (!cells.TryGetValue(coords, out cell)) {
            var err = string.Format("{0} is an invalid position and coordinates are improperly calculated: {1}", position, coords);
            print(err);

            throw new System.ArgumentException(err);
        }

        print(string.Format("[{0}] cell: [{1}] {2}", DateTime.Now, cell.id, cell.coordinates));
        OnCellTouched(cell);
    }
}

जाल पारदर्शी है और मुझे उम्मीद के मुताबिक षट्भुज (सेल) मिलता है। जब मैं किसी सेल पर क्लिक करता हूं तो संपादक में मुझे एक संदेश आउटपुट मिलता है:

[05.31.2017.14.15.14.2836] cell: [0] [x=0;y=0;z=0]  
[05.31.2017.14.15.15.7359] cell: [197] [x=12;y=-22;z=10]

हालांकि, जब मैं एप्लिकेशन बनाता और चलाता हूं: किसी भी सेल पर सिंगल-क्लिक, निम्नलिखित प्रति क्लिक 4 - 6 बार लॉग होता है:

[05.31.2017.14.57.50.1588] cell: [0] [x=0;y=0;z=0]
[05.31.2017.14.57.50.1695] cell: [0] [x=0;y=0;z=0]
[05.31.2017.14.57.50.1861] cell: [0] [x=0;y=0;z=0]
[05.31.2017.14.57.50.2028] cell: [0] [x=0;y=0;z=0]
[05.31.2017.14.57.50.2195] cell: [0] [x=0;y=0;z=0]
[05.31.2017.14.57.52.6195] cell: [197] [x=12;y=-22;z=10]
[05.31.2017.14.57.52.6360] cell: [197] [x=12;y=-22;z=10]
[05.31.2017.14.57.52.6530] cell: [197] [x=12;y=-22;z=10]
[05.31.2017.14.57.52.6691] cell: [197] [x=12;y=-22;z=10]
[05.31.2017.14.57.52.6857] cell: [197] [x=12;y=-22;z=10]

क्या यह संभव है कि एक क्लिक को यूनिटी इंजन द्वारा कई बार प्रचारित किया जाता है जिसे संपादक अनदेखा कर रहा है? चूंकि प्रत्येक लॉग प्रविष्टि में एक अलग समय टिकट (मिलीसेकंड) होता है, इसलिए सीमा अंतर 157-170ms होता है।

क्या एकता प्रतिमान में "सर्वोत्तम अभ्यास" है? क्या हैंडलर एसिंक्स होना चाहिए? क्या हैंडलर को किसी निश्चित विंडो के भीतर आने वाली कॉलों को अनदेखा करना चाहिए?

ऐसा लगता है कि जब मैं एक हेक्सागोन टाइल पर टॉगल के रूप में एक क्लिक का उपयोग करना चाहता हूं तो इससे समस्याएं पैदा होंगी।

2
IAbstract 1 जून 2017, 01:14

2 जवाब

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

यह एक ऐसी समस्या है जिससे लगभग सभी नए एकता प्रोग्रामर गुजरते हैं।

  • Input.GetMouseButton हर फ्रेम true है जब माउस जारी होने तक बटन दबाए रखा जाता है। फिर से, यह true प्रत्येक . होगा फ्रेम जारी होने तक।

  • Input.GetMouseButtonDown true बस एक बार< है /मजबूत> जब माउस बटन दबाए रखा। जब तक माउस नहीं होगा तब तक यह true फिर से नहीं होगा जारी किया और फिर से दबाया।

आपके मामले में, ऐसा लगता है कि आपको Input.GetMouseButtonDown की आवश्यकता है जो केवल एक बार सच हो सकता है और केवल तभी सच हो सकता है जब जारी किया जाए और फिर से दबाया जाए।

यही बात GetKey, GetKeyDown और GetKeyUp पर भी लागू होती है।

नोट:

अगर आप Input.GetMouseButtonDown का इस्तेमाल करते हैं, लेकिन फिर भी इसे कई बार कॉल किया जा रहा है सुनिश्चित करें कि आपकी स्क्रिप्ट किसी अन्य या एकाधिक GameObjects से जुड़ी नहीं है।

enter image description here

12
Graham 22 सितंबर 2017, 17:24
1
लाइफसेवर ... मुझे इस यात्रा का दस्तावेजीकरण करना है ताकि मैं लगभग एक दर्जन ट्यूटोरियल को सही कर सकूं।
 – 
IAbstract
1 जून 2017, 01:36
1
जैसा कि मुझे पता चल रहा है ... विशेष रूप से विमानों के बारे में यह बकवास, 10: 1 इकाई अनुपात और कैमरे के लंबवत। मुझे पागल कर दिया जब तक मुझे यह पता नहीं चला।
 – 
IAbstract
1 जून 2017, 04:26
एकता में स्क्रिप्ट निष्पादन समस्या के कारण त्रुटि होने तक प्रतीक्षा करें। यह एक दुर्लभ समस्या है लेकिन मैंने इसे यहां बहुत कुछ देखा है। जब तक आप उस समस्या को नहीं समझते हैं, तब तक इसे ठीक करना भी मुश्किल है।
 – 
Programmer
1 जून 2017, 04:34
और कैसे एकता उत्तर एकता तकनीकी कर्मचारियों का ध्यान नहीं जाता है? वास्तव में तेजी से ज्ञानी प्राप्त करने में सक्षम होने के लिए एक महान जगह की तरह लगता है।
 – 
IAbstract
1 जून 2017, 05:40
2
यूए एकता लोगों से सुनसान है क्योंकि यह उनके बिना काम करता है। जब उपयोगकर्ता मुफ्त में काम करेंगे तो आप पैसा क्यों खर्च करेंगे? इसलिए उनके पास कुछ लोग हैं जो कभी-कभी वहां रहते थे (उनके नाम के साथ एक हीरा होता है) और कुछ सीएम जगह की पुलिस करते हैं। दरअसल, एकता तकनीक एकता मंच पर दिखाई देती है।
 – 
Everts
1 जून 2017, 08:44

मेरे लिए, मैंने FixedUpdate के अंदर Input.GetMouseButtonDown(0) रखा था। इस वजह से, Input.GetMouseButtonDown(0) एक ही माउस क्लिक में कई बार सही लौटाता है। फिक्स्डअपडेट को अपडेट से बदलें, और यह काम करेगा।

1
Deepak Munagala 14 मई 2019, 22:05