2014年8月2日土曜日

なんかphotonでエラーログが出る

お疲れ様です、siroponnです。日々熱いですね。

さて、タイトルの件についてですが。

今回やりたかった処理は、
ボックスがプレイヤーか地面に接触した時破壊する。
その後エフェクトプレファブをインスタンスして、爆発を出し、周りのボックスも破壊する。というものです。

photonを使っていて以下のエラーログを見たことありませんか?

「PhotonView with ID 2002 has no method "DestroyObjectRPC" marked with the [RPC](C#) or @RPC(JS) property! Args: 」

えーと、 "DestroyObjectRPC"というメソッドを持っていない、そして[RPC]表記していないっと。
ソースを見る。

↓こちらのメソッドを通してRPC通信する
 public void DestroyThisObject()
{
           myPhotonView.RPC("DestroyObjectRPC", PhotonTargets.All);
}

[RPC]
void DestroyObjectRPC()
{
        if (myPhotonView.isMine)
        {
            PhotonNetwork.Destroy(this.gameObject);
        }       
}

されていますね。
そこで、RPCを呼ばないで直接PhotonNetwork.Destroyを呼んだ。


public void DestroyThisObject()
{
         if(myPhotonView.isMine)
         {
                  PhotonNetwork.Destroy(this.gameObject);
         }
         //myPhotonView.RPC("DestroyObjectRPC", PhotonTargets.All);
}

こうしたら、一応エラーは消えました。

が。
リモートクライアントに当たった時反応してくれません。当たり前で、isMineにて判定を行っていますからね。

次の策。↓ というか完全に直感で書いた。

public void DestroyThisObject()
{
        if (this.myPhotonView.isMine)
            PhotonNetwork.Destroy(this.gameObject);
        else
            myPhotonView.RPC("DestroyObjectRPC",PhotonTargets.Others);

        //myPhotonView.RPC("DestroyObjectRPC", PhotonTargets.All);
}

こうしたら意図したとおりに直りました。なぜなんだ。おい。

RPCでPhotonNetwork.Destoryを呼ぶのがいけないと思っていたが。
RPCのTargets.AllでPhotonNetwork.Destroyを呼ぶのがいけないのか???

わからん。

思い当たる節があるとすれば、まだブログには書いてませんが、ownerIDをゲーム処理中に書き変えていることでしょうか……。ローカルとリモートを入れ替えたりしているので、それかもしれません。

また、エフェクトのプレファブのスクリプトにも問題がありそうです。
爆発した際、爆発に巻き込まれたボックスを破壊している処理がありますから。ただ、エフェクトを呼んだボックスはインスタンスIDで判定して破壊されるのを防いでいるんですけどね。

とりあえず、PhotonNetwork.InstantiateやPhotonNetwork.Destroyを呼ばないで、マニュアルでインスタンスとデストロイを行った方が安全かもしれない。

もやもやするが、ここで立ち止まっているとプロジェクトが進まないので一旦、置いておく。

だれか、この原因を詳しく解明してくれ。

次回は、問題があるかもしれないownerIDについて書こうと思います。

では、ノシ
 

0 件のコメント:

コメントを投稿