Skip to main content

变量篇

本章将从变量出发,详细说明以下内容:

1:参数类型-网络同步支持的类型

2:与变量直接相关的方法

——————

网络同步支持以下类型的参数同步

布尔:bool

文字:char、string、VRCUrl

整数:byte、sbyte、short、ushort、int、uint、long、ulong

浮点:float、double

元数组:Vector2、Vector3、Vector4、Quaternion、

颜色:Color 和 Color32。

以及他们的数组[]

————

网络同步会在Request请注意:

Serialization阶段逐项检查同步变量的类型是否合法。

在Udon:OnValueChanger事件中要求:

变量只要值改变就算是更新

而数组只有当大小发生改变时才会触发改变,值改变不会触发OnValueChanger事件

———

常用情况下,与变量有关的事件有以下事件:在UdonSharp中使用OnValueChanger事件的方法

OnPreSerialization:请求序列化前OnValueChanger事件并非是一个固定的事件,而是一种特殊的自定义事件,其效果是当“网络事件”触发时,如果指定的变量发生了改变,其也会发生改变。其最简写法如下:

OnDesSerialization:反序列化

[UdonSynced, FieldChangeCallback(nameof(ScoreValueChange))] private int score;//nameof指定参数改变时触发的方法
private bool Score
{
  get => score;
  set
  {
    score = value;
    /*
      算法
    */
  }
}

请注意:

前者在网络同步正式开始前触发,是更改网络变量的最后一次机会。变量必须同时包含[UdonSynced], FieldChangeCallback())]

后者是网络同步结束的标志,代表所有参数已经正常解压。必须要网络事件发生时,才会触发。

———— 

需要注意的是,这两种事件都支持直接调用(在UdonSharp中)。在常规设计中,经常会在代表开始同步的RequestSerialization后直接接OnDesSerialization。 

这种设计模式下要求: 

1:任何更改同步参数的行为必须执行到最后可以触发RequestSerialization(可以不固定触发)

2:在OnDesSerialization中,必须包含所有和同步变量有关的方法。

3:主机的更新和其它玩家的更新都直接调用OnDesSerialization事件完成。

————

OnPreSerialization事件使用常见于同步变量需要通过计算/分布在其它脚本中的情况。

由于RequestSerialization不止可以通过Owner本地触发,其他玩家也可以触发,Owner无法确定什么时候会发生同步,所以才会使用OnPreSerialization来管理网络同步变量,确保发送的是正确且最新的数据。

在大部分情况下,Request请求都是由Owner发出的,其他人发送Requst请求也不强要求最新数据,所以PreSerialization在实际的使用频率并不高。

————