前提:
以前、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}
しかしこれを見ても、今の僕には理解することができませんでした。
どこが、シリアライズに関わっているところなのか、そして、その部分では何をしているのか、教えていただきたいです
あなたの回答
tips
プレビュー