Skip to content

Network Variable Serialisaton Of FixedStrings #3018

@MertKalkanci

Description

@MertKalkanci

Description

Cannot Sync NetworkVariable<FixedString64Bytes>

I just updated my Projects Unity version to 2022.3.42f1 LTS from 2022.3.12f1

Everything works fine except FixedString synchronisation. Following code was working fine on Netcode 1.6.0 but now not working on 1.10.0

When I create a Network Variable by:

[HideInInspector] public NetworkVariable<FixedString64Bytes> playerNickname;

private void Awake()
 {
playerNickname = new NetworkVariable<FixedString64Bytes>(new FixedString64Bytes("Nameless Jelly"), NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner);
}

or

[HideInInspector] public NetworkVariable<FixedString64Bytes> playerNickname = new NetworkVariable<FixedString64Bytes>(new FixedString64Bytes("Nameless Jelly"), NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner);

and when I change its value I get following errors:

NullReferenceException: Object reference not set to an instance of an object
Unity.Netcode.FixedStringSerializer`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer, T& value, T& previousValue) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariableSerialization.cs:701)
Unity.Netcode.NetworkVariableSerialization`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer, T& value, T& previousValue) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariableSerialization.cs:1642)
Unity.Netcode.NetworkVariable`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariable.cs:199)
Unity.Netcode.NetworkVariableDeltaMessage.Serialize (Unity.Netcode.FastBufferWriter writer, System.Int32 targetVersion) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs:99)
Unity.Netcode.NetworkMessageManager.SendMessage[TMessageType,TClientIdListType] (TMessageType& message, Unity.Netcode.NetworkDelivery delivery, TClientIdListType& clientIds) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/NetworkMessageManager.cs:641)
Unity.Netcode.NetworkMessageManager.SendMessage[T] (T& message, Unity.Netcode.NetworkDelivery delivery, System.UInt64 clientId) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/NetworkMessageManager.cs:814)
Unity.Netcode.NetworkConnectionManager.SendMessage[T] (T& message, Unity.Netcode.NetworkDelivery delivery, System.UInt64 clientId) (at ./Library/PackageCache/[email protected]/Runtime/Connection/NetworkConnectionManager.cs:1297)
Unity.Netcode.NetworkBehaviour.NetworkVariableUpdate (System.UInt64 targetClientId, System.Int32 behaviourIndex) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviour.cs:1004)
Unity.Netcode.NetworkBehaviour.VariableUpdate (System.UInt64 targetClientId) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviour.cs:950)
Unity.Netcode.NetworkBehaviourUpdater.NetworkBehaviourUpdate () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviourUpdater.cs:76)
Unity.Netcode.NetworkBehaviourUpdater.NetworkBehaviourUpdater_Tick () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviourUpdater.cs:129)
Unity.Netcode.NetworkTickSystem.UpdateTick (System.Double localTimeSec, System.Double serverTimeSec) (at ./Library/PackageCache/[email protected]/Runtime/Timing/NetworkTickSystem.cs:102)
Unity.Netcode.NetworkTimeSystem.UpdateTime () (at ./Library/PackageCache/[email protected]/Runtime/Timing/NetworkTimeSystem.cs:141)
Unity.Netcode.NetworkManager.NetworkUpdate (Unity.Netcode.NetworkUpdateStage updateStage) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkManager.cs:57)
Unity.Netcode.NetworkUpdateLoop.RunNetworkUpdateStage (Unity.Netcode.NetworkUpdateStage updateStage) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkUpdateLoop.cs:192)
Unity.Netcode.NetworkUpdateLoop+NetworkPreUpdate+<>c.<CreateLoopSystem>b__0_0 () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkUpdateLoop.cs:239)

Reproduce Steps

Of course I know the part of the code I've sent in the bottom is not a good idea but whenever I update the value by doing playerNickname.Value = new FixedString64Bytes("SOMESTRING"); I get the errors I've given

        [HideInInspector] public NetworkVariable<FixedString64Bytes> playerNickname = new NetworkVariable<FixedString64Bytes>(new FixedString64Bytes("Nameless Jelly"), NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Owner);

        public override void OnNetworkSpawn()
        {
            base.OnNetworkSpawn();

            if (IsOwner)
            {
                StartCoroutine(GetPlayerNick());
            }
        }

        private IEnumerator GetPlayerNick()
        {
            yield return new WaitForSeconds(0.5f);
            string nick = "Nameless Jelly";

            if (PlayerPrefs.HasKey("Nick"))
                nick = PlayerPrefs.GetString("Nick");
            Debug.Log("Setting nickname to " + nick);
            playerNickname.Value = new FixedString64Bytes(nick);
        }

Actual Outcome

Those errors:

NullReferenceException: Object reference not set to an instance of an object
Unity.Netcode.FixedStringSerializer`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer, T& value, T& previousValue) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariableSerialization.cs:701)
Unity.Netcode.NetworkVariableSerialization`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer, T& value, T& previousValue) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariableSerialization.cs:1642)
Unity.Netcode.NetworkVariable`1[T].WriteDelta (Unity.Netcode.FastBufferWriter writer) (at ./Library/PackageCache/[email protected]/Runtime/NetworkVariable/NetworkVariable.cs:199)
Unity.Netcode.NetworkVariableDeltaMessage.Serialize (Unity.Netcode.FastBufferWriter writer, System.Int32 targetVersion) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs:99)
Unity.Netcode.NetworkMessageManager.SendMessage[TMessageType,TClientIdListType] (TMessageType& message, Unity.Netcode.NetworkDelivery delivery, TClientIdListType& clientIds) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/NetworkMessageManager.cs:641)
Unity.Netcode.NetworkMessageManager.SendMessage[T] (T& message, Unity.Netcode.NetworkDelivery delivery, System.UInt64 clientId) (at ./Library/PackageCache/[email protected]/Runtime/Messaging/NetworkMessageManager.cs:814)
Unity.Netcode.NetworkConnectionManager.SendMessage[T] (T& message, Unity.Netcode.NetworkDelivery delivery, System.UInt64 clientId) (at ./Library/PackageCache/[email protected]/Runtime/Connection/NetworkConnectionManager.cs:1297)
Unity.Netcode.NetworkBehaviour.NetworkVariableUpdate (System.UInt64 targetClientId, System.Int32 behaviourIndex) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviour.cs:1004)
Unity.Netcode.NetworkBehaviour.VariableUpdate (System.UInt64 targetClientId) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviour.cs:950)
Unity.Netcode.NetworkBehaviourUpdater.NetworkBehaviourUpdate () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviourUpdater.cs:76)
Unity.Netcode.NetworkBehaviourUpdater.NetworkBehaviourUpdater_Tick () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkBehaviourUpdater.cs:129)
Unity.Netcode.NetworkTickSystem.UpdateTick (System.Double localTimeSec, System.Double serverTimeSec) (at ./Library/PackageCache/[email protected]/Runtime/Timing/NetworkTickSystem.cs:102)
Unity.Netcode.NetworkTimeSystem.UpdateTime () (at ./Library/PackageCache/[email protected]/Runtime/Timing/NetworkTimeSystem.cs:141)
Unity.Netcode.NetworkManager.NetworkUpdate (Unity.Netcode.NetworkUpdateStage updateStage) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkManager.cs:57)
Unity.Netcode.NetworkUpdateLoop.RunNetworkUpdateStage (Unity.Netcode.NetworkUpdateStage updateStage) (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkUpdateLoop.cs:192)
Unity.Netcode.NetworkUpdateLoop+NetworkPreUpdate+<>c.<CreateLoopSystem>b__0_0 () (at ./Library/PackageCache/[email protected]/Runtime/Core/NetworkUpdateLoop.cs:239)

And when I get value of playerNickname I just get the default value I initialised it with.

Expected Outcome

After I do playerNickname.Value = new FixedString64Bytes("SOMESTRING"); I expect change of that string value.

Screenshots

Just to show timing of errors:
image

Environment

  • OS: Ubuntu 24.04 LTS (x86_64) & Nvidia Driver Version: 550.90.07
  • Unity Version: 2022.3.42f1 LTS
  • Netcode Version: 1.10.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions