MetaverseCapstone / 2024Capstone

0 stars 0 forks source link

로그 데이터를 이용한 동기화 기능 #14

Open Jun1102 opened 7 months ago

Jun1102 commented 7 months ago
  1. 사용자 행동(이동, 에셋 설치, 상호작용 등)에 대한 로그 정의
  2. 동기화 수준 결정 필요
  3. 로그 기반 동기화 기능 구현
lhr4426 commented 7 months ago

사용자 이동 로그 :

사용자 상호작용 로그 (request):

사용자 상호작용 로그 (response) [request 승인 시 브로드캐스트] :

사용자 상호작용 로그 (response) [request 실패 시 설치 요청한 유저에게만] :

에셋 설치 (response) [request 승인 시 브로드캐스트]

에셋 설치 (response) [request 실패 시 설치 요청한 유저에게만] :

에셋 삭제 (response) [request 승인 시 브로드캐스트] :

에셋 삭제 (response) [request 실패 시 삭제 요청한 유저에게만] :

[에셋 Lock 관련 합의 후에 확정 예정]

에셋 변경 (request) :

에셋 변경 (response)[request 승인 시 브로드캐스트] :

에셋 변경 (response) [request 실패 시 삭제 요청한 유저에게만] :

lhr4426 commented 7 months ago

에셋 설치, 삭제, 변경의 경우 클라이언트에서 1차로 검증한 후에 문제가 없으면 서버로 요청 예정 (클라이언트도 일단 크리에이터 목록을 가지고있음)

사용자 아이디를 메시지에 넣어서 보내지 않는 방법도 생각 중 (사용자가 접속할 때 발급하는 세션 키를 기억하고 있다가 요청이 소켓으로 들어오면 대조해서 사용자 아이디 찾기?)

lhr4426 commented 7 months ago

접속/퇴장 관리 방법

서버와 클라이언트에 플레이어 목록 리스트가 있음 두 플레이어 목록 리스트는 늘 동기화 되어야 함


  1. 접속하려는 플레이어가 서버에 로그를 날림 (접속 or 퇴장)
  2. 서버가 승인 or 반려 (퇴장은 해당사항 X)
  3. 승인하면 서버의 플레이어 리스트에 접속 신청 유저 아이디를 추가 or 삭제
  4. 서버의 플레이어 리스트를 접속한 모든 클라이언트에게 브로드캐스트

서버에 날라오는 모든 로그의 유효성 검사할 때 플레이어 리스트에서 확인 (ex. 에셋 생성 로그를 받았는데 보낸 플레이어가 플레이어 리스트에 없으면 거부)

lhr4426 commented 7 months ago

플레이어 상태도 로그에 남길 필요 O

상태에 따라 재생해야 하는 애니메이션이 달라질 수 있기 때문 enum 사용?

lhr4426 commented 7 months ago

@Jun1102 <- 리스너 틀 작성함

여기서 확장 필요

Jun1102 commented 7 months ago

한 스키마 당 파싱 함수 따로 제작

브로드캐스트 되는 신호의 양식 커맨드$메시지

메시지는 스키마 파싱 함수 거쳐서 분리함

Jun1102 commented 7 months ago

Schema 클래스를 상속받아 사용할 스키마 클래스를 생성

스키마 클래스 생성 규칙

PackageAddListner 메서드 안에서 AddListener 메서드를 호출해 리스너 추가 AddListener("명령어", (message) => { "사용할 스키마 클래스명" 변수명 = new "스키마 생성자"(message);

이후 스키마 객체에서 필요한 데이터를 참조하여 작업 구현 }

실행해볼 경우 Asset/Resources/EventListener/test.txt 파일을 수정하여 사용할 것 브로드캐스트 되는 신호 양식('$' 을 기준으로 split) - 커맨드$메시지 메시지의 양식(';' 을 기준으로 split) - data;data; ... ;data

lhr4426 commented 7 months ago

PlayerJoin 구현 성공 (feature/MultiPlayJoin)

image

로그 형태 : PlayerJoin$PlayerID$PlayerNickname

움직일 때 카메라의 각도에 맞게 플레이어 위 닉네임도 회전하도록 함

클라이언트 매니저에 플레이어 딕셔너리 (Key : PlayerID, Value : PlayerNickname) 와 플레이어 생성하는 함수 구현 (PlayerJoin(string playerId, string playerNickname))

lhr4426 commented 7 months ago

PlayerLeave, PlayerMove 구현 성공 (feature/MultiPlayJoin)

Player Leave 로그 형태 : PlayerLeave$PlayerID Player Move 로그 형태 : PlayerMove$PlayerID;positionX/positionY/positionZ;rotationX/rotationY/rotationZ

testListener 0.5초 간격으로 바꿔뒀음