🌐
【Netcode for GameObjects】string型をNetworkValue、NetworkListで扱う方法【Unity】
症状
String型を含んだstructだったり、stringそのものをNetworkValueにしようとすると、
"xxx"と、入れ子になっているあらゆるレベルのすべてのフィールドは、ジェネリック型またはメソッド'NetworkList<T>'のパラメーター'T'として使用するために、Null 非許容の値型でなければなりません
みたいなことを言われて怒られます。
解決方法
下記のようなINetworkSerializableを継承したstructを用意し、それを利用することでほぼstring型のような使い方ができるようになります。
NetworkString.cs
public struct NetworkString : INetworkSerializable
{
private FixedString32Bytes info;
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref info);
}
public override string ToString()
{
return info.ToString();
}
public static implicit operator string(NetworkString s) => s.ToString();
public static implicit operator NetworkString(string s) => new NetworkString() { info = new FixedString32Bytes(s) };
}
Manager.cs
public class Manager : NetworkBehaviour
{
private NetworkVariable<NetworkString> playerName = new NetworkVariable<NetworkString>();
public void SetPlayerName(string gamePlayerName)
{
playerName.Value = gamePlayerName;
}
}
Discussion