박민혁의 개발

책 한권만 읽은 사람의 포톤 2일차 본문

TIL

책 한권만 읽은 사람의 포톤 2일차

박민혁_kog 2023. 10. 25. 21:01

책 한 권만 읽은 사람이 가장 무섭다. 이란 말을 아는가? 

하지만 더 무서운 사람이 있으니

 

유튜브 포톤 강의 몇시간만 본 사람의 포톤 

 

그렇다 바로 이 글 이다 

 

우선 난 포톤을 처음 알았을때 다음 4가지 컴포넌트를 알게 되었다

 

1. PhotonView

PhotonView는 포톤 네트워크에서 네트워크 상태를 동기화하는 데 사용됩니다. 이 컴포넌트를 통해 PhotonNetwork.Instantiate를 사용해 생성된 객체가 네트워크를 통해 동기화됩니다. PhotonView는 주로 Transform 컴포넌트나 사용자 정의 스크립트와 같이 동기화하고자 하는 컴포넌트를 참조합니다.

 

2. PhotonTransformView

PhotonTransformView는 위치, 회전, 및 크기를 동기화하는 데 사용되는 컴포넌트입니다. PhotonView에 추가하여 사용하며, 이 컴포넌트를 통해 게임 오브젝트의 움직임이 네트워크를 통해 동기화됩니다.

 

3. PhotonAnimatorView

PhotonAnimatorView는 Animator 컴포넌트를 동기화하는 데 사용됩니다. 이 컴포넌트는 PhotonView와 함께 사용되며, 애니메이션 상태와 변수를 동기화하는 데 사용됩니다.

 

4. PhotonRigidbodyView

PhotonRigidbodyView는 Rigidbody 또는 Rigidbody2D 컴포넌트를 동기화하는 데 사용됩니다. 이 컴포넌트는 움직임과 회전을 동기화하여 물리적 효과를 네트워크를 통해 동기화할 수 있습니다.

 

세상에 컴포넌트를 붙이기만 해도 위치 잡아줘 ! 애니메이션 따라해줘!!!   리지드 바디 까지!!! 

 

아니 멀티 이렇게 쉬운거였냐? 하긴 내가 웬만한 게임들은 다 멀티가 된다고? 라고 방심을 하던 시절이 있었다.

 

그렇다 포톤이 저걸 다해주면 난 대체 뭘해? 

==나머지 전부

 

-. RPC 채팅의 원리(씬에 배치 된 오브젝트)

네트워크에서는 일반 함수는 통신이 안되니까 RPC 함수를 실행한다. RPC함수는 같은 View ID를 가진 리모트에게 전달됨

-. 로컬과 리모트(동적 오브젝트)

IsMine이 true이면 로컬이고, false이면 리모트입니다. 리모트는 각 개인의 화면에서 그냥 표시되는 Clone일 뿐이죠. 즉 속빈 강정, 앙금없는 떡, 팥 없는 붕어빵이란 말입니다.

그래서 보통은 이렇게 생각하죠. 모두 같은 스크립트를 가지고 있으면 로컬이던 리모트던 모든 PC에서 함수를 실행해야 하는거 아닌가?라구요. 하지만 포톤은 좀 달라서 일반함수는 로컬에서만 실행합니다.

그래서 다른 컴퓨터에서도 특정 함수의 실행을 보여주고 싶다면 꼭 RPC함수로 만들어야 한다는 점이 꽤 중요하죠.

RPC함수를 활성화하는 방법은 아래와 같습니다. 원하는 함수 위에 [PunRPC]라고 작성해주면 됩니다. 굉장히 간단하죠? 근데, [PunRPC]는 하나의 함수만 관장하니까요. RPC함수로 만들고 싶다면 일일이 위에 달아줘야 한다는 불편함이 있습니다 ㅎㅎ ^^; 사실 If(PV.IsMine)은 안넣어줘도 되는 명령문이에요. 하지만 로컬이나 리모트의 구분없이 전부 다 함수를 RPC로 날려대려고 하면 엄청 버벅이겠죠? 그러니 RPC로 보내주는건 로컬만 하도록 만들어주는겁니다

[RpcTarget] - 타겟종류

ㆍAll : 자기는 함수를 바로 실행하고 다른 모두에게 전달, 자기가 빠름

ㆍAllBuffered : All은 호출하는 시기에 통신하고 사라지나\, 버퍼에 남겨두면 방에 나갔다 온 사람들에게도 전달된다. 즉, 총알자국 같은것은 사라져야하지 버퍼에 넣어두고 늦게 들어온 사람들에게도 사라져 보이게 처리를 하는것이다.

ㆍAllBufferedViaServer : 버퍼에 남겨둔 모두에게 서버를 거쳐서 동시호출, 자기와 다른 사람들의 함수 실행 타이밍이 같음.

ㆍAllViaServer : 모두에게 서버를 거쳐서 동시 호출

ㆍMasterClient : 방장한테만 전달

ㆍOthers : 나를 제외한 모두에게 전달

ㆍOtherBuffered : 나를 제외한 모두에게 버퍼와 함께 전달

[매개변수 형식]

[PhotonMessageInfo 매개변수]

Sender는 보내는 사람, photonView는 받는 포톤뷰, SentServerTime은 보낸 시간.

[RaiseEvent]

어떤상황에서든 쓸 수 있는 이벤트입니다. 이 이벤트는 플레이어가 포톤뷰를 가지고 있는지 없는지에 대해 상관하지 않고, 모든 플레이어에게 이벤트를 전달합니다. 하나의 content는 256개의 이벤트를 가질 수가 있죠. 그리고 배열의 번호 마다 이벤트를 할당해 놓고 원하는 이벤트가 담겨 있는 번호를 선택해 이벤트를 보내는 형식

1) 이벤트 보내기

이벤트를 보내는 방식은 오브젝트 배렬로 보낼 수도 있고, 단일 오브젝트로 넣어서 보낼 수도 있어요. 최상위 계층인 오브젝트로 저장하기에 모든 컴포넌트가 다 들어갈 수 있으며, 특정 오브젝트에다가 보내고 싶다면 if 구문으로 메시지를 받는 특정 View ID가 내가 원하는 ID라면 content를 넣는 방식으로도 보낼 수 있어요.

ㆍ0 : 이벤트 구분을 위한 바이트

ㆍcontent : object[] 또는 object를 대입, 특정 뷰만 판단하고 싶다면 ViewID를 넣으면 됨

ㆍRaiseEventOptions.Default : 기본값 , 서버에 해당 이벤트를 캐시 할 지 특정 클라이언트 대상으로 보낼 지 여부 판단.

ㆍSendOptions : 신뢰 or 신뢰할 수 없음.

2) 이벤트 받기

(씬에 배치된 오브젝트)

IOnEventCallback이라는 인터페이스를 구현하는 방식으로 이용합니다. 아래와 같은 방식으로 인터페이스를 상속받고 받아오는 이벤트를 바이트로 구분한 다음 아래의 명령을 실행해요.

(동적 오브젝트)

동적오브젝트의 이벤트는 구독방식으로 구현해야 이벤트를 받아서 실행 시킬 수 있어요. 그러나 이벤트는 너무 남발하면 안됩니. 왜냐하면 해당 이벤트를 구독하고 있는 스크립트는 전부 실행시키기 때문에 느려질 위험이 있어요. 대신 활성화 시 추가, 비활성화시 제거작업이 필요합니다.

[OnPhotonSerializeView] - 변수 동기화

1) 씬에 배치된 오브젝트

씬에 배치된 오브젝트는 IPunObservable 인터페이스 구현 후 사용합니다. PhotonView의 Observed Components에 스크립트를 대입해야만 사용할 수 있어요. stream이 IsWriting이면 보내고 아니면 받는 방식으로 되어있는데요. IsMine이라고 생각하시면 편합니다 ㅎㅎ

2) 동적 오브젝트

정리