Unity - 네트워크 팀프로젝트2

땡구의 개발일지·2025년 7월 31일

Unity마스터

목록 보기
66/78

플레이어, Ai 연결

기존에 플레이어컨트롤러를 참조하던 코드들에 추가로 Ai컨트롤러 또한 참조할 수 있게 수정해야한다. 기존에 사용되는 곳은 아래와 같다.

  1. 게임매니저에서 플레이어들을 등록한다. 콜라이더와 PlayerController를 딕셔너리로 연결. 팀 정보를 불러오고, 팀에 맞게 리스폰 포인트에서 스폰시킨다.
  2. ParticleSystem 충돌로 처리하는 무기는 OnParticleCollision에서 검출된 Collider로 PlayerController를 찾는다. PlayerController의 TakeDamage 수행.

이러한 용도로 사용되는 구조에 추가적으로 AiController를 참조시켜야 한다. Ai 플레이어들 또한 위와같은 기능들을 필요로 하기 때문이다. 해결책으로 4개를 생각해볼 수 있다.

해결 방안

  1. AiController가 PlayerController를 상속한다.
  2. IDamagable과 같은 Interface를 상속한다.
  3. Adapter 패턴을 사용한다.
  4. PlayerController와 AiController가 상속받는 상위 클래스를 만든다.

장단점

1 번의 경우, PlayerController가 너무 무겁기 때문에 상속받기에는 깔끔하지 않다. 당장에 구현하기에는 가장 쉬운 경우다.

2 번의 경우, 스크립트를 상당히 많이 수정해야한다. 코드가 꼬일 확률이 높다.

3 번의 경우, 차선책으로 좋은방법이다. 각 컨트롤러마다 추가적인 컴포넌트 부착이 필요하단 점과 에디터 상에서 추적이 불가능하다는 단점이 있다.

4번은 구현도 쉽고, 객체지향적으로도 올바른 방법이다. 수정해야 하는 코드 또한 많지 않기 때문에 코드의 재사용성 또한 높다.

포톤 룸 재참가

참여했던 방에서 나간 다음, 다시 방에 참여하려고 하면 에러가 발생한다. JoinLobby 수행 후에 다시 방에 참가하려고 해도 에러가 발생하는데, 이는 포톤 시스템 상 로비에 참가한 다음의 후처리를 아직 다 못한 상황에서 룸에 참여하려고 하기 때문이다. 룸 참가 함수에 조건을 추가한다

if (PhotonNetwork.NetworkClientState == ClientState.JoinedLobby)
{
    PhotonNetwork.JoinRoom(roomName);
    joinButton.onClick.RemoveListener(JoinRoom);
}
profile
개발 박살내자

0개의 댓글