Skip to content

Commit 0d27aea

Browse files
committed
Fix syncing issues for late-joiner by using OnDeserialization
1 parent 901748b commit 0d27aea

File tree

3 files changed

+43
-55
lines changed

3 files changed

+43
-55
lines changed

Packages/dev.derpynewbie.common/Runtime/UniUI/UniDropdownSync.cs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,35 @@ public class UniDropdownSync : UniUI
1212
[SerializeField] [NewbieInject(SearchScope.Parents)]
1313
private TMP_Dropdown dropdown;
1414

15-
[UdonSynced] [FieldChangeCallback(nameof(SyncedValue))]
15+
[UdonSynced]
1616
private int _syncedValue;
1717

1818
private bool _inSyncedChangeContext;
1919

20-
public int SyncedValue
21-
{
22-
get => _syncedValue;
23-
set
24-
{
25-
_syncedValue = value;
26-
if (_inSyncedChangeContext) return;
27-
28-
_inSyncedChangeContext = true;
29-
dropdown.value = value;
30-
dropdown.RefreshShownValue();
31-
_inSyncedChangeContext = false;
32-
}
33-
}
34-
3520
private void Start()
3621
{
22+
// serialize the initial value when instance master has first joined
3723
if (!Networking.IsMaster) return;
3824
_syncedValue = dropdown.value;
3925
RequestSerialization();
4026
}
4127

28+
public override void OnDeserialization()
29+
{
30+
// apply deserialized values to UI
31+
_inSyncedChangeContext = true;
32+
dropdown.value = _syncedValue;
33+
dropdown.RefreshShownValue();
34+
_inSyncedChangeContext = false;
35+
}
36+
4237
public override void OnUniUIUpdate()
4338
{
44-
if (_inSyncedChangeContext || dropdown.value == SyncedValue) return;
39+
// don't resync if the event was called by OnDeserialization change
40+
if (_inSyncedChangeContext) return;
4541

46-
SyncedValue = dropdown.value;
47-
Networking.SetOwner(Networking.LocalPlayer, gameObject);
42+
_syncedValue = dropdown.value;
43+
if (!Networking.IsOwner(gameObject)) Networking.SetOwner(Networking.LocalPlayer, gameObject);
4844
RequestSerialization();
4945
}
5046
}

Packages/dev.derpynewbie.common/Runtime/UniUI/UniSliderSync.cs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,34 @@ public class UniSliderSync : UniUI
1212
[SerializeField] [NewbieInject(SearchScope.Parents)]
1313
private Slider slider;
1414

15-
[UdonSynced] [FieldChangeCallback(nameof(SyncedValue))]
15+
[UdonSynced]
1616
private float _syncedValue;
1717

1818
private bool _inSyncedChangeContext;
1919

20-
public float SyncedValue
21-
{
22-
get => _syncedValue;
23-
set
24-
{
25-
_syncedValue = value;
26-
if (_inSyncedChangeContext) return;
27-
28-
_inSyncedChangeContext = true;
29-
slider.value = value;
30-
_inSyncedChangeContext = false;
31-
}
32-
}
33-
3420
private void Start()
3521
{
22+
// serialize the initial value when instance master has first joined
3623
if (!Networking.IsMaster) return;
3724
_syncedValue = slider.value;
3825
RequestSerialization();
3926
}
4027

28+
public override void OnDeserialization()
29+
{
30+
// apply deserialized values to UI
31+
_inSyncedChangeContext = true;
32+
slider.value = _syncedValue;
33+
_inSyncedChangeContext = false;
34+
}
35+
4136
public override void OnUniUIUpdate()
4237
{
43-
if (_inSyncedChangeContext || Mathf.Approximately(slider.value, SyncedValue)) return;
38+
// don't resync if the event was called by OnDeserialization change
39+
if (_inSyncedChangeContext) return;
4440

45-
SyncedValue = slider.value;
46-
Networking.SetOwner(Networking.LocalPlayer, gameObject);
41+
_syncedValue = slider.value;
42+
if (!Networking.IsOwner(gameObject)) Networking.SetOwner(Networking.LocalPlayer, gameObject);
4743
RequestSerialization();
4844
}
4945
}

Packages/dev.derpynewbie.common/Runtime/UniUI/UniToggleSync.cs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,34 @@ public class UniToggleSync : UniUI
1212
[SerializeField] [NewbieInject(SearchScope.Parents)]
1313
private Toggle toggle;
1414

15-
[UdonSynced] [FieldChangeCallback(nameof(SyncedIsOn))]
15+
[UdonSynced]
1616
private bool _syncedIsOn;
1717

1818
private bool _inSyncedChangeContext;
1919

20-
public bool SyncedIsOn
21-
{
22-
get => _syncedIsOn;
23-
set
24-
{
25-
_syncedIsOn = value;
26-
if (_inSyncedChangeContext) return;
27-
28-
_inSyncedChangeContext = true;
29-
toggle.isOn = value;
30-
_inSyncedChangeContext = false;
31-
}
32-
}
33-
3420
private void Start()
3521
{
22+
// serialize the initial value when instance master has first joined
3623
if (!Networking.IsMaster) return;
3724
_syncedIsOn = toggle.isOn;
3825
RequestSerialization();
3926
}
4027

28+
public override void OnDeserialization()
29+
{
30+
// apply deserialized values to UI
31+
_inSyncedChangeContext = true;
32+
toggle.isOn = _syncedIsOn;
33+
_inSyncedChangeContext = false;
34+
}
35+
4136
public override void OnUniUIUpdate()
4237
{
43-
if (_inSyncedChangeContext || toggle.isOn == SyncedIsOn) return;
38+
// don't resync if the event was called by OnDeserialization change
39+
if (_inSyncedChangeContext) return;
4440

45-
SyncedIsOn = toggle.isOn;
46-
Networking.SetOwner(Networking.LocalPlayer, gameObject);
41+
_syncedIsOn = toggle.isOn;
42+
if (!Networking.IsOwner(gameObject)) Networking.SetOwner(Networking.LocalPlayer, gameObject);
4743
RequestSerialization();
4844
}
4945
}

0 commit comments

Comments
 (0)