0 支持
(180 ポイント)
OnMonobitSerializeViewでColor32型を送受信したいのですが下記のリンク先に表記されているデータ型しか使用できないのでしょうか?

使用できるデータ型をカスタムする等の方法がありましたらご教授お願いいたします。

http://www.monobitengine.com/doc/mun/contents/Feature/RPC.htm

もしデータ型がカスタム不可でしたら、送信側で一時的にColor32をVector4に変換し、受信側でVector4をColor32に変換する方法をとろうかと思っているのですが、少し手間のかかる方法だと思っており他に良い方法があればご教授お願いいたします。

回答 1

0 支持
(2.2k ポイント)
編集
Color32はbyte要素で成り立っているため、float要素で成り立つVector4型に変換するのは「多分ですが」お勧めできません。
(プログラム上のどこかで非数判定が入った場合、正常に動かなくなる可能性があるので)

StackOverflowからの引用ですが
https://stackoverflow.com/questions/47575438/convert-color32-array-to-byte-array-to-send-over-network
ここにある Color32Array というクラスを使い、

1. 送信側クライアントでは Color32Array.colors にデータを代入し、Color32Array.byteArray で「byte[] 型に変換して」送信する(byte[] に変換できれば、MUNで送信可能なデータ形式になるので問題ない)

2. 受信側クライアントでは受け取った byte[] データを Color32Array.byteArray にデータを代入し、使用する場合には Color32Array.colors で「Color32[] 型に変換して」使用する

とすれば、問題なく相互変換可能なデータで受け取ることができると思います。

Color32 を配列にしたくなければ、上述の引用元の Color32Array について
    public Color32[] colors;

    public Color32 colors;
に変更すれば行けるのではないかと。
(180 ポイント)
お返事ありがとうございます。

上記回答の内容を試してみたのですがUnityコンソールに
Specified argument was out of the range of valid values.
Parameter name: This type is not supported. UnityEngine.Color32[]

とエラーになってしまい、値の送信がうまくいきません
ソースを用意したのでご確認いただけたら幸いです。


 [StructLayout(LayoutKind.Explicit)]
    public struct Color32Array
    {
        [FieldOffset(0)]
        public byte[] byteArray;

        [FieldOffset(0)]
        public Color32[] colors;
    }
      
public void OnMonobitSerializeView(MonobitStream stream, MonobitMessageInfo info)
{
    Color32Array colorArray = new Color32Array();

    if(stream.isWriting)
    {
        colorArray.colors = colors;
        byte[] byteArray = colorArray.byteArray;
  
        stream.Enqueue(byteArray);
    }
    else
    {
        byte[] byteArray = (byte[])stream.Dequeue();
        colorArray.byteArray = byteArray;
        
        Color32[] colors = colorArray.colors;
    }
}
(2.2k ポイント)
編集
回答が遅くなってすみません。調査してみたら内部的に byteArray が Color32[] にキャストされたままで動作するので、正常に動きませんね。

面倒ですが、以下のように rgba を byte で送るしかなさそうです。(Color32Arrayは不要なので削除してください)

    public void OnMonobitSerializeView(MonobitStream stream, MonobitMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.Enqueue(colors.Length);
            foreach (Color32 rgba in colors)
            {
                stream.Enqueue(rgba.r);
                stream.Enqueue(rgba.g);
                stream.Enqueue(rgba.b);
                stream.Enqueue(rgba.a);
            }
        }
        else
        {
            int length = (int)stream.Dequeue();
            List<Color32> colorList = new List<Color32>();
            for (int index = 0; index < length; ++index)
            {
                Color32 color = new Color32();
                color.r = (byte)stream.Dequeue();
                color.g = (byte)stream.Dequeue();
                color.b = (byte)stream.Dequeue();
                color.a = (byte)stream.Dequeue();
                colorList.Add(color);
            }

            colors = colorList.ToArray();
        }
    }
(180 ポイント)
ありがとうございます、解決いたしました。
...