반응형

 

서버에는 탈것 에대한 상태만 있고 오브젝트는 없음

크랄에서 탈것의 비주얼을 보여줌 

 



  1. 타기요청패킷 : 일반 상태에서 서버에 부르기를 요청을 시작하면서 타기가 시작됨
    1. 이때 서버는 타기에 필요한 검사를 함
      캐릭터의 이동 방향을 보고 탈것이 캐릭터를 태우러 갈 수 있는지 확인 필요
      이때 네비게이션 메시 상에서도 유효한 경로인지 같이 검사를 한다
  2. 부르기 패킷(만날위치포함) : 준비가 끝나면 문제가 없다 판단 되면, 
    1. 모든 클라에게 탈것에 대한 만날 위치포함하여 부르기 알람 메세지를 보낸다 
      그리고 탈것이 어디로 갈지에 대한 정보도 포함한다
    2. 부르기에 필요한 시간을 기다렸다가 랑데부 알람 메세지를 클라에게 보내기 위해 서버에서 예약한다
  3. 랑데부 패킷 : (랑데부는 만남, 만나는 장소라는 뜻) 
    1. 클라에서 랑데부를 받으면 클라에서 타기지점으로 뛰기 시작한다
    2. 탈것을 스폰하고 캐릭터를 향해 달리게 한다
      캐릭터는 이 지점을 향해 달려 가는 연출을 한다
      이때 캐릭터는 탈것을 부르면서도 계속 달리는 중임으로 부르기 상태에서부터 다른 이동의 간섭을 막고 탈곳과 만나기 위한 곳으로 달려 나간다
      이때 캐릭터와 탈것은 계속 달리는 중이다 
  4. 오르기요청 : 클라가 캐릭터가 탈 준비가 완료 되면 서버에 알려주는 방식
    클라에서 서버로 알리는데 => 캐릭터와 탈것은 계속 달리는 중이기 때문에 서버와 메시지를 주고 받는 동안에도 위치가 계속 바뀌고 있는 중임으로 이때 오차가 발생 할 수 있는데 이를 줄이기 위해  
    1. 캐릭터와 탈것의 위치를 서버로 같이 전달한다
    2. 서버에서는 탈것의 위치가 탈것에 올라타는 캐릭터의 새 위치가 되기 때문에 이 둘의 범위가 약속한 범위 안쪽으로 들어오면 
      모든 클라에게 오르는중패킷을 보낸다
    3. 나 자신은 이미 이전에 오르는 연출을 시작 하기 때문에 오르기요청에 대한 응답 패킷은 무시하지만
      다른 클라는 오르는중 패킷을 받으면 오르는 연출을 시작한다
  5. 오르기 완료 패킷 : 오르는 중이 완료 되는 시간이 정해져 있고 이 시간이 완료 되면 상태와 오르기완료패킷을 클라들에게 보내어 오르기를 완료한다, 

 

위 이미지인데 타는 경로를 아래 처럼 생각 해볼 수 있다

 

캐릭터 오르는 연출

  • 랑데부 에서
    • 캐릭터와 탈것이 각각 어느 위치에 있을때 오르기가 시작되는지를 결정해야한다
      캐릭터가 오르기 시작 애니가 나가고 -> 탈것 기준에서 오르기 시작한 지점과 오르기 완료된 지점까지 완료 되면 이때 약간 더 앞으로 전진하면 원래 캐릭터가 이동하던 직직방향과 만나게 된다, 그리고 오르기 완료시까지 플레이어 입력을 일시적으로 제한한다
      일시적으로 제한되는 사이에 연출이 일어나기 때문에 이때의 시간은 기획자가 알아서 제어하도록 테이블로 빼놓음, 말이나 탈것에 따라 연출이 달라질 수 있기 때문 
      그리고 타는 동안 속력은 기존 그대로 고정한다
  • 오르기 완료 
    • 캐릭터 액터를 탈것 액터에 부착하는 방식
      • 캐릭터와 탈것의 위치와 방향은 다르지만 일단 붙여놓고 애니메이션을 재생 하면서 일정시간동안 위치와 방향의 차이가 0이 되게끔 한다
      • 이 시간은 오르기 애니메이션 시간 중에서 캐릭터가 탈것에 닿을 때까지의 시간 , 이때 위치와 방향은 형태와 상관 없이 선형적으로 처리
      • 이때 카메라는 캐릭터 위치를 따라가게 한다음 타기가 완료되면 원래 카메라를 제어하던 곳으로 반환 시켜준다
  • 모바일에서 인터넷이 일시적으로 안되는 상황을 대비해 현재 탈것 상태를 다시 알려주는 처리를 예방 , 클라는 서버에서 주는 상태대로 클라이언트 상황을 맞춰 적용해줘야함 => 현재 위치에서 다음 목표 지점이 다이렉트로 나오는 방식
  • 길이 좁거나 막혀 있다면 탈것이 올 수가 없으니 이때는 제자리에서 바로 탈것을 타도록 한다 
  • 캐릭터가담당 서버가 바뀌는 지역으로 이동하는 경우 
    • 타려는 와중에 서버 이주가 진행 된다면 서버에서 바로 오르기 완료 상태로 바꾸고 클라이언트에 알려주는 상태로 처리 => 임의의 상태로 바로 전환되게 처리 하는 것이 맞아 떨어짐
  • 클라위치와 탈것이 만나지 못하는 거리로 탈것이 지나간다면 그때는 타지 못하고 지나가고  지나간 이후에 제자리에서 바로 탄 상태가 되도록 처리




  • 내리기 처리 : 빠르게 플레이로 돌아갈 수 있는데 집중
    • 오르기완료 상태라면 내리기 처리를 시작
    • 내리는 중, 내리기 완료 패킷을 서버에서 순차적으로 보내준다
      • 내리기과정은 특별히 진행 될게 없고 서버에서 보내주는대로 처리하기면 하면 됨
      • 내릴때 현재 바라보고 있는 방향으로 달려 나가면서 내리도록 처리하고
        위치도 탈것 상태를 전달하면서 같이 모든 클라에게 전달하여 모든 클라이언트에서 같은 곳이 될 수 있도록 처리
      • 내릴때는 탈때와의 반대 과정으로 처리 : 캐릭터와 탈것은 때어내면서 캐릭터 위치는 고정하고 이쪽으로 캐릭터가 이동 되게 하면서 애니메이션 재생
      • 내리는 중 패킷을 클라가 받은 것이라면 내리기 완료 패킷이 오는것은 확정적이라서 먼저 내려서 걸어가고 조작 될 수있게 처리 하면 자연스러워짐 
        예를 들어 말에서 바로 내리는 순간 공격이 가능하다



  • 곡선이동 자동이동 길잡이
    • 곡선이동 : 
    • 캐릭터의 이동은 기본적으로 직선이동이다, 이동 회전이 있긴 한데 이동 경로가 딱딱하다 , 이동회전은 느낌이 딱딱하다
    • 그래서 먼거리를 갈때는 
      먼저 큰 길을 찾아가고 목적지에 가까운 곳까지 큰길을 통해 이동하는 길 찾기 방식을 사용, 이러면 계속해서 큰길들의 분기점을 지나게 된다

 

 

  • 이 분기점을 지날때 급격히 방향이 꺽이는 경우들이 많다
  • 탈것을 타고 빠르게 지나갈때는 문제가 더 잘보이는데 이때 곡선
    형태로 이동 할 수 있는 것을 추가, 이 지역은 내비메쉬가 깔린 지역이다

  • 이런 점들에선 곡선형태로 분이점을 지나도록 처리
  • 베지어 곡선 사용 2차
    곡선이 항상 중심을 향해 들어오고 중심에서 가도록 하기위해 A1, B1 을 잡는데 각 직선에서 ¼ 지점정도에 만든다
    중간  지점을 만들기 위해 B0 지점을 임의로 만든다
  • 이때 샘플값이 균일한 곡선이 나오진 않는데
  • 이것은 시간이 아닌 이동거리를 통해 곡선의 이동 거리를 찾으면 됨
  • 2차 베지어 곡선은 특정 구간의 거리를 계산식 하나로 구할 수 있는 특성이 있다(이것이 다른 곡선과 달리 거리에 대한 이점이 있는 곡선이라 이걸 선택함) 
  • 거리를 통해 위치를 찾을때는 정확한 지점을 찾긴 어려우니 근사 값으로 찾음(뉴턴랩스방법) : 뉴턴법은 식조작으로 풀지못하는 식의해의 근사 값을 구하는 법으로 접선으로 구한다


  • 멀리서부터 접선을 그리다 보면 빨간점의 해와 접접 가까워지면서 해를 구하는 것 
  • 뉴턴방법 = 뉴턴-랩슨 방법  이라한다
    x0 에 해당하는 fx 의 접선을 구하고 이 접선과 만나는 x 축의 점 x1 에 대해 다시 기울기를 구해 이것을 반복하는 방식 으로 근사 해를 구하는 방식중 가장 빠르다 
  • 이것을 이용해서 거리기반의 위치를 구한다
    spline component는 에르미트 곡선을 사용한다
    에르미트 곡선은 거리에 따른 위치 값을 바로 얻어 올 수 있어서 이걸 쓰면




  • 자동길잡이 : 캐릭터의 이동 경로를 미리 보여주는 기능
    • 자동이동이 시작 되는 지점에서 이동해야 하는 경로가 대부분 결정되기 때문에
      이 경로를 미리 보여주는 것 이건 나한테만 보여지는 것으로 splinecomponent 를
      그대로 이용해서 표현이 가능하다

 

 

 

이글의 원문

프라시아 전기에 멋진 탈것 만들기
멋지게 타고, 멋지게 달리고, 멋지게 내리자

● 발표분야: 프로그래밍
● 발표자: 넥슨코리아 이연석 / Nexon Korea Yeonseok Yi
● 권장 대상: 게임 프로그래머, 클라이언트 프로그래머, UE4 프로그래머

반응형

+ Recent posts