Skip to main content

Custom packed data

Use a [TransSync] byte[] field when you need precise control over bandwidth. This is the recommended pattern for pose data, dense transform data, blendshape selections, and other high-frequency values.

Packet layout

Start every packet with a version byte:

OffsetValue
0Packet version.
1..nData for that version.

Receivers can then ignore unknown versions instead of misreading bytes.

Example packet

using K13A.TSMP;
using K13A.TSMP.Udon;
using UnityEngine;

public class PackedPointSync : TSMPNetworkBehaviour
{
[TransSync("point.packed")]
public byte[] pointBytes = new byte[13];

public Transform target;

public override void TSMPBeforeEncode()
{
if (target == null || pointBytes == null || pointBytes.Length < 13)
{
return;
}

Vector3 p = target.localPosition;
pointBytes[0] = 1;
Binary.WriteFloat32(pointBytes, 1, p.x);
Binary.WriteFloat32(pointBytes, 5, p.y);
Binary.WriteFloat32(pointBytes, 9, p.z);
}

public override void OnTSMPVariableReceived()
{
if (target == null || pointBytes == null || pointBytes.Length < 13 || pointBytes[0] != 1)
{
return;
}

float x = Binary.ReadFloat32(pointBytes, 1);
float y = Binary.ReadFloat32(pointBytes, 5);
float z = Binary.ReadFloat32(pointBytes, 9);
target.localPosition = new Vector3(x, y, z);
}
}

Guard rules

Always validate:

  • byte[] is not null.
  • Length is large enough before every read.
  • Version is supported.
  • Index values are inside receiver-side allowlists.
  • Target components are assigned.

Malformed packets should be skipped quietly unless you are actively debugging.

Bandwidth rules

PatternBetter option
Many booleansPack bits into one byte.
Many normalized weightsUse byte values for 0..100 or 0..255.
Positions with known rangeQuantize to ushort or short.
Positions with unknown rangeUse Float32 only for values that need it.
Repeated stringsSend a small enum/index instead.

Compatibility

Changing a packet layout is a protocol change for your component. Increment the version byte and keep the old read path until older senders are no longer used.