मेरे पास इन विधियों के साथ एक स्रोत 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 जवाब
यह एक ऐसी समस्या है जिससे लगभग सभी नए एकता प्रोग्रामर गुजरते हैं।
Input.GetMouseButton
हर फ्रेमtrue
है जब माउस जारी होने तक बटन दबाए रखा जाता है। फिर से, यहtrue
प्रत्येक . होगा फ्रेम जारी होने तक।Input.GetMouseButtonDown
true
बस एक बार< है /मजबूत> जब माउस बटन दबाए रखा। जब तक माउस नहीं होगा तब तक यहtrue
फिर से नहीं होगा जारी किया और फिर से दबाया।
आपके मामले में, ऐसा लगता है कि आपको Input.GetMouseButtonDown
की आवश्यकता है जो केवल एक बार सच हो सकता है और केवल तभी सच हो सकता है जब जारी किया जाए और फिर से दबाया जाए।
यही बात GetKey
, GetKeyDown
और GetKeyUp
पर भी लागू होती है।
नोट:
अगर आप Input.GetMouseButtonDown
का इस्तेमाल करते हैं, लेकिन फिर भी इसे कई बार कॉल किया जा रहा है सुनिश्चित करें कि आपकी स्क्रिप्ट किसी अन्य या एकाधिक GameObjects से जुड़ी नहीं है।
मेरे लिए, मैंने FixedUpdate के अंदर Input.GetMouseButtonDown(0) रखा था। इस वजह से, Input.GetMouseButtonDown(0) एक ही माउस क्लिक में कई बार सही लौटाता है। फिक्स्डअपडेट को अपडेट से बदलें, और यह काम करेगा।
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।