そもそもなぜList型をRPCで使えないのか
PhotonのRPC機能を用いてList型を渡せないのは Photonがサポートしていない型 だからです。
詳しいことは公式のリファレンスを見れば書いてありますが、基本的な型と、その配列にしか対応していません。そのため、そのままList型を引数とするメソッドをRPC化して実行すると以下のエラーが出ます。
[PunRPC]
void ListRPC(List<int> intlist)
{
return;
}
private void Start()
{
List<int> Intlist = new List<int>();
photonView.PRC(nameof(ListRPC), RpcTarget.All, Intlist);
///Exception: Write failed. Custom type not found: System.Collections.Generic.List`1[System.Int32]
}
エラーの内容としてはSystem.Int32のカスタムタイプは見つからない、といっています。
このエラーの解決方法はざっくりと以下の2つです。
- List型を使わなくていいようにメソッドを改変する。
- カスタムタイプにList型を登録する。
1. List型を使わなくていいようにメソッドを改変する。
そもそもList型は他の型に比べると使用するバイト数が大きいため、なるべくListのままで通信するのは避けるのが無難と思います。(わざわざカスタムタイプを分けてるのはPhotonが推奨していない?)
そのため、コード上別の方法が使える場合、少し工夫してList型以外で受け渡しできると軽量化にもつながると思います。
一つ目の方法としては無理矢理にでも配列にしてしまう、という方法です。かなり乱暴ではありますが、割とどんなときでも使える万能策です。
[PunRPC]
void ListRPC(int[] intarray)
{
return;
}
private void Start()
{
List<int> intList = new List<int>();
int[] intArray = new int[intList.Count];
for(int i = 0; i < intArray.Length; i++)
{
intArray[i] = intList[i];
}
photonView.PRC(nameof(ListRPC), RpcTarget.All, IntArray);
}
二つ目は、一つずつデータを渡す方法です。こちらはListの長さが短い時に使える方法です。
こちらはあまりおすすめできませんが、特定の条件次第では使えるかもしれないので一応記載しておきます。
List<int> IntList = new List<int>();
[PunRPC]
void ListRPC(int num)
{
intList.Add(num)
return;
}
private void Start()
{
List<int> intList = new List<int>();
for(int i = 0; i < intList.Count; i++)
{
photonView.PRC(nameof(ListRPC), RpcTarget.All, intList[i]);
}
}
2. カスタムタイプにList型を登録する。
こちらはリファレンスを参照していただいた方がいいと思うのでこの記事では省略させていただきます。
こちらのサイトもわかりやすいので紹介しておきます。