Sabit Zamanlı Güdümlü Füze


9

Oyuncular ve füzelerle bir oyun inşa ediyorum.

P1'den P2'ye bir füze ateşlemek istiyorum. Füzenin P2'ye ulaşması her zaman tam beş saniye sürmelidir. Füze ayrıca P2'yi de izlemelidir. P2 daha uzağa hareket ederse, füzenin zamanlama kısıtlamasını karşılamak için hızlanması gerekir. P2 sola hareket ederse, füze sola hareket etmelidir (ve hızı da değiştirmelidir). P2, P1'e yaklaşırsa füzenin yavaşlaması gerekir.

Mümkün mü? Bunu başarmanın en iyi yolu nedir?

Şu anda Vector2D sınıfım yok (bu aslında bir oyun değil, analoji iyi çalışıyor), bu yüzden mümkünse, bir tane gerektirmeyen bir çözüm istiyorum.

Edit: Bu aslında bir füze değil. :)

Teşekkürler!


1
(Birisinin "bu aslında bir oyun değil" tarafından nitelendirilen füze rehberliği isteyen birinden korkuyorum ama ...) Füzenin yörüngesinin şekli üzerinde herhangi bir kısıtlama var mı? Mevcut konumu ile 2. oyuncu arasında daima düz bir çizgi izleyebilir mi? Dönüş yarıçapı veya ivmelenmesi üzerinde bir sınırı var mı? Engellerden kaçınması gerekiyor mu? Ayrıca, Vector2D'den bahsediyorsunuz - buna sadece 2B'de ihtiyacınız olduğunu varsaymak güvenli mi? Tüm vektör matematiğini bileşensel olarak yapabilirsiniz, ancak basit bir vektör matematik sınıfına kıyasla yazmak zor, bu yüzden buna karşı olan tercihi gerçekten anlamıyorum.
DMGregory

Bazı ek bilgileri kaçırdınız. Kısıtlamalar var mı? Füzeler bir çizgi boyunca hareket ediyor mu yoksa yönleri ve nihayetinde kaç boyutu önemsemeliyiz?
liggiorgio

Yol sınırlandırılmamalıdır. Tek kural: A) "Füze" her zaman hedefine doğru adımlar atmalıdır. B) "Füze" her zaman 5 saniye sürmelidir. Vector2D sınıfı yazmak sorun değil. Sadece bir tane kullanışlı değilim (ve matematik benim en iyi dersim değil). Bunu kolaylaştırırsa ekleyebilirim.
Peter

Bunu yapmanın en basit yolu, bir hermite spline kullanmak ve parametrik değeri elde etmektir.
Steven Srun

Yanıtlar:


11

Düzenleme güven verici. :)

Tamam, işte basit bir güncelleme döngüsü ...

Füzeyi ateşlediğimizde başlattığımızı varsayarak 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
Bu yöntem, "füze" uçuş ortasında, uçuş ortasında dönüyor gibi görünmüyor. +1
Jon

0

Neden konumu değiştirip hedef hedefi değiştikçe güncellemiyorsunuz?

Lerping'in nasıl çalıştığına bakmanız gerekebilir, ancak şöyle görünecektir:

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 ile temelde bir nesnenin konumunu belirli bir süre boyunca değiştirirsiniz, böylece A'dan B'ye doğru yolun% 50'sini olduğunuzu ve nesne oraya yerleştirileceğini söyleyebilirsiniz. Lerping doğrudandır, böylece her zaman hedefe doğru hareket edersiniz (yorumlarda istediğiniz gibi).


ha iyi benim kötü ... 3 am kodlamaya çalışırsanız ne olur sanırım. hatayı düzeltmek için cevabı değiştirdi
user3797758
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.