0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

List型をphotonView.RPCでやりとり出来ない時の迂回案

Posted at

そもそもなぜList型をRPCで使えないのか

PhotonのRPC機能を用いてList型を渡せないのは Photonがサポートしていない型 だからです。
詳しいことは公式のリファレンスを見れば書いてありますが、基本的な型と、その配列にしか対応していません。そのため、そのままList型を引数とするメソッドをRPC化して実行すると以下のエラーが出ます。

int型のListの場合
[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つです。

  1. List型を使わなくていいようにメソッドを改変する。
  2. カスタムタイプに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型を登録する。

こちらはリファレンスを参照していただいた方がいいと思うのでこの記事では省略させていただきます。

Photonでの直列化 | Photon Engine

こちらのサイトもわかりやすいので紹介しておきます。

PUN2(Photon Unity Networking 2)で始めるオンラインゲーム開発入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?