DevLog/유니티 프로젝트

[HDProject]파티 초대 팝업창 포톤 연동 + 왜 포톤을 쓰나요?

뽀또치즈맛 2025. 4. 23. 23:47

 

Git : https://github.com/kwon1232/HDProject

 

필자가 Unity엔진에서 Photon 서버를 사용하는 주된 이유는 다음과 같다.

  1. 빠른 개발 속도
    Photon Unity Networking(PUN) 패키지를 통해
    복잡한 소켓 프로그래밍 없이도 멀티플레이어 기능을 즉시 구현할 수 있다.
    RPC 호출, 룸 생성·관리, 이벤트 전송 등 기본적인 네트워킹 기능을 API 한 줄로 처리할 수 있다.

  2. 낮은 레이턴시 및 글로벌 리전 지원
    전 세계에 분산된 서버 리전을 통해
    플레이어가 가장 가까운 리전에 접속하여 레이턴시를 최소화할 수 있다.
    게이머의 지역에 따라 자동으로 최적의 리전을 선택하는 기능도 제공된다.

  3. 매치메이킹·로비·룸 관리 기능이 제공
    자동 매치메이킹으로 플레이어를 간편하게 그룹화할 수 있다.
    룸 속성(Property) 설정을 통해 게임 룸을 세부 조정할 수 있으며,
    대기실(Lobby)에서 특정 룸 검색과 조건별 필터링이 가능하다.

  4. 크로스 플랫폼 지원
    PC, 모바일(Android·iOS), WebGL, 콘솔, VR/AR 등
    다양한 플랫폼을 하나의 네트워킹 솔루션으로 통합할 수 있다.
    한 번 개발하면 여러 플랫폼에 재사용 가능하여 유지보수가 용이하다.

  5. 확장성과 안정성
    Photon Cloud를 이용하면 서버 운영 부담 없이 곧바로 배포할 수 있다.
    자체 호스팅이 필요할 때는 Photon Server SDK로 완전한 커스텀 서버 환경을 구성할 수 있다.

  6. 커스터마이징 가능성
    Photon Server SDK로 서버 사이드 로직을 직접 작성하여
    권한 검사, 게임 룰, 시뮬레이션 등을 서버에서 완전 제어할 수 있다.
    커스텀 인증과 암호화 옵션을 제공하여 보안 요구사항을 충족시킬 수 있다.

  7. 풍부한 생태계와 문서가 갖춰져 있음
    공식 튜토리얼, 샘플 프로젝트,
    활성화된 포럼과 슬랙 커뮤니티를 통해 문제 해결이 빠르다.
    매치메이킹 확장, 통계 분석, 챗 시스템 등 다양한 서드파티 플러그인 연동도 용이하다.

  8. 비용 효율성이 높음
    소규모 팀이나 인디 개발자는 무료 티어로 시작할 수 있으며,
    사용자 증가에 따라 단계별 요금제로 확장 가능하여 초기 비용 부담이 적다.

Photon 서버는 직접 서버를 구현·운영하기 어렵거나
시간이 부족한 개발팀이 빠르게 안정적인 멀티플레이어 게임을 출시할 수 있도록 돕는 검증된 솔루션이다.

 

 

 

파티 UI 액션 바인딩 부분

 using Photon.Pun;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;

public enum Action_State
{
    None = 0,
    InviteParty,
    Trade,
    InviteGuild
}

public class ActionHolder : MonoBehaviourPunCallbacks
{
    public static SpriteAtlas Atlas;
    public static Dictionary<Action_State, Action> Actions = new Dictionary<Action_State, Action>();
    public static PhotonView photonView;
    public static int TargetPlayerIndex;

 	public static Sprite GetAtlas(string temp)
 	{
     	return Atlas.GetSprite(temp);
 	}

    private void Awake()
    {
        photonView = GetComponent<PhotonView>();

        Atlas = Resources.Load<SpriteAtlas>("Atlas");

        Actions[Action_State.InviteParty] = InviteParty;
        Actions[Action_State.Trade] = Trade;
        Actions[Action_State.InviteGuild] = InviteGuild;
    }

 

 

서버에서 호출되는 부분

PunRPC 부분이 상대 플레이어에게 보내지는 메시지이다.

// RPC 기능 사용할 것
public static void InviteParty()
{
    photonView.RPC("ReceivePartyInvite", RpcTarget.Others, 
        PhotonNetwork.LocalPlayer.ActorNumber, TargetPlayerIndex);
}

[PunRPC]
public void ReceivePartyInvite(int inviterID, int targetPlayerID)
{
    string temp = string.Format("<color=#FFF000>{0}</color>님이 " +
        "파티를 초대하셨습니다.\n수락하시겠습니까?", 
        PhotonHelper.GetPlayerNickName(inviterID));

    PopUPManager.instance.Initialize(temp, null, null);
}