🌐

【Netcode for GameObjects】string型をNetworkValue、NetworkListで扱う方法【Unity】

2022/03/29に公開

症状

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