PacketFormat이라는 Class를 통해 패킷 처리 코드를 자동화하는 작업을 하고, 완성된 코드를 기존 코드에 대체해보며 잘 동작하는지 테스트해보았다. 오늘도 이어서 이 자동화 코드를 개선해볼 것이다.
계속 코드를 수정하면 Client, Server를 왔다갔다 하며 복붙해넣는 과정도 이제는 코드에서 해당 파일의 내용을 참조하여 사용하게 하고 싶다.
그렇기 위해서 몇 가지 준비사항이 더 필요하니 우선 그 작업들을 먼저 처리해보자.
파일을 통째로 가져오려면 using 선언 부분도 가져와야하기에 지금 사용하는 것들만 모아서 처리해준다.
이때 {0}에는 해당 패킷의 이름을 받고, {1}에는 아래에서 자동화한 코드들을 담아 fileFormat이라는 이름으로 모두 묶어줄 것이다.
기존에 아래와 같은 식으로 어떤 패킷이 넘어왔는지 Packet의 ID를 확인하기 위해 만들어준 Enum이 있었는데 이 또한 자동화를 위해 작업해줄 것이다.
public enum PacketID // 기존 코드
{
PlayerInforReq = 1,
PlayerInforOk = 2,
}
PacketFormat에 이렇게 Enum을 위한 Format도 설정해주고 FileForamt과 함께 처리를 할 것이다.
지난 시간 File.WriteAllText
를 사용해서 GenPacket이라는 값을 넣는 코드를 작성했었다.
File.WriteAllText("GenPackets.cs", genPackets);
이제 이 부분을 조금 변경해서 FileText
라는 string을 선언하고, 여기에 앞서 작업해준 FileFormat 형태의 값들을 맞추어 담아준 뒤
string fileText =
string.Format(PacketFormat.
fileFormat, // 파일 형식
packetEnums, // 패킷 이름
genPackets); // 패킷 목록(기존 자동화 코드)
genPackets 또한 여기에 담아주어 이를 파일로 만들어 내용을 합쳐준다.
직접적으로 genPackets에 내용을 넣던 ParsePacket()내에 enum 값을 증가시키기 위한 코드도 함께 담아준다
Enum 값 증가는 정책에 따라 달라질 수 있지만 여기서는 ++로 그냥 증가 시켜주면 하나로 using, enum에 대한 내용이 합쳐진 파일로 생성된다.
지난 시간 byte에 대한 처리를 잠시 미뤄두었는데 이번에 그 byte를 처리할 것이다.
패킷을 넘기고 받을 때 BitConvert
를 계속사용해왔는데 byte는 이미 byte 타입이기에 다른 방식을 사용해주어야한다.
바이트 처리는 비교적 간단한데, testByte라는 byte타입 변수를 하나 선언하고
read를 해주던 곳에서 byte 타입에 대한 처리를 추가해주면 된다. 이 방식을 PacketFormat 처리를 하던 곳에 추가 해준다.
sbyte도 사용할 수 있으니 바이트로 캐스트를 위해 {1}값을 넣어준다.
write도 가져와서 넣는 작업이라 매우 간단하다.
역시 동일하게 PacketFormat 처리를 추가해준다.
이제 기존에 Switch문에서 byte 타입 작업을 추가해주기만 하면 된다.
담는 값이 간단해서 그대로 넣어주면 끝이다.
현재 Skill 이라는 구조체를 list에 담아서 사용하고 있는데, 이 스킬 안에도 또 list가 필요한 순간이 있을 수 있다.
그럴 때도 잘 동작하는지 확인하기 위해서 테스트를 해볼 것이다.
값을 추가하기 위해 PDL 값에 attributes 라는 list와 att 이라는 int 값을 넣어보았다.
var skill = new PlayerInforReq.Skill() {
id = 101, level = 1, duration = 5f };
skill.attributes.Add(new
PlayerInforReq.Skill.Attribute(){ att = 1000 });
packet.skills.Add(skill);
ServerClient에서 attributes 값을 담아준다.
구조체는(struct) 인스턴스 방식을 사용할 수 없어서 class 형태로 변경한 뒤에 테스트를 거쳐야한다.
이제 패킷을 받는 부분에 디버그로 확인해보면 잘 처리되어있는 것을 확인할 수 있다.