same as pattern2
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class EachLocalDataForSync : BaseUserData
{
[UdonSynced,HideInInspector] public int[] auto_skill_id = {-1,-1,-1};
[UdonSynced,HideInInspector] public int manual_skill_id = -1;
protected override void WhenTargetPlayerIdSeted(){
base.WhenTargetPlayerIdSeted();
if(Networking.LocalPlayer.playerId == target_player_id){
ChangeOwnerToTargetPlayer();
}
}
}
result :
If access to player_id value before Phase2Ready, player_id become correct value.
++++OtherCode
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.Udon.Common.Interfaces;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class BaseUserData : UdonSharpBehaviour
{
[UdonSynced,FieldChangeCallback(nameof(SyncedTargetPlayerId))] protected int target_player_id = -1;
protected VRCPlayerApi target_player = null;
public bool IsUsed(){
if(target_player_id != -1 && Utilities.IsValid(target_player)) return true;
return false;
}
public bool IsTargetPlayerBeOwner(){
if(target_player == null) return true;
if(Networking.IsOwner(target_player,gameObject)) return true;
return false;
}
public int GetTargetPlayerId(){
return target_player_id;
}
int SyncedTargetPlayerId{
get => target_player_id;
set {
target_player_id = value;
if(target_player_id != -1){
WhenTargetPlayerIdSeted();
}
}
}
protected virtual void WhenTargetPlayerIdSeted(){
target_player = VRCPlayerApi.GetPlayerById(target_player_id);
}
public void ChangeOwnerToTargetPlayer(){
if(target_player == null) return;
Networking.SetOwner(target_player,gameObject);
}
public void SetPlayer(int player_id){
if(!Networking.IsOwner(Networking.LocalPlayer,gameObject)){
GeneralMethods.OutLog("BaseUserData.SetPlayer : not owner");
return;
}
SetProgramVariable("target_player_id",player_id);
RequestSerialization();
}
public void SyncReset(){
if(!IsUsed()) return;
SendCustomNetworkEvent(NetworkEventTarget.All,nameof(Reset));
Networking.SetOwner(GeneralMethods.GetMaster(),gameObject);
}
public virtual void Reset(){
target_player_id = -1;
target_player = null;
}
public override void OnPlayerLeft(VRCPlayerApi player){
if(Networking.IsOwner(Networking.LocalPlayer,gameObject)){
if(player.playerId == target_player_id){
SyncReset();
}
}
}
public override void OnPlayerJoined(VRCPlayerApi player){
if(Networking.IsOwner(Networking.LocalPlayer,gameObject)){
RequestSerialization();
}
}
}
I will write the code and the result of it.
U# version : 1.1
pattern1 this is correct pattern.
//ユーザーごとのローカルデータ共有用のクラス
result:![R0](https://user-images.githubusercontent.com/38059494/184350452-d9b53ba1-f110-4a70-98b2-d427dce75b0b.PNG)
pattern2
result :![R1](https://user-images.githubusercontent.com/38059494/184350977-c68272c8-b8d3-480a-ac56-5a043b8fac9a.PNG)
FootSound player_id Should not have 0, should have 2.
pattern3
result :![R2](https://user-images.githubusercontent.com/38059494/184351798-3953682e-ade9-4e05-b531-24de86f07f67.PNG)
If access to player_id value before Phase2Ready, player_id become correct value.
++++OtherCode