일정한 시간을 가진 유도 미사일


9

플레이어와 미사일로 게임을 만들고 있습니다.

P1에서 P2로 미사일을 발사하고 싶습니다. 미사일은 P2에 도달하기 위해 항상 정확히 5 초가 걸립니다. 미사일도 P2를 추적해야합니다. P2가 더 멀어지면 미사일 속도가 높아져 타이밍 제약 조건을 충족해야합니다. P2가 왼쪽으로 이동하면 미사일이 왼쪽으로 이동해야하며 속도도 변경해야합니다. P2가 P1에 가까워지면 미사일 속도가 느려집니다.

이것이 가능한가? 이것을 달성하는 가장 좋은 방법은 무엇입니까?

현재 Vector2D 클래스가 없습니다 (실제로는 게임이 아니지만 유추가 잘 작동합니다). 가능한 경우 클래스가 필요없는 솔루션을 원합니다.

편집 : 이것은 실제로 미사일도 아닙니다. :)

감사!


1
( "이것은 실제로 게임이 아니다"라는 자격을 갖춘 미사일 유도에 대해 묻는 사람이 다소 무섭지 만…) 미사일의 궤도 모양에 제약이 있습니까? 항상 현재 위치와 플레이어 2 사이의 직선을 따라갈 수 있습니까? 회전 반경 또는 가속도에 제한이 있습니까? 장애물을 피해야합니까? 또한 Vector2D에 대해 언급했습니다-2D에서만 필요하다고 가정하는 것이 안전합니까? 모든 벡터 수학을 구성 요소별로 수행 할 수는 있지만 간단한 벡터 수학 클래스와 비교하여 작성하는 것은 번거롭기 때문에 이에 대한 선호도를 실제로 이해하지 못합니다.
DMGregory

추가 정보가 누락되었습니다. 제약이 있습니까? 미사일이 선을 따라 움직입니까? 아니면 방향과 관심을 가져야합니까?
liggiorgio

경로를 제한해서는 안됩니다. 유일한 규칙은 다음과 같다 : A) "미사일"은 항상 목표를 향한 조치를 취해야한다. B) "미사일"은 도착하는데 항상 5 초가 걸린다. Vector2D 클래스를 작성해도 문제가 없습니다. 나는 단지 하나의 핸디를 가지고 있지 않다 (그리고 수학은 나의 최고의 주제가 아니다). 그것이 더 쉬워지면 추가 할 수 있습니다.
Peter

이를 수행하는 가장 간단한 방법은 은자 스플라인을 사용하고 파라 메트릭 값을 뛰어 넘는 것입니다.
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.