就活で精神攻撃を与えらた結果、こうなりゃ一人でやってやんよ!という理由でAndroidアプリの開発をしてるぼくの活動記録です。お金に成るクオリティにしたいのです^p^
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
とにかくオンラインゲームが作りたい!
ということで行き着いた結果がphotonだ。
これのcloudサービスを使えばサーバってやつを自ら得ずともオンラインゲームが作れるとか作れないとか・・・

ということでものは試しに使ってみた。

結果。。。。

かなり簡単にオンライン系っぽくできる事がわかった!!
といってもチュートリアルを触っただけだから自分が実装できるかどうか…

とりあえず触ってみてわかって来た事をメモメモ。
思いついた順序で書き記す。

まずvoid OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
これはリスナーだろうという事がわかった。
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){
   if (stream.isWriting){
       stream.SendNext(transform.position);//"Encode" it, and send it
   }else {
       transform.position = (Vector3)stream.ReceiveNext();
   }
}
上記のように綴られ
stream.isWritingがtrueならtransform.positionを送信。
falseなら受信transform.positionに受信しているのだと思われ。
では、stream.isWritingとは何なのか?

おそらく、一番始めにアクセスしたユーザーのことだと思う。俗にいうマスターってやつかな。
一番はじめにサーバーにアクセスする事でこのスクリプトをアタッチしたオブジェクトの書き込み権限を持つものだと解釈。=stream.isWritingがtrue。
上に記したスクリプトの場合、マスターになったユーザ(stream.isWriting==true)がオブジェクトを移動させる事でOnPhotonSerializeViewが作動し(実際には動かさなくても作動しているが)現在のオブジェクトtransformをサーバーに書き込む。
その他の非マスターユーザ(stream.isWriting==false)はオブジェクトのtransformをサーバーから受信し反映させる。
その結果両者間でオブジェクトの位置が同期する。
といった所だろう。
追記:どうもphotonViewをアタッチしたとき、observedにスクリプトをドロップして同期の処理を行ったりするけど、そのスクリプト内にこのメソッドがないとエラーが出る。中身は空っぽでもいいのでOnPhotonSerializeView()は確実に記述しよう。RPCでの処理に頼って抜かしていたらエラーが出たのでメモ。

その2、RPC(remote procedure call)
翻訳すると遠隔呼び出しの手続き、って感じ。
こっちの指示でこのスクリプトがアタッチされた(必要があるのかないのか)よそのオブジェクトに命令する。
void Update(){
(省略)
   if (Vector3.Distance(transform.position, lastPosition) >= 0.01f){
      lastPosition = transform.position;

      photonView.RPC("SetPosition", PhotonTargets.Others, transform.position);
    }
}

[RPC]
void SetPosition(Vector3 newPos){
   transform.position = newPos;
}

上記のupdate内で使用されてる
photonView.RPC("SetPosition", PhotonTargets.Others, transform.position);

[RPC]
void SetPosition(Vector3 newPos){
   transform.position = newPos;
}
を呼び出している。多分[RPC]でマーキングする必要あり。

この時photonView.RPC()は何をしているか?
まず第一引数"SetPosition"はこのスクリプト内のvoid SetPosition(Vector3 newPos)を作動させるのに必要。
次に第二引数"PhotonTargets.Others"、これは誰がこのメソッドを使用するかというのを指定してる。PhotonTargets.Othersは自分(マスター?)以外。
試しにPhotonTargets.の値をマスターみたいなやつにしたら非マスター側ではポジションの変化はしなかった。
で第三引数"transform.position"はvoid SetPosition(Vector3 newPos)の第一引数に入れる値を入れてやる。

上記の結果、
このオブジェクトをマスターが操作
 →一定の距離が離れると距離を更新してRPC発動
  →非マスター側でSetPosition()が使用される
結果同期する。
こんな感じか・・・?

おそらく、とか、だろう。とか多用するけど、手探りだからしょうがない。
まったく見当違いの可能性もあるから、気づいたら修正したい。
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://unitydev.blog.fc2.com/tb.php/59-572c412a
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。