프로세스 정리

  • 어제 아웃 게임 및 게임 프로세스에 맞게 서버 및 통신 구조를 리팩토링하였다!

  • 그 이후 서버와 클라이언트 간 필요한 정보만 주고받을 수 있도록 프로토버프 종합이 끝나,
    이와 관련된 핸들러를 수정해주어야 한다!

프로토버프 적용

  • 현재 서버의 경우엔 2차까지 기능 구현이 대부분 맞춰졌으나, 이를 시험할 클라이언트 구현이 부족하여 이를 도와주기로 하였다!

  • 기존 클라이언트 담당자 분과 협의를 하여 프로토버프 구조를 통해 패킷을 생성하고 서버에게 보내주는 부분을 담당하기로 하였다

수정 부분

전달 패킷의 페이로드 구조가 바뀐 것들을 검토해가며 이름이나, 유형을 맞춰주는 작업을 하였다!

  • 기존 게임프로세스 에서 호스트가 게임 시작을 누르면 관련 정보를 서버와 주고 받은 뒤, 게임이 시작되는 형식이였다

  • 이 때 호스트는 몬스터와 오브젝트들을 먼저 시뮬레이션하여 관련 정보를 서버에 보내주는 기능을 추가하며 수정되었다!

message C2SGameStartRequest { // 게임시작 요청
    repeated MonsterPositionData monsters = 1;
    repeated ObjectPositionData objects = 2;
}
  • 이를 적용 시키기 위해 Send(packet) 부분에 있는 로직들을 이용해 Packet 형태로 압축해주었다!
if (UserInfo.myInfo.id == roomData.OwnerId) //내가 반장이면 보냄.
{
    SocketManager.instance.monsterPositions.Clear();
    SocketManager.instance.objectPositions.Clear();

    GamePacket packet = new GamePacket();
    packet.GameStartRequest = new C2SGameStartRequest();
    // packet.GameStartRequest = new C2SGameStartRequest() {Monsters = new List<MonsterPositionData> ...,
    // Objects = new List<ObjectPositionData> ...}
    // 위와 같이사용하려 했으나, repeatable 필드는 직접적인 수정이 불가하여 Add 메서드를 사용해야했다..

    for (int i = 0; i < SocketManager.instance.storedMonsters.Count; i++)
    {
        int sign = (i % 2 == 0) ? 1 : -1; // 짝수 몬스터는 양쪽 대칭 배치
        packet.GameStartRequest.Monsters.Add(new MonsterPositionData
        {
            MonsterId = SocketManager.instance.storedMonsters[i].MonsterId,
            MonsterCode = SocketManager.instance.storedMonsters[i].MonsterCode,
            X = 5f * sign,
            Y = 5f * sign
        });
    }

    for (int i = 0; i < SocketManager.instance.storedObjects.Count; i++)
    {
        int sign = (i % 2 == 0) ? 1 : -1; // 짝수 오브젝트는 양쪽 대칭 배치
        packet.GameStartRequest.Objects.Add(new ObjectPositionData
        {
            ObjectId = SocketManager.instance.storedObjects[i].ObjectId,
            ObjectCode = SocketManager.instance.storedObjects[i].ObjectCode,
            X = 5f * sign,
            Y = 0f
        });
    }

    SocketManager.instance.Send(packet);
}

한줄 평 + 개선점

  • 오늘은 구현 작업보다는 테스트 및 디버깅 작업을 많이 했는데, 마치고보니 대부분 오타들이나 프로토버프 필드명 불일치였다..