• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

강의 관련 질문!(화살 파트)

23.06.22 13:57 작성 23.06.22 13:59 수정 조회수 274

0

안녕하세요 루키스님.

MMORPG 시리즈 Part7 화살 #1 ~ 화살 #2 를 수강하다가 궁금한 점이 있어서 질문을 올립니다.

궁금한 부분은 화살을 생성하는 부분인데요. 제가 이해하기로는 화살 스킬을 사용하는 과정이 클라에서 스킬 사용 패킷을 보냄(C_Skill) -> 서버 C_SkillHandler를 거쳐 GameRoom.HandleSkill 에서 처리 -> 이 때 GameRoom.EnterGame(Arrow)로 화살 입장 -> 본인 클라이언트와 다른 플레이어의 클라이언트에 스폰패킷(S_Spawn)을 보냄 ->각 클라이언트에서 ObjectManager.Add로 화살을 스폰하는 것으로 이해했습니다.
강의 코드에서, Gameroom에서 EnterGame(Arrow)를 실행하면 Arrow는 Projectile 타입이므로 if 문에 걸려 본인 클라에 Spawn패킷을 뿌리지 않고 다른 클라에만 뿌리는 것으로 작성이 된것 같은데... Player 타입이 GameRoom의 인자로 들어왔을 때만 본인 클라에 패킷을 전송하는 것 같거든요. 그런데 실행하면 화살이 잘 날아갑니다. 어느 단계에서 화살이 생성되는지 모르겠습니다. 어느 부분을 잘못 이해했을까요? 강의 코드 그대로 입니다.

public void EnterGame(GameObject gameObject)
{
    if (gameObject == null)
        return;

    GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id);

    lock (_lock)
    {
        if (type == GameObjectType.Player)
        {
            Player player = gameObject as Player;
            _players.Add(gameObject.Id, player);
            player.Room = this;

            Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y));

            // 본인한테 정보 전송
            {
                S_EnterGame enterPacket = new S_EnterGame();
                enterPacket.Player = player.Info;
                player.Session.Send(enterPacket);

                S_Spawn spawnPacket = new S_Spawn();
                foreach (Player p in _players.Values)
                {
                    if (player != p)
                        spawnPacket.Objects.Add(p.Info);
                }

                foreach (Monster m in _monsters.Values)
                    spawnPacket.Objects.Add(m.Info);

                foreach (Projectile p in _projectiles.Values)
                    spawnPacket.Objects.Add(p.Info);

                player.Session.Send(spawnPacket);
            }
        }
        else if (type == GameObjectType.Monster)
        {
            Monster monster = gameObject as Monster;
            _monsters.Add(gameObject.Id, monster);
            monster.Room = this;

            Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y));
        }
        else if (type == GameObjectType.Projectile)
        {
            Projectile projectile = gameObject as Projectile;
            _projectiles.Add(gameObject.Id, projectile);
            projectile.Room = this;
        }
    
        // 타인한테 정보 전송
        {
            S_Spawn spawnPacket = new S_Spawn();
            spawnPacket.Objects.Add(gameObject.Info);
            foreach (Player p in _players.Values)
            {
                if (p.Id != gameObject.Id)
                    p.Session.Send(spawnPacket);
            }
        }
    }
}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.06.24

안녕하세요, 인프런 AI 인턴이에요.

화살 생성에 대한 질문이시군요. 강의 코드에서는 Player가 GameRoom의 인자로 들어왔을 때만 본인 클라에 패킷을 전송하는 것으로 확인됩니다. 그러나, 이 부분이 화살 생성과 관련되는 것은 아닙니다.

화살은 Projectile 타입으로 생성되며, Projectile은 GameObject의 자식클래스입니다. GameRoom의 EnterGame 메소드에서 gameObject가 Projectile 타입일 경우에는 중복 체크가 되지 않고 Projectile을 list에 추가하도록 코드가 작성되어 있습니다. 이후에는 gameObject의 Spawn 패킷을 모든 클라이언트에 보내도록 되어 있습니다. 따라서, 화살도 코드에서 언급된 단계를 거쳐 생성되는 것입니다.

제가 이해한 내용이 정확하지 않을 수도 있으니, 혹시 추가 질문이 있다면 언제든지 댓글로 문의해주세요.

좋은 하루 되세요.