일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- touchdesigner displace
- touchdesigner particle
- TouchDesigner
- 터치디자이너 reference
- 터치디자이너 if
- displace
- 터치디자이너 timeline
- 터치디자이너 오퍼레이터
- 터치디자이너 Instancing
- 터치디자이너 인터페이스
- 터치디자이너 강의
- 파이썬 if
- TDableton
- 터치디자이너 interface
- touchdesigner GPU
- 터치디자이너 list
- 터치디자이너 python
- 터치디자이너 참조
- 파이썬reference
- 터치디자이너 에이블톤
- ableton live 10
- 터치디자이너
- 터치디자이너 replicator
- 터치디자이너 함수
- particleGPU
- 파이썬
- 터치디자이너 튜토리얼
- 터치디자이너 파이썬
- touchdesinger
- 터치디자이너 클론
- Today
- Total
caLAB
03. 포톤네트워크 동기화(photonView, RPC) 본문
포톤네트워크의 동기화에 대해서 알아보도록 하겠습니다.
동기화를 시키기 위해서는 우선 서버에 접속하고 방에 입장해야 됩니다.
간단한 코드로 우선 환경을 세팅해주겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class photonManager2 : MonoBehaviourPunCallbacks
{
private void Awake()
{
Screen.SetResolution(960, 540, false);
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster() =>
PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions { MaxPlayers = 6 }, null);
}
PhotonView
포톤네트워크에서 player를 만들어서 동기화 시키기 위해서는 PhotonView라는 컴포넌트가 필요합니다.
player의 행동은 모두 photonView를 통해서 관찰된 후에 동기화 됩니다.
즉, playerA가 이동을 했을 때 다른 세계에 있는 playerA의 clone들은 photonView를 통해서 이동명령을 받는 것입니다.
그렇기 때문에 동기화를 위해서는 photonView가 필수적으로 player의 component로 있어야 됩니다.
그러면 이제 photonView 컴포넌트를 하나하나 뜯어보도록 하겠습니다.
1. Syncronization(동기화 옵션)
동기화 옵션에서는 어떻게 데이터를 동기화 할지를 정한다.
Off : RPC만 사용할 경우
Reliable Delta Compressed : 받은 데이터를 비교해 같으면 보내지 않음.
Unreliable : 계속 보냄, 손실 가능성 있음.
Unreliable On Change : 변경이 있을 때 계속 보냄.
*off 이외에는 모두 observed components에 component가 하나라도 있어야 함.
2. Observed Components
동기화 할 컴포넌트를 넣는 곳이다.
즉, 변경된 값 중 동기화 할 것을 관찰해서 다른 클론들에게 보내는 곳!
Build해서 직접 테스트 해보기.
*IsMine의 개념 알아보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class playerScript : MonoBehaviourPunCallbacks
{
public PhotonView PV;
private void Update()
{
if(PV.IsMine)
{
transform.Translate(new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime * 7,
Input.GetAxisRaw("Vertical") * Time.deltaTime * 7, 0));
}
}
}
RPC 동기화
RPC는 remote procedure calls의 축약어이다. 이는 원격으로 함수를 부른다는 의미를 가진다.
즉, RPC동기화는 이벤트가 발생(함수호출)하는 경우에 사용한다.
쉽게 말하면 RPC는 같은 photonView component를 가지고 있는 player에게 함수를 실행하도록 한다.
이해를 돕도록 아래와 같이 도식화 하였다.
전체 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using Photon.Pun.UtilityScripts;
public class playerScript : MonoBehaviourPunCallbacks
{
public PhotonView PV;
private bool isJump;
private Rigidbody rigidbody;
private void Start()
{
rigidbody = GetComponent<Rigidbody>();
}
private void Update()
{
if(PV.IsMine)
{
float axis = Input.GetAxisRaw("Vertical");
transform.Translate(new Vector3(Input.GetAxisRaw("Horizontal") * Time.deltaTime * 7,
0,
Input.GetAxisRaw("Vertical") * Time.deltaTime * 7));
if (Input.GetKey(KeyCode.Space))
{
isJump = true;
PV.RPC("Jump", RpcTarget.All, axis); //RPC 함수 호출
}
}
}
//RPC 함수
[PunRPC]
void Jump(float axis)
{
if (!isJump)
return;
rigidbody.AddForce(Vector3.up * .5f, ForceMode.Impulse);
isJump = false;
}
}
Animation동기화 시키기
'Unity > 유니티 개발' 카테고리의 다른 글
[realsense D435 개발일지] 기본 세팅. (0) | 2020.12.28 |
---|---|
04. 포톤네트워크 Voice Chat (0) | 2020.09.29 |
02. 포톤 네트워크 기본 구조 만들기(서버 연결, 방 만들기) (0) | 2020.09.29 |
01. 포톤 네트워크란 무엇인가? (0) | 2020.09.28 |
00. 포톤 네트워크 시작하기 (0) | 2020.09.28 |