인프런 커뮤니티 질문&답변

디맂님의 프로필 이미지
디맂

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Packet Generator#2 string부분

작성

·

294

0

안녕하세요

이 부분까지는 실행이 잘되는 것을 확인하였습니다.

그 뒤에 PacketFormat 부분에서실행시키면 아래와 같이 string부분은 입력이 안됩니다.

제 코드에서 틀린부분을 못찾겠어서 선생님이 올려주신 정답 코드로 다시 실행을 해보았는데

똑같이 string부분이 입력이 안되는데 혹시 어떤 부분이 잘못되었는지 알려주실 수 있으실까요?


class PlayerInfoReq
{
    public long  playerId;

    public void Read(ArraySegment<byte> openSegment)
    {
        ushort count = 0;

        ReadOnlySpan<byte> s = new ReadOnlySpan<byte>(openSegment.Array, openSegment.Offset, openSegment.Count);

        count += sizeof(ushort);
        count += sizeof(ushort);
        this. playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count));
            count += sizeof(long);
        
     }
    public ArraySegment<byte> Write()
    {
        ArraySegment<byte> segement = SendBufferHandler.Open(4096);
        bool success = true;
        ushort count = 0;

        Span<byte> s = new Span<byte>(segement.Array, segement.Offset, segement.Count);

        count += sizeof(ushort); 
        success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), (ushort)PacketID.PlayerInfoReq);
        count += sizeof(ushort);   
        success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this. playerId);
            count += sizeof(long);
        success &= BitConverter.TryWriteBytes(s, count);
        
        if (success == false)
            return null;


        return SendBufferHandler.Close(count);
    }
}

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. 해당 코드를 보면 PlayerInfoReq 클래스의 Write 메서드에서 string 값을 입력하는 부분이 누락되어 있는 것 같습니다.

string 값을 입력하는 부분이 없으므로 string 변수를 사용하지 않는 것 같아보입니다. 만약 string 값을 입력하려면 해당 변수를 선언하고 값을 할당하도록 코드를 수정해야 합니다.

예를 들어, PlayerInfoReq 클래스에 다음과 같이 string 변수를 추가하고 값을 입력하는 코드를 작성할 수 있습니다.

public class PlayerInfoReq
{
    public long  playerId;
    public string playerName; // string 변수 추가

    public void Read(ArraySegment<byte> openSegment)
    {
        // 이하 코드 생략
    }

    public ArraySegment<byte> Write()
    {
        ArraySegment<byte> segment = SendBufferHandler.Open(4096);
        bool success = true;
        ushort count = 0;

        Span<byte> s = new Span<byte>(segment.Array, segment.Offset, segment.Count);

        count += sizeof(ushort); 
        success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), (ushort)PacketID.PlayerInfoReq);
        count += sizeof(ushort);   

        // string 값을 입력하는 코드 작성
        success &= Encoding.UTF8.GetBytes(playerName, s.Slice(count, s.Length - count), out int playerNameLength);
        count += (ushort)playerNameLength;

        return new ArraySegment<byte>(segment.Array, segment.Offset, count);
    }
}

위의 코드에서 playerName 변수를 추가하고, Write 메서드에서 해당 변수의 값을 Byte로 변환하여 segement에 기록하는 코드를 추가했습니다. 이렇게 수정하면 string 값을 성공적으로 입력할 수 있을 것입니다.

해당 부분을 확인하시고 필요한 코드를 추가해보세요. 추가적인 문제가 있으면 언제든지 물어보세요. 이용해주셔서 감사합니다.

디맂님의 프로필 이미지
디맂

작성한 질문수

질문하기