센로그

[PUN2] PhotonView - Transform, Animator, Rigidbody 본문

게임/PUN2(Unity)

[PUN2] PhotonView - Transform, Animator, Rigidbody

seeyoun 2023. 1. 20. 04:13

◆ 클라이언트 간 Unity 컴포넌트 동기화 방법

포톤은 클라이언트 간 동기화를 위해 몇가지 방법을 제공한다.

  • Photon View를 이용하는 방법
  • RPC를 이용하는 방법
  • CustomProperties를 이용하는 방법

 

그중 Photon View를 이용하면, 다음과 같이 Transform, Rigidbody, Animator 컴포넌트를 쉽게 동기화할 수 있다.

 

이들을 동기화 하기위해 항상 PhotonView가 필요하다. 

PhotonView에서 어떤 컴포넌트를 관찰해서 동기화할지 총괄하기 때문.

PhotonView의 ObservedComponents가 위와 같은 경우, Player 오브젝트의 Transform과 Animator을 관찰하고 있다는 뜻이다. (해당 스크립트를 추가하면, Photon View의 Observed Components에 자동으로 추가되어 관찰됨; 관찰 안될 시 Observable Search 모드를 Manual로 변경하고 직접 끌어넣으면 됨.)

 


◆ PhotonView

네트워크에 접속한 유저들 간 데이터를 송수신해주는 모듈 (스크립트)
즉, 다른 사람의 뷰와 동기화시켜주는 모듈

- PhotonView 는 네트워크 객체당 한 개만 사용하도록 권장됨(성능 이슈)

 

Synchronization 옵션

  • Off: 동기화를 하지 않음. RPC(원격 플레이어 함수 호출) 호출만을 할 때 적합
  • Reliable Delta Compress: 마지막 데이터가 변경되지 않았을 때 데이터를 송신하지 않음. (TCP)
  • UnReliable: 송신한 패킷의 수신 여부를 확인하지 않음.(UDP)
  • UnReliable On Change: 송신한 패킷의 수신 여부를 확인하지 않으며(UDP), 변경 사항이 발생했을 때만 송신한다. 

 


◆ photonView.IsMine

말 그대로, "이 포톤뷰가 내 꺼냐?" 를 의미함

using Photon.Pun; 필요

 


[예시]

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


public class PlayerController : MonoBehaviour{
    PhotonView PV;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void Start()
    {
        //내 카메라 써야 되므로,
        //내꺼 아닌 카메라는 지우기
        //안 지우면 남의 카메라로 내 움직임 직관함
        if (!PV.IsMine)
        {
            Destroy(GetComponentInChildren<Camera>().gameObject);
        }
    }

    private void Update()
    {
        //내꺼일 때만 제어할 수 있도록 함
        //안하면 남의 캐릭터 움직임
        if (!PV.IsMine)
            return;

        Look();
        Move();

    }
}

 

좀 더 정확히는, Photon View 컴포넌트의 Controlled Locally가 true이냐, false이냐를 의미함.

 

멀티 서버 내에 다양한 유저들이 접속해있으면, 유저들의 화면을 넘어서 포톤 뷰를 공유하는 객체들이 있을 것.

특정 클라이언트 상에서, 그 객체의 Controlled Locally의 true/false 여부가 IsMine 여부라 할 수 있다.

 

※ 포톤 뷰를 공유하는 객체란?

A와 B가 접속해 있는 서버에서, A와 B는 서로를 볼 수 있을 것이다.
이때 A화면에서의 A와, B 화면에서의 A는 같은 포톤 뷰를 공유하는 것임.
총 4개의 포톤 뷰가 존재하며, A화면에서 A의 포톤 뷰는 IsMine이고, B의 포톤 뷰는 !IsMine이다.

 


◆ Photon Transform View (포톤 트랜스폼 뷰)

플레이어 간 움직임(Position, Rotation, Scale)을 동기화하는 스크립트

 

이 스크립트가 적용되지 않으면, 내가 움직여도 남의 화면에서는 내 움직임이 안보임

 

  • Synchronize Options : 어떤 Trasnform 데이터를 동기화할지 결정
  • Use Local: 동기화하는 데이터가 로컬 기준인지 결정

 

※ Photon Transform View를 사용한 위치 동기화시 데드레커닝은 적용되어있지 않기 때문에, 하고싶으면 따로 코드 작성해야 함.

 


 Photon Animator View (포톤 애니메이터 뷰)

애니메이터 컴포넌트(레이어, 파라미터)의 속성을 동기화하는 스크립트

 

 

해당 레이어나 파라미터를 Photon View가 어떻게 관찰하도록 할지 결정한다.

  • Disabled : 관찰하지 않음
  • Discrete : 이산적으로 관찰(켜지거나 꺼질 때 호출)
  • Continuous : 연속적으로 관찰(계속 호출)

 

그러나 애니메이션 자체를 동기화 한다기보다는 파라미터를 동기화해주는 방법이므로 버그가 생길 확률이 높다고 한다.

 


Photon Rigidbody View (포톤 리지드바디 뷰)

속도(Velocity)나 회전속도(Angular Velocity) 등을 동기화하는 스크립트

 

 

'게임 > PUN2(Unity)' 카테고리의 다른 글

[PUN2] Player 클래스  (0) 2023.02.15
[PUN2] PunRPC / PV.RPC  (0) 2023.01.20
[PUN2] Custom Property (커스텀 프로퍼티)  (0) 2023.01.20
[PUN2] PUN2 개요 / MonoBehaviourPunCallbacks 콜백  (0) 2023.01.12
[PUN2] Photon PUN2 Setup  (0) 2023.01.09
Comments