C#과 유니티로 만드는 MMORPG 게임 개발 시리즈

새로운 패킷을 정의하고 사용하기

ChaYong 2023. 12. 28. 17:41

◎ Rookiss님의 [  C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 ] 관련

새로운 패킷 정의 및 사용하기

 

- 본 내용은 PC에서 보실 것을 권장해요 -

 

패킷을 새로 정의하고 사용하는 방법은 사실 루키스님 강의에 다 나와있어요. 그럼에도 불구하고 좀 더 빠르게 확인하기 위해서 이 글을 쓰게 되었어요. 사용법을 아시는 분은 안보셔도 되요^^

 

1. 새로운 패킷 정의

1) 필요한 패킷을 구상

서버에서 클라로 int값이 담긴 패킷을 전송하는 녀석이 필요해요.

2) Protocol.cs에서 새로운 패킷정의

루키스님 프로젝트 폴더에서 Common\protoc-3.12.3-win64\bin폴더로 들어가 주세요. Protocol.proto 파일을 열어서 아래와 같이 S_Test이라는 새로운 패킷을 만들어주세요. 패킷 안에는 testInt라는 int값을 담을 변수를 하나 넣어주세요. rookissGDF(rookiss Game Development Framework)에서는 서버에서 클라로 보내는 패킷명을 지을 때는 작명규칙으로 S_ 라는 것을 패킷명 앞에 붙여주셔야 합니다.

message S_Test {
  int32 testInt = 1;
}

 

그리고 Protocol.proto파일 내에서 제일 상단에서 MsgId에 새로운 값을(S_TEST = 23;) 추가해주세요. 

MsgId는 반드시 대문자로 만드셔야되고 뒤에 번호 넣어주셔야해요. 그리고 Protocol.proto파일을 저장해주세요.

enum MsgId {
  S_ENTER_GAME = 0;
  S_LEAVE_GAME = 1;
  S_SPAWN = 2;
  S_DESPAWN = 3;
  C_MOVE = 4;
  S_MOVE = 5;
  C_SKILL = 6;
  S_SKILL = 7;
  S_CHANGE_HP = 8;
  S_DIE = 9;
  S_CONNECTED = 10;
  C_LOGIN = 11;
  S_LOGIN = 12;
  C_ENTER_GAME = 13;
  C_CREATE_PLAYER = 14;
  S_CREATE_PLAYER = 15;
  S_ITEM_LIST = 16;
  S_ADD_ITEM = 17;
  C_EQUIP_ITEM = 18;
  S_EQUIP_ITEM = 19;
  S_CHANGE_STAT = 20;
  S_PING = 21;
  C_PONG = 22;
  
  S_TEST = 23;
}

 

3)  GenProto.bat 파일을 두 번 실행

루키스님 프로젝트 폴더에서 Common\protoc-3.12.3-win64\bin 안에 GenProto.bat 파일이 있어요. 이를 실행해주시는데요. 혹시 모르니 두 번 실행해주세요.

 

GenProto파일

 

4) 패킷 핸들러 만들기

서버에서 클라이언트로 보내는 패킷을 만들게되면 클라이언트 측에서 이 패킷을 받을 핸들러를 만들어줘야 해요. 유니티로 클라이언트 프로젝트가 열려 있는 상태라면 유니티창을 열 때 콘솔창에 에러 메세지가 보일거에요. 

Unity Console창

 

이제 패킷핸들러 파일을 열어주세요.

패킷핸들러 스크립트

 

클라이언트 PacketHandler.cs파일이 열리고 가장 하단에 아래와 같이 함수를 만들어주세요.

패킷 핸들러 내에 새로운 핸들러 정의


2. 패킷 사용법

이제 패킷을 정의 하였으니 사용하는 방법에 대해서 알아볼게요. 

1) 서버에서 패킷 생성 및 클라에 전송

보통 패킷을 만들 때에는 사용할 코드위치에서 만들지만 현재 저희가 새로 만든 패킷은 딱히 정해진 대가 없으니 간단하게 클라이언트 세션 중 아무대서나 사용해 보도록 할게요. 왜냐하면 클라이언트 세션에서 Send()함수를 이용해서 패킷을 보낼 것이기 때문이에요. 어디에 만들어볼까 하니 OnConnected()안에서 만들어 볼게요.

서버의 클라이언트 세션

 

아래의 코드를 OnConnected함수 내에로 넣어주세요. 패킷을 생성하고 그 안에 우리가 만든 TestInt변수에 원하는 값을 담아서 ClientSession의 Send함수를 통해 해당 클라이언트 측으로 패킷을 전송해주세요.

S_Test test = new S_Test();
test.TestInt = 7777;
Send(test);

패킷 생성

2) 클라이언트에서 해당 값을 다루기

유니티의 클라이언트 스크립트 중 패킷핸들러 스크립트로 돌아가볼게요. 우리가 아까 만들어 주었던 S_TestHandler함수 내에 아래와 같이 코드를 작성해 주세요. 패킷이 날아올 때에는 IMessage형태로 날아오기 때문에 S_Test로 캐스팅을 해주어야 해요. 그리고 해당 패킷 내에 들어있는 TestInt변수의 값을 출력하게끔 하면 되요. 물론 이 값을 자신이 원하는 코드 쪽으로 가져가서 사용하시면 되요. 

 

	public static void S_TestHandler(PacketSession session, IMessage packet)
	{
		S_Test test = (S_Test)packet;
		Debug.Log(test.TestInt);
	}

 

패킷 내의 값을 출력하기

 

끝. ㅎㅎ