[World] Udon 网络同步
学习案例来自 UKeyboard 包内的源码
Udon 里进行网络同步的两种方法:
1、通过标注
此方法适合简单的不重要的数据,当网络繁忙时,旧数据有概率被新数据覆盖。
通过将udon的网络同步Attributes特性:[UdonSynced]
标注在成员上时,Udon会定期将其值同步给每一个玩家。
在同步前会进行序列化和反序列化,
OnPreSerialization()
预序列化
OnDeserialization()
反序列化
具体逻辑:
当某一玩家对标注[UdonSynced] 的成员的值进行更改后,会分别在:
进行修改的玩家上触发 OnPreSerialization()
预序列化
接收修改的玩家上触发 OnDeserialization()
反序列化
此方法需要自行写判断,判断值是否被修改。
例如:
_sendString
标注 [UdonSynced]
text 为玩家进行的修改。
则在 OnPreSerialization()
中以此判断,对 _sendString
进行修改,以便同步给其他玩家
if (!string.IsNullOrEmpty(text) && _sendString != text)
{
_sendString = text;
}
在OnDeserialization()中进行判断,这里_recieveString起到个中转作用,因为OnDeserialization()和OnPreSerialization() 写在同一类中,如果发生不同玩家的同时触发,可能产生意外,此处逻辑还有待改善。
if (!string.IsNullOrEmpty(_sendString) && _sendString != text && _sendString != _recieveString)
{
_recieveString = _sendString;
text = _recieveString;
WriteUiText(text);
}
2、使用 SendCustomNetworkEvent()
发送网络事件
此方法适合执行重要方法,方法必定会被所有玩家执行。
注意是让每个玩家调用这一方法,在方法内 Networking.LocalPlayer.displayName
得到的是本地玩家而不是网络上的发送方。
学习内容均为个人学习理解,如有错误还请在评论区指出,欢迎讨论交流 作者:伊咪塔 https://www.bilibili.com/read/cv33857766/ 出处:bilibili