Pun2, RPC

감사콩·2026년 1월 7일

유니티

목록 보기
24/29

서론


오늘은 Photon Pun2를 이용하여
멀티플레이 게임의 기초 플로우를 구현해 보겠다.

타이틀 -> 로비(방 생성/입장) -> 룸(게임 시작) -> 인게임 동기화 -> 퇴장
으로 이어지는 전체적인 네트워크 게임의 흐름을 구현하는 데 초점을 맞춰서 진행



TIL 요약

  1. PhotonView의 역할 이해
  2. 변수 동기화(IPunObservable)와 함수 동기화(RPC)의 차이



1. Photon 개념 정리


코드 구현 전, 오늘 배운 PUN2의 핵심 개념들을 정리



1) PhotonView

  • 네트워크 상에 존재하는 오브젝트들의 신분증
  • 이 컴포넌트가 붙어 있어야 네트워크 동기화가 가능
  • IsMine
    • true: 내가 조종하는 캐릭터. (입력 처리 O)
    • false: 다른 사람의 캐릭터. (입력 처리 X, 위치 동기화만 받음)



2) 동기화 방식: RPC vs IPunObservable

멀티플레이에서 데이터를 동기화 하는 방법은 크게 두 가지.

구분IPunObservable (변수 동기화)RPC (함수 동기화)
방식데이터 스트리밍 (계속 보냄)원격 함수 호출 (한 번 명령)
사용처체력, 애니메이션 상태, 지속형 스킬(레이저)총알 발사, 채팅, 아이템 획득, 사운드 재생
함수OnPhotonSerializeView[PunRPC] 붙은 함수
활용SendNext / ReceiveNext로 값을 덮어씌움RpcTarget.All 등으로 모두에게 실행 명령



3) Lobby, Room

  • Lobby: 게임에 들어가기 전 대기 장소.
    • 주로 방 목록을 확인
  • Room: 실제 게임이 진행되는 공간.
    • 플레이어들이 캐릭터를 생성하고 상호작용하는 곳.
    • 같은 Room에 있는 플레이어끼리만 데이터를 주고받을 수 있음

2. 게임 플로우 구현


타이틀에서 마스터 서버에 접속(ConnectUsingSettings)한 후
로비에 진입하여 방을 생성하거나 입장

OnRoomListUpdate 에서 별도의 스크립트 없이
람다식을 활용해 버튼 연결

// LobbyManager.cs
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{

    foreach (Transform child in roomListPanel) Destroy(child.gameObject);

	foreach (RoomInfo roomInfo in roomList)
    {
        if (roomInfo.RemovedFromList) continue; // 삭제된 방 패스

        GameObject room = Instantiate(roomPrefab, roomListPanel);
        room.GetComponentInChildren<Text>().text = roomInfo.Name;

       
        string currentRoomName = roomInfo.Name;
        room.GetComponent<Button>().onClick.AddListener(() => 
        {
            PhotonNetwork.JoinRoom(currentRoomName);
        });
    }
}



룸에선 간단한 시작 버튼



연습 끝

마무리


간단한 개념 정리 후 따로 연습해 본 시간이 더 긴 듯
내일은 DataBase

profile
안녕하시와요

0개의 댓글