一定時間の誘導ミサイル


9

プレイヤーとミサイルでゲームを構築しています。

P1からP2までミサイルを発射したい。ミサイルがP2に到達するには、常に正確に5秒かかる必要があります。ミサイルもP2を追跡する必要があります。P2がさらに離れると、ミサイルはタイミング制約を満たすために速度を上げる必要があります。P2が左に移動する場合、ミサイルは左に移動する必要があります(速度も変更します)。P2がP1に近づくと、ミサイルは減速する必要があります。

これは可能ですか?これを達成するための最良の方法は何ですか?

私は現在Vector2Dクラスを持っていません(これは実際にはゲームではありませんが、類推はうまくいきます)。したがって、可能であれば、それを必要としないソリューションが欲しいです。

編集:これは実際にはミサイルでもありません。:)

ありがとう!


1
(「これは実際にはゲームではない」という資格のあるミサイルガイダンスについて誰かが尋ねるのが少し怖いですが…)ミサイルの軌道の形状に制約はありますか?それは常に現在の位置とプレイヤー2の間の直線をたどることができますか?回転半径や加速度に制限はありますか?障害物を避ける必要がありますか?また、Vector2Dについても言及していますが、これは2Dでのみ必要だと想定しても安全ですか?すべてのベクトル数学をコンポーネントごとに実行できますが、単純なベクトル数学クラスと比較して書くのは不格好なので、これに対する好みがよくわかりません。
DMGregory

あなたはいくつかの追加情報を見逃しました。制約はありますか?ミサイルは線に沿って移動しますか、それとも方向、そして最終的にはいくつの次元を気にする必要がありますか?
liggiorgio

パスは制約されるべきではありません。唯一のルールは次のとおりです。A)「ミサイル」は常にその目標に向けて一歩踏み出す必要があります。B)「ミサイル」がそこに到達するには、常に5秒かかる必要があります。Vector2Dクラスを作成しても問題ありません。便利なものが1つもありません(そして、数学は私の最高の科目ではありません)。それが簡単になれば、追加できます。
ピーター

これを行う最も簡単な方法は、エルミートスプラインを使用して、パラメトリック値をlerpすることです。
Steven Srun

回答:


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
Jon

0

位置を変更して、目的地を更新してみませんか?

lerpingの動作を確認する必要があるかもしれませんが、次のようになります。

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);
}

レルピングすることで、基本的にオブジェクトの位置が一定の時間にわたって変化するため、AからBへの経路の50%であり、オブジェクトはそこに配置されます。Lerpingは直接的であるため、常に(コメントで望むように)ターゲットに向かって移動します。


ええと、私の悪い...午前3時にコーディングしようとすると、どうなるでしょうか。バグを修正するために答えを変更しました
user3797758
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.