लगातार समय के साथ निर्देशित मिसाइल


9

मैं खिलाड़ियों और मिसाइलों के साथ एक खेल का निर्माण कर रहा हूं।

मैं P1 से P2 तक मिसाइल दागना चाहता हूं। मिसाइल को पी 2 तक पहुंचने के लिए हमेशा पांच सेकंड का समय लेना चाहिए। मिसाइल को P2 को भी ट्रैक करना चाहिए। यदि पी 2 दूर चला जाता है, तो मिसाइल को समय की कमी को पूरा करने के लिए तेज होना चाहिए। यदि P2 बाईं ओर चलता है, तो मिसाइल को बाईं ओर ले जाना चाहिए (और साथ ही गति बदलनी चाहिए)। अगर पी 2 पी 1 के करीब जाता है, तो मिसाइल को धीमा होना चाहिए।

क्या यह संभव है? इसे पूरा करने का सबसे अच्छा तरीका क्या है?

मेरे पास वर्तमान में एक वेक्टर 2 डी क्लास नहीं है (यह वास्तव में एक गेम नहीं है, लेकिन सादृश्य अच्छी तरह से काम करता है), इसलिए यदि संभव हो तो, मैं एक समाधान चाहूंगा जिसमें एक की आवश्यकता नहीं है।

संपादित करें: यह वास्तव में एक मिसाइल नहीं है। :)

धन्यवाद!


1
(मैं किसी को "यह वास्तव में एक खेल नहीं है" द्वारा योग्य मिसाइल मार्गदर्शन के बारे में पूछने से डर लगता है ... लेकिन) क्या आपको मिसाइल के प्रक्षेपवक्र के आकार पर कोई अड़चन है? क्या यह हमेशा अपनी वर्तमान स्थिति और खिलाड़ी 2 के बीच एक सीधी रेखा का अनुसरण कर सकता है? क्या इसकी मोड़ त्रिज्या या त्वरण पर कोई सीमा है? क्या बाधाओं से बचने की आवश्यकता है? इसके अलावा, आप वेक्टर 2 डी का उल्लेख करते हैं - क्या यह मान लेना सुरक्षित है कि आपको केवल 2 डी में इसकी आवश्यकता है? आप सभी वेक्टर गणित घटक कर सकते हैं, लेकिन यह एक साधारण वेक्टर गणित वर्ग की तुलना में लिखने के लिए क्लंकी है, इसलिए मैं वास्तव में इस के खिलाफ वरीयता को नहीं समझता।
DMGregory

आप कुछ अतिरिक्त जानकारी से चूक गए। अड़चनें हैं? क्या मिसाइलें एक रेखा के साथ चलती हैं या हमें दिशाओं की परवाह करनी चाहिए, और अंततः कितने आयाम चाहिए?
liggiorgio

रास्ता विवश नहीं होना चाहिए। एकमात्र नियम हैं: ए) "मिसाइल" को हमेशा अपने लक्ष्य की ओर कदम उठाना चाहिए। बी) "मिसाइल" को वहां पहुंचने के लिए हमेशा 5 सेकंड का समय लेना चाहिए। एक वेक्टर 2 डी क्लास लिखना कोई समस्या नहीं है। मेरे पास बस एक काम नहीं है (और गणित मेरा सबसे अच्छा विषय नहीं है)। अगर यह आसान हो जाता है, तो मैं इसे जोड़ सकता हूं।
पीटर

ऐसा करने का सबसे सरल तरीका एक हेर्माइट तख़्ता का उपयोग करना है और पैरामीट्रिक मूल्य का उपयोग करना है।
स्टीवन सीन

जवाबों:


11

संपादन आश्वस्त है। :)

ठीक है, यहाँ एक सीधा अद्यतन लूप है ...

यह मानते हुए कि जब हम मिसाइल को फायर करते हैं remainingFlightTime = 5fतब हम शुरू करते हैं ...

void UpdateMissile(float deltaTime)
{
   remainingFlightTime -= deltaTime;

   // At the end of the trajectory, snap to target & explode.
   // The math will put us there anyway, but this saves
   // on fancy logic related to overshooting. ;)
   if(remainingFlightTime <= 0f)
   {
      myX = targetX;
      myY = targetY;
      MissileImpact();
      return;
   }

   // Compute straight-line velocity that will take us
   // to the target in exactly the time remaining.
   velocityX = (targetX - myX)/remainingFlightTime;
   velocityY = (targetY - myY)/remainingFlightTime;

   // Integrate the velocity into the position.
   myX += velocityX * deltaTime;
   myY += velocityY * deltaTime;
}

1
यह विधि "मिसाइल" को लॉन्च बिंदु, मध्य-उड़ान के आसपास घूमने के लिए प्रकट नहीं करती है। +1
जॉन

0

स्थिति बदलने के लिए और लक्ष्य गंतव्य को अपडेट करने की अनुमति क्यों न दें?

आपको यह देखना होगा कि कैसे काम करता है लेकिन यह कुछ इस तरह दिखाई देगा:

public position startMarker;
public float duration = 5.0f;
private float startTime;
void Launch() {
    startTime = Time.time;
}
void Update() {
    float distCovered = (Time.time - startTime) / duration;
    missile.position = Vector3.Lerp(startMarker.position, target.position, distCovered);
}

lerping द्वारा आप मूल रूप से किसी निश्चित समय पर किसी वस्तु की स्थिति को बदल रहे हैं ताकि आप कह सकें कि आप A से B तक 50% हैं और वस्तु को वहां रखा जाएगा। लेरपिंग प्रत्यक्ष है इसलिए आप हमेशा लक्ष्य की ओर बढ़ेंगे (जैसा कि आप टिप्पणियों में चाहते हैं)।


अच्छा मेरी बुरी ... मुझे लगता है कि क्या होता है अगर आप 3 पर कोड करने की कोशिश करते हैं। बग को ठीक करने के लिए उत्तर बदला
user3797758
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.