부트캠프/Unity [ 스파르타 ]

[스파르타 ][TIL] 유니티 스파르타 7기 30일차 - 보간법, 예측

맏난거 2025. 3. 5. 21:01

🎯 1. 왜 보간과 예측이 필요할까?

  1. 네트워크 지연(Latency): 서버에서 받은 좌표가 실제보다 늦게 적용됨
  2. 패킷 손실(Packet Loss): 데이터가 유실될 경우 캐릭터가 순간이동하는 것처럼 보임
  3. 불규칙한 갱신 속도: 데이터가 일정한 간격으로 도착하지 않음

이 문제를 해결하기 위해 **보간(Interpolation)**과 **예측(Extrapolation)**을 사용해 움직임을 보정합니다.


🟢 2. 선형 보간법 (Lerp, Interpolation)

과거의 위치(이전 패킷)와 현재 위치(새로운 패킷)를 보간하여 자연스럽게 이동
네트워크에서 받은 좌표값이 불규칙하게 들어올 수 있기 때문에, 이를 부드럽게 연결하는 방식이야.

 

Vector3 targetPosition; // 서버에서 받은 목표 위치 
float interpolationSpeed = 5.0f; 
void Update() 
{ 
    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * interpolationSpeed); 
}

 

 

🔹 유니티 코드 예제 (Lerp 사용)

Vector3 targetPosition; // 서버에서 받은 목표 위치 
float interpolationSpeed = 5.0f; 

void Update() 
{ 
	transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * interpolationSpeed); 
}

➡️ 현재 위치에서 targetPosition으로 부드럽게 이동함.

 

즉, 서버 패킷이 불규칙하게 와도, 이전 값과 현재 값을 보간하여 부드러운 움직임을 구현할 수 있습니다.


🔴 3. 예측법 (Extrapolation)

보간법은 항상 과거 데이터를 사용하지만, 예측법은 미래 움직임을 예측하여 보정하는 방식입니다.
(특히 빠른 이동을 하는 게임에서 필수적! 🚀)

 

🔹 유니티 코드 예제 (Extrapolation)

Vector3 lastPosition; 
Vector3 velocity; 
float deltaTime = 0.1f; // 서버 간 패킷 시간 간격 
void Update() 
{ 
    // 예측된 위치 계산 
    Vector3 predictedPosition = transform.position + velocity * deltaTime; 
    transform.position = Vector3.Lerp(transform.position, predictedPosition, Time.deltaTime * 5.0f); 
} 

// 서버로부터 새로운 패킷이 도착할 때 갱신 
void OnReceiveNewPacket(Vector3 newPosition) 
{ 
    velocity = (newPosition - lastPosition) / deltaTime; 
    lastPosition = newPosition; 
}

➡️ 새로운 데이터가 올 때마다 속도를 계산하여 예측된 위치로 보정.

 

즉, 서버 패킷이 늦게 도착해도 현재 속도를 이용해 미리 예측된 위치로 이동 가능! 🚀


🔥 4. 보간 vs 예측 언제 사용해야 할까?

방법장점단점추천 상황

보간법 (Lerp) 부드러운 이동 약간의 지연 발생 일반적인 멀티플레이 (MOBA, FPS 등)
예측법 (Extrapolation) 빠른 반응 속도 예측 오류 가능 빠르게 움직이는 물체 (레이싱, 로켓)

🔹 FPS, MOBA 게임
→ 보간법 사용 (일반적인 이동)
🔹 레이싱, 로켓 이동
→ 예측법 사용 (빠른 속도)


이제 유니티에서 네트워크 움직임을 다룰 때 보간법 (Lerp)과 예측법 (Extrapolation)을 조합하면 자연스러운 멀티플레이어 이동을 구현할 수 있습니다.