質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1208閲覧

Unityでシリアライズを自作する方法がわからない。

ligo

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/08/24 06:51

編集2020/08/24 07:20

前提:
以前、Photonを使っていてRPCを試してみました。しかし、第三引数以降で使えない型があり色々調べて「シリアライズを自作することで使えるようになる」とあるページで拝見させていただき、やってみようと思ったのですが理解できずに結局は期待したようなものができず挫折してしまいました。
しかし、やっぱり理解しておいた方がいいと思い質問させていただきます。

疑問:
Photonを使ってボールが当たった時に反応させる同期を取るために、PunRPCというものを使おうと思い

photonView.RPC( "MethodRPC", PhotonTargets.All, transform ); コード

このようなコードでRPCを呼び出そうと思いました。しかし、transform型は対応しておらずエラーが出てしまいました。
ネット上で色々な記事を見させていただき、解決法を探しました。そこで以下のような記事を拝見させていただきました。
引用元は
https://www.urablog.xyz/entry/2016/09/21/223002
です。

ただ、シリアライズは自作することが出来ます。

 自分でシリアライズ、デシリアライズ関数を作成することで、どんな型でもRPC()関数の引数として使用することが出来ます。
試しにColorのシリアライズを自作してみましょう。

その記事に載っていた、コードは以下のようなものでした。

using

1 2public static class ColorSerializer 3{ 4 public static void Register() 5 { 6 ExitGames.Client.Photon.PhotonPeer.RegisterType( typeof( Color ), (byte)'C', SerializeColor, DeserializeColor ); 7 } 8 9 private static byte[] SerializeColor( object i_customobject ) 10 { 11 Color color = (Color)i_customobject; 12 13 var bytes = new byte[ 4 * sizeof( float ) ]; 14 int index = 0; 15 ExitGames.Client.Photon.Protocol.Serialize( color.r, bytes, ref index ); 16 ExitGames.Client.Photon.Protocol.Serialize( color.g, bytes, ref index ); 17 ExitGames.Client.Photon.Protocol.Serialize( color.b, bytes, ref index ); 18 ExitGames.Client.Photon.Protocol.Serialize( color.a, bytes, ref index ); 19 20 return bytes; 21 } 22 23 private static object DeserializeColor( byte[] i_bytes ) 24 { 25 var color = new Color(); 26 int index = 0; 27 ExitGames.Client.Photon.Protocol.Deserialize( out color.r, i_bytes, ref index ); 28 ExitGames.Client.Photon.Protocol.Deserialize( out color.g, i_bytes, ref index ); 29 ExitGames.Client.Photon.Protocol.Deserialize( out color.b, i_bytes, ref index ); 30 ExitGames.Client.Photon.Protocol.Deserialize( out color.a, i_bytes, ref index ); 31 32 return color; 33 } 34 35}

しかしこれを見ても、今の僕には理解することができませんでした。

どこが、シリアライズに関わっているところなのか、そして、その部分では何をしているのか、教えていただきたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/08/24 07:11 編集

シリアライズとは、オブジェクトをバイト列に変換することです。どのようにしたら良いかはそれぞれの状況によって全く違います。この質問だけで答えられる人はいません。 なぜか文脈を無視して文の一部だけ聞きたがる人が多いですが、読むなら最初から最後まで読み、人に尋ねるときにはその情報の入手先を書きましょう。
退会済みユーザー

退会済みユーザー

2020/08/24 06:56

「シリアライズ」をキーワードにググれば山ほど役に立つ情報はヒットするはず。たぶんそういうことはやったうえでの質問だと思いますが、であれば、例えばどれか自分が分かりやすいと思った記事を例にとって、それの疑問点を聞くとか、具体的な話にした方が良いと思いますよ。
ligo

2020/08/24 07:09

ありがとうございます。 非常に抽象的な内容で申し訳ございませんでした。 質問を修正させていただきました。
Zuishin

2020/08/24 07:13

情報の入手先を書け。
Zuishin

2020/08/24 07:13

画像ではなくテキストで引用しろ。
ligo

2020/08/24 07:15

ご回答ありがとうございます。 申し訳ありません。そのようなことを心得ていなかったもので、もう一度編集させていただきます。
Zuishin

2020/08/24 07:16

文が長くても全部読め。短い文は書きにくいし命令形になる。
ligo

2020/08/24 07:28

失礼ですが、文というのはなんの文のことでしょうか? 参考にさせていただいたページは読んだのですが、Unityに関してもあまりわかってないので理解することができませんでした。 こちらの、理解力不足であることは承知しているのですが、教えていただけると幸いです。
ligo

2020/08/24 07:32 編集

たびたび、失礼しました。文というのは一番最初にお答え頂いた文のことですね。誠に申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問