게임 클라이언트 개발/Photon

Photon 동기화 방식 - Photon View Component

재호맴매 2023. 11. 3. 20:00

#️⃣ 들어가며

Photon Unity Networking(PUN)을 사용한 멀티 플레이 게임에서 오브젝트 동기화는 매우 중요한 요소이다. 이번 글에서는 Photon에서 제공하는 5가지의 동기화 방식 중, Photon View Component에 대해 자세히 알아보고, 실전에서 어떻게 사용하는지, 어떤 점에 유의해야 하는지를 정리했다.

 


 

1️⃣ Photon View Component

Photon View Component는 네트워크 상에서 오브젝트를 식별하고 상태를 공유하기 위한 핵심 컴포넌트이다.

 

주요 속성

속성 설명
View ID 오브젝트를 고유하게 식별하는 ID
IsMine 해당 오브젝트가 로컬 플레이어 소유인지에 대한 여부
Owner 현재 오브젝트를 소유한 플레이어
Creator 오브젝트를 생성한 플레이어
Observable Components 동기화할 컴포넌트 목록 (Transform, Animator 등)

Unity에서 Edit 모드와 Play 모드에서의 Photon View Component

 

Photon View Component는 MonoBehaviour 클래스 대신 MonoBehaviourPun 또는 MonoBehaviourPunCallbacks 클래스를 상속받으면 photonView라는 미리 캐싱된 변수나 GetComponent 함수로 접근할 수 있다.

 

💻 기본 사용 예제

using UnityEngine;
using Photon.Pun;

public class PlayerController : MonoBehaviourPun
{
    private void Update()
    {
        if (photonView.IsMine)
        {
            // 로컬 플레이어만 입력을 처리함
            float move = Input.GetAxis("Horizontal");
            transform.Translate(Vector3.right * move * Time.deltaTime);
        }
    }
}

 


 

2️⃣ 추가 동기화 컴포넌트

각각의 컴포넌트로 오브젝트를 동기화하기 위해선 Observable Components 자신 혹은 부모 오브젝트에 Photon View Component가 존재해야 하며 Observable Components 속성에 등록해야 한다.

 

🔷 Photon Transform View

오브젝트의 Transform을 자동으로 동기화해주는 컴포넌트이다. Position, Rotation, Scale의 동기화 여부를 각각 설정 가능하며, 플레이어, 몬스터, 투사체 등 실시간 위치 공유가 필요한 오브젝트에 사용한다.

Photon Transform View Component

 

🔷 Photon Animator View

Animator의 파라미터를 네트워크 상에서 자동으로 동기화해주는 컴포넌트이다. 각각의 파라미터를 동기화해주며, 파라미터마다 Synchronize Type(Disabled, Discrete, Continuous)을 설정할 수 있다.

  • Disabled : 동기화 불가능
  • Discrete : 초당 10회 동기화
  • Continuous : 매 프레임 동기화

Photon Animator View Component

 

단, RPC 매서드를 사용하지 않고 Photon Animator View 컴포넌트로 애니메이션을 동기화할 경우 해당 컴포넌트가 Inspector 창의 가장 아래에 위치해야 한다.

 


 

3️⃣ 추가 사항

❗ View ID 충돌

동일한 View ID를 가진 오브젝트가 존재하면 Photon에서 예외를 발생시키므로 View ID가 같은 오브젝트가 존재하지 않도록 주의해야 한다.

 

보통의 경우, Photon에서 생성된 오브젝트에 대해 자동으로 View ID를 발급하므로 View ID가 같은 오브젝트가 존재하지 않는다. 다만, 싱글톤 객체에 Photon View Component가 존재할 경우 씬을 전환할 때 View ID가 같은 오브젝트가 생성되는 케이스가 존재하니 주의해서 사용해야 한다.

 

❗ Instantiate 방식

Object.Instantiate()가 아닌 PhotonNetwork.Instantiate()를 사용해야 View ID가 올바르게 설정된다.

PhotonNetwork.Instantiate("PlayerPrefeb", Vector3.zero, Quaternion.identity);

 

✅ 언제 Photon View를 써야 할까?

  • 실시간 동기화가 필요한 오브젝트 (Ex. 캐릭터, 총알 등)
  • Transform, Animator 정보를 자동으로 공유하고 싶을 때
  • 로컬과 원격 플레이어의 구분이 필요한 경우 (IsMine 활용)