미니 프젝 진행하고 마칠 것이다.
지금 PDL에서 C_chat이라는 이름으로 채팅을 보내서
그것을 S_chat 이라는 서버쪽 답변 메세지 패킷을 이용해서 해당 채팅 내용을 뿌리는
어떻게 보면 굉장히 간단한 채팅 프로그램을 만들고있었다.
그래서 플레이어 생성을 하고 움직이게 하는 것 까지 해보도록 하겠다.
먼저 방안에 먼저 바로 입장을 시킴
(진지한 MMO라면 방에 바로 안들어가고 다른 중간과정이 있다 로그인등등의 패킷)
그리고 GameRoom >
방에 들어오면 session == 유져를
_sessions 목록에 바로 추가를 한다음에 바로 끝내고 있었다.
실직적인 MMO라면 이렇게 방에 입장 시키고 끝내는 것이 아니라
방에 들어왔으면 다른 유저들한테도 모습이 보이게끔 알려주어야 한다.
그렇다는 것은 유져가 들어왔다는 사실을 그 방에있는
모든 유져들한테 하나씩 다 알려야 한다는 이야기 이다.
그 작업에 Enter에서 이루어 져야 한다.
PDL을 이렇게 해주면되는데
x, y, z좌표가 이렇게 자주 들어가게 되는데
하나씩 이렇게 하기가 귀찮을 수 있다.
< vecotr3 name = "Pos" > 이런식으로 해도된다.
그대신 그 자동화 코드를 만들어 주어야 한다.
(지금은 float 3개로 이어가자)
그리고 클라가 나가겠다라는 요청을 하기위한 C_LeaveGame,
player가 나갔으면 다른 클라들 한테 알려줄
S_BroadcastLeaveGame이라는 것도 대칭적으로 만들어 주어야함.
그리고 들어온 플레이어를 챙겨주기 위한
패킷이 있어야 한다. 현재 그 방에있는 플레이어 목록들을
이렇게 들고 있어야 한다.
isSelf는 방에 들어왔을 때 나인지 상대방인지 구분 하기 위한 것이다.
그리고
클라에서 움직이고 싶다는 패킷이 있으면
움직였을 때 주변의 다른 유져들한테 쏴주기위한 S_BroadcastMove도 준비 ㄱㄱ
수정사항
packetFormat
수정했다면 빌드 > GenPacket 클릭
그럼 이제
이까지 했으면 이제 선택을 해야한다.
클라를 먼저 작업 할 것인지 서버를 먼저 작업을 할 것인지
우선 서버먼저 ㄱㄱ
ClientSession > 좌표를 추가를 해주도록 하자.
이후 GameRoom > Enter부터 수정을 하도록 하자.
이렇게 진행되어야 함
그러면 이제
foreach를 돌면서 목록을 넣어주어야 한다.
이부분 채워 줘야한다.
isSelf는 내 자신인지를 의미하고있었는데
session으로 새로 들어온 애가
여기 s랑 같으면은
자기 자신에 해당하는 녀석인 것을 알 수 있다.
이렇게하면 현재 모든 플레이어들의 정보를 담을 수 있다.
새로들어온 녀석한테만 보내주면된다.
그다음에 바로 player.Write로 ArraySegment를 뽑아서 바로 전송해주면될 것이다.
그다음 신입생 입장은
이렇게 Broadcast를 통해 다 뿌려주면된다.
지금 Broadcast함수는 채팅을 보내도록
이렇게 하드코딩 되어있다.
이렇게 해주면 ArraySegment를 받아서 어떤 패킷이든 받을 수 있게 한다음
_pendingList에다가만 넣어주면 _pendingList가 예약이 된 상태에서
나중에 다른 쓰레드가 Flush를 통해 전송이 될 것이다.
그리고 Leave하는 부분도
이렇게 해주도록 하자.
이 안에 뭘 채워 넣어야 할지 궁금한데
일단 Server > ClinetSession
Handler를 조금 수정 ㄱㄱ
이렇게 패킷 캐스팅 필요없이 이렇게 수정하면된다.
그다음에 Move같은 경우도
이렇게 패킷 캐스팅을 해주고 Move를 한다면은
기존과 마찬가지로
플레이어가 들어가있는 Room에다가
Push를 할껀데
Move에다가는 누가 움직일 것인인지를 넣어주고
두번째 인자에 좌표 아니면 movePacket을 통째로 넣어주면될 것이다.
그리고 Move수정 ㄱㄱ
ㄱㄱ
그리고
이 두가지를 진행을 해야 하는데
이렇게 하면됨!
그리고 마지막으로 다 알려줘야 하니까
이렇게 움직였다는 정보를 모두에게 뿌려준다.
그리고 Server만 빌드 ㄱㄱ
일단 DummyClient > packetHandler부분
이렇게 수정 ㄱㄱ
빌드만 할 수 있도록 하고 실행하거나 디테일적인 부분은 유니티쪽에서 처리가 가능하도록 나중에 하자.
그리고 해야할 부분이 뭔지 생각해보면
DummyClient > SessionManager ㄱㄱ
-50 ~ 50 사이의 값을
x, z 에다가 만 해서 Send를 해주도록 하자.
그리고 SendForEach를 보면
DummyClient > Program
이쪽에서 하고있었다.
여기서 Sleep(250)초마다
자기의 좌표를 갱신해가지고 ( == 랜덤값으로 갱신해서 보내는 값을)
더미클라에서 계속 해주고 있는 것이다.
DummyClient빌드 ㄱㄱ
그다음
테스트를 위한 실행 ㄱㄱ 하면 잘됨
랜덤값도 출력해보면 잘된다.