시작하기
클라이언트 사이에서 값을 공유하고, 바뀔 때 받고, 모두가 한 번씩 처리하는 메시지를 보냅니다.
설치
먼저 VCC(VRChat Creator Companion)를 통해 Unity 프로젝트에 네트워킹 패키지를 추가합니다. 프로젝트의 vccproject.json을 열고 패키지를 추가하거나, VCC 인터페이스를 사용해 직접 설치하세요.
설치 후 패키지는 프로젝트에서 사용 가능하며 아래의 네트워킹 API를 사용하기 시작할 수 있습니다.
값 공유하기
public class Scoreboard : UdoniteBehaviour
{
private Synced<int> score = new Synced<int>();
public override void Interact()
{
score.Value = score.Value + 1;
}
}
Synced<T> 는 비헤이비어의 필드입니다. .Value 에 쓰면 저장되고 복제가 요청되므로, 기억해야 할 직렬화 호출도 짝지어야 할 동기화 모드 속성도 없습니다.
쓸 수 있는 쪽은 오브젝트의 소유자뿐입니다. 소유하지 않은 클라이언트에서의 대입은 그 클라이언트에 남습니다. 누구나 바꿔도 된다면 먼저 소유권을 가져오세요.
public override void Interact()
{
Ownership.Claim(gameObject);
score.Value = score.Value + 1;
}
바뀔 때 받기
public override void Start()
{
score.Subscribe(OnScoreChanged);
}
private void OnScoreChanged(int value)
{
label.text = value.ToString();
}
핸들러는 값을 쓴 클라이언트를 포함해 모두에서 돕니다. 화면 갱신을 두 군데 쓰지 않아도 됩니다. 호출은 갱신이 전부 도착한 뒤에 일어나며, 동기화 값이 둘 이상일 때 차이가 납니다. 핸들러에서 다른 동기화 값을 읽으면 같은 갱신으로 들어온 값이 읽힙니다.
핸들러는 private 이어도 됩니다. 자기 비헤이비어 안에서 불리므로 밖에서 이름으로 부를 수 있을 필요가 없습니다.
메시지 보내기
메시지는 보내려는 필드를 가진 클래스입니다.
public class Scored : NetworkEvent
{
public int playerId;
public int points;
public override void Serialize(ByteWriter writer)
{
writer.WriteInt32(playerId);
writer.WriteInt32(points);
}
public override void Deserialize(ByteReader reader)
{
playerId = reader.ReadInt32();
points = reader.ReadInt32();
}
}
보내고, 받습니다.
public override void Start()
{
Room.Subscribe<Scored>(OnScored);
}
public override void Interact()
{
Room.Send(new Scored { playerId = 1, points = 10 });
}
private void OnScored(Scored message)
{
Debug.Log(message.points + " to player " + message.playerId);
}
Room.Send 는 룸 전체로 보냅니다. static 이라 비헤이비어에서든 평범한 클래스에서든 부를 수 있습니다. 특정 오브젝트에 관한 메시지는 그 오브젝트 위를 흐르며, 오브젝트 그 자체인 비헤이비어에 this.Send 라고 씁니다. 그쪽은 그 오브젝트의 소유가 필요합니다. 둘 다 메시지에 있습니다.
누구나 보낼 수 있습니다. 동기화 값과 달리 소유자일 필요가 없습니다. 그래서 메시지는 "누가 무엇을 했다"에 맞고, 변수는 "지금 어떤 상태다"에 맞습니다.
모든 클라이언트가 보낸 순서대로 한 번씩 받고, 보낸 클라이언트도 받습니다. 나중에 들어온 사람은 놓친 것을 받지 않습니다. 이벤트에 바라는 바가 그것이고, 값에 바라는 바와는 반대입니다.
누가 보냈는지
필요할 때만 매개변수를 하나 더 받습니다.
private void OnScored(VRCPlayerApi sender, Scored message)
{
Debug.Log(sender.displayName + " scored");
}
같은 메시지 형식에 두 형태 모두 구독할 수 있고 둘 다 돕니다. 대부분의 핸들러는 보낸 사람이 필요 없어서 모든 시그니처에 넣지 않았습니다.
다음에 읽을 것
배열과, 컴파일러가 볼 수 없는 한 가지 경우를 포함한 Synced<T> 전체는 동기화 값에 있습니다. 주소 지정, 오브젝트 채널, 실제 통신량은 메시지에 있습니다.