在你正式开始网络同步之前——你最好知道的一些事
这一篇东西记录了我【ARK-Magellan】在学习网络同步如何写这个问题的时候遇到的所有问题,这篇文章的所有知识有些来自日本或者其他网站,这篇文章只是将他们和在了一起……但是这些真的很重要,所以我希望你认真看完并且遵守其中的一些部分。
一切的开始:你必须要保证你已经会写本地的逻辑了再来考虑写网络同步——但是网络同步一定是从你这个项目一开始就要考虑的事情。
你需要知道的是:
网络同步是一个很多问题的系统,具体的话比如下面的……
所以!
[UdonSynced, FieldChangeCallback(nameof(SyncedVariable))] private int _syncedVariable;
public int SyncedVariable
{
get => _syncedToggle;
set
{
_syncedVariable = value;
//你可以在下面调用一个函数,或者任何你想干的事情
}
}
- 将 FieldChangeCallback 属性应用到应用在变量上,并且指定CallBack的函数
- 写出对应指定CallBack的函数
- 在你想应用的变量的 FieldChangeCallback 属性参数参数中设置第二个属性的名称
[udonsync]public int Variable;
public void SetsyncedVariable()
{
Networking.SetOwner(Networking.LocalPlayer, this.gameObject);
RequestSerialization();
OnDeserialization()
}
public override void OnDeserialization()
{
//网络同步后的逻辑
}
using UdonSharp;
using UnityEngine;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class Udon123 : UdonSharpBehaviour
{
// ...
}
5:针对一些需要同步但不需要全面同步(手动同步)参数。你应该使用VRC最新的带参同步。
这个问题比较简单,我这里直接告诉你该怎么写
[NetworkCallable]
public void Network(int A , int B)
{
//AABBCC
}
请注意:使用这个你需要占用上传带宽。我不保证在NoVariableSync同步模式这个能正常运行。
6:有些人可能会教你使用NoVariableSync同步模式,但是答应我,请不要用他
这个同步模式有很都很奇怪的Bug,请答应我只使用VRCSDK本来有的三个同步方式,手动(Manual),连续(Continuous),不同步(None)
7:请尽量不要将String变成同步变量。
原因:String的性质导致了你不能确定String的大小——他很方便,也很浪费性能。
8:不要通过同步DisplayName来同步玩家信息!
你应该通过GetPlayerCount获得玩家的全局唯一ID,然后把这个ID传递到其他玩家,并让他们使用VRCPlayerApi.GetPlayerById()方法来获取PlayerAPI,再获取Displayname。
我知道你会有很多诸如:内存消耗,性能问题等等,但是我需要提到的是:
在网络同步面前,这一切都不应该放在首位,网络同步的稳定才是首位,你应该优先你的网络同步稳定,然后再是其他的问题。
9:事件同步很好用,非常好用,而且对网络没有任何负担(相比于其他)。
如果可以你应该多用用,真的。