जब कई कुंजियों को दबाया जाता है तो गति की गति को कैसे रोकें?


17

मैंने एक नया गेम शुरू किया है जिसके लिए किसी माउस की आवश्यकता नहीं है, इस प्रकार यह आंदोलन को कीबोर्ड तक छोड़ देता है। मैंने 8 दिशाओं को शामिल करने की कोशिश की है; ऊपर, बाएँ, दाएँ, ऊपर-दाएँ और इसी तरह। हालांकि जब मैं एक से अधिक तीर कुंजी दबाता हूं, तो आंदोलन की गति ढेर हो जाती है ( http://gfycat.com/CircularBewitchedBarebirdbat )। मैं इसका प्रतिकार कैसे कर सकता हूं?

यहाँ मेरे कोड का प्रासंगिक हिस्सा है:

var speed : int = 5;

function Update () {
    if (Input.GetKey(KeyCode.UpArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    } else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
        transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
    }
    if (Input.GetKey(KeyCode.DownArrow)) {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}

3
स्पर्शरेखा: आपके कोड का इंडेंटेशन थोड़ा गड़बड़ हो गया था इसलिए मैंने पहले तो ध्यान नहीं दिया, लेकिन आपके कोड में स्थितियां इसे चलने से रोकेंगी। जैसे, अगर (UpArrow) और अगर (UpArrow && RightArrow) कभी भी 'और' ब्रांच नहीं चलेगी।
झॉकिंग

जवाबों:


13

अपने दिशा चयन कोड को वास्तविक आंदोलन कोड से अलग करें।

  1. चुनें Directionकौन सी कुंजी दबाया जाता है यह जाँच कर । इसे एक इकाई (सामान्यीकृत) वेक्टर के रूप में संग्रहीत करें।
  2. अपने Directionसाथ गुणा करेंSpeed और साथDeltaTime
  3. अपनी वस्तु / कैमरे में परिणामी रूपांतरण लागू करें।

27

आपको दिशाओं का योग लेने की जरूरत है, इसे सामान्य करें, फिर गति से गुणा करें।

मैंने तिरछे आंदोलन को रोकने के लिए अपनी प्रतिक्रिया के भाग के रूप में इसका उत्तर दिया

विशेष रूप से:

velX = 0;
velY = 0;

if(keyLeft) velX += -1;
if(keyRight) velX += 1;
if(keyUp) velY += -1;
if(keyDown) velY += 1;

// Normalize to prevent high speed diagonals
length = sqrt((velX * velX ) + (velY * velY ));
if (length != 0)
{
    velX /= length;
    velY /= length;
}

velX *= speed;
velY *= speed;

3
हेह, लैरी गर्व होगा! c2.com/cgi/wiki?LazinessImpatienceHubris
jzx

3
ध्यान दें कि एकता पहले से ही एक वेक्टर की परिमाण और चुकता परिमाण प्राप्त करने के लिए तरीके प्रदान करती है ।
सेलाली अडोबोर

1
यह NaN का उत्पादन करता है यदि कोई कुंजी दबाया नहीं जाता है
CodeInChaos

1
@jzx वास्तव में, हम फॉन्ट हॉबिट्स की तरह बनने का प्रयास करते हैं। youtube.com/watch?v=G49RUPv5-NU
चरण 13

11

"सामान्यीकृत दिशा वेक्टर" यह है कि इस कार्य को आमतौर पर कैसे किया जाता है, और मैं अक्सर इसे कैसे करता हूं, लेकिन हाल ही में मैं केवल परिणामी आंदोलन वेक्टर को जकड़ रहा हूं। यह आमतौर पर एक ही अंतिम परिणाम प्राप्त करता है और कोड बहुत सरल है:

var moveSpeed = 6.0f;
function Update() {
  var movement = Vector3.zero;
  movement.x = Input.GetAxis("Horizontal") * moveSpeed;
  movement.z = Input.GetAxis("Vertical") * moveSpeed;
  movement = Vector3.ClampMagnitude(movement, moveSpeed);
  movement *= Time.deltaTime;
  transform.Translate(movement);
}

सरल कोड लगभग हमेशा बेहतर होता है: ई


क्या करता ClampMagnitudeहै, क्या यह वैसा ही कोड नहीं है जैसा Normalize * Constantकि अयोग्यता में है?
क्रॉम्स्टर का कहना है कि

2
काफी नहीं। "क्लैम्पिंग" एक मान सुनिश्चित करता है कि यह अधिकतम सीमा से नीचे / सीमा के भीतर रहता है, जबकि सामान्य करने से मान स्थिर हो जाता है। एकता के साथ कम से कम, GetAxis () थोड़ा तेजी से मूल्यों को लौटाता है, जिससे आपको एक चिकना आंदोलन मिलता है। वेक्टर को सामान्य करना उस त्वरण को ओवरराइड करता है, जबकि क्लैम्पिंग से त्वरण होता है। यह सूक्ष्म है लेकिन अच्छा लग रहा है। अंतिम प्रभाव हालांकि बहुत अधिक है।
झॉकिंग

1
एकता के संदर्भ में सीधे लिखे गए एकमात्र उत्तर होने के लिए +1। एपीआई इस तरह की स्थिति को ध्यान में रखते हुए सभी प्रकार के उपयोगी वेक्टर / क्वाटरनियन गणित के तरीके प्रदान करता है, कोई भी कारण नहीं है।
सेलली अडोबोर

मैं 1 से क्लैंप करता हूं और केवल moveSpeedक्लैंपिंग के साथ गुणा करता हूं और संभवतः इसे गुणा से विलय कर देता हूं deltaTime
कोडइन्चोस

क्या यह परिवर्तन केवल एक गुणन ऑपरेशन को हटाने से अधिक प्राप्त करता है? जैसे, क्या क्लैम्पिंग 6 को क्लैम्पिंग से अलग तरीके से संचालित किया जाता है? सोच रहा था कि आपका परिवर्तन क्या करता है ...
झॉकिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.