en / ja

概要

説明

PlayCanvasPhotonを利用して簡単にマルチプレイヤーWebGLアプリケーションを作成することができます。

こちらはphoton_JavaScriptSDKをPlayCanvas向けにラップし、手軽に使用可能にしたプラグインです。 このプラグインを利用することで、既存のPlayCanvasプロジェクトに手軽にPhotonを利用したマルチプレイが組み込むことが可能です。

このプラグインはPhoton cloud,Photon serverどちらも対応しています。

デモ (photon cloud 20ccu @東京・日本リージョン)

移動…WASD ショット…enter (モバイル端末、ゲームパッド対応)

6画面デモ *PCのみ

Project overview PlayCanvasページに遷移します。このプロジェクトはすべてパブリックです。

要件

PlayCanvasのみ

使用方法

  1. プラグインをダウンロードします
  2. ダウンロードしたファイルをすべてPlayCanvasプロジェクトへアップロードします
  3. app.jsをPlayCanvasで読み取り可能な状態のスクリプトにします
  4. app.jsはPlayCanvasのオブジェクトである必要があります。 INSPECTOR > SCRIPT > SCRIPTSから "PARSE"をクリックしてください
  5. "SCRIPT LOADING ORDER"を変更します
  6. Photon-Javascript_SDK.js及びdemoloadbalancing.jsはapp.jsの前に呼ばれる必要があるので、順番を変更します。
  7. app.jsを任意のオブジェクトにアタッチします
  8. parseをした後に、情報を入力してください.PHOTON SERVERの"server address"に値がある場合、pluginはphoton serverを使用します。Photon cloudを使用する場合、この欄は空白にしてください
  9. Photonを使用する準備ができました

コーディング

app.jsをROOTオブジェクトにアタッチした場合

メッセージ送信

var photonobject;
somescript.prototype.initialize = function(){
    photonobject = this.app.root.children[0];//ROOTオブジェクトを取得
};

somescript.prototype.update = function(dt){
    photonobject.photon.raiseEvent(1, this.entity.getLocalPosition()); //イベントコード1でポジションデータを送信
    photonobject.photon.raiseEvent(2, this.entity.getLocalEulerAngles()); //イベントコード2で回転データを送信
};

メッセージ受信

var photonobject;
somescript.prototype.initialize = function(){
    photonobject = this.app.root.children[0];//ROOTオブジェクトを取得
};

somescript.prototype.update = function(dt){
    photonobject.photon.onEvent = function(code, content, actorNr){//メッセージを受け取った際に呼び出されるコールバック
        switch(code){
            case 1: 
                console.log(content.data[0]); // Position.x
                console.log(content.data[1]); // Position.y
                console.log(content.data[2]); // Position.z
                break;
            case 2:
                console.log(content.data[0]); // angle.x
                console.log(content.data[1]); // angle.y
                console.log(content.data[2]); // angle.z
                break;
        }
    };
};

ルーム入室時

//in update method...
photonobject.photon.onActorJoin = function(actor){//Actorが入室した際に呼び出されるコールバック
    if(actor.actorNr == this.myActor().actorNr)
    {
        //自身が入室したとき
    }
    else
    {
        //他のプレイヤーが入室したとき
    }
};

//自分が入室したときに他のプレイヤーがすでに入室していた時の処理 
photonobject.photon.onJoinRoom = function(){
    for(var i = 1;i < this.myActor().actorNr;i++){
        if(this.myRoomActors()[i]){
            if(!this.myRoomActors()[i].isLocal){
                //ルームにいるプレイヤーの数だけループする
            }
        }
    }
};

ルーム退室時

//in update method...
PhotonController.photon.onActorLeave = function(actor,cleanup){//Actorが退出した際に呼び出されるコールバック
    if(actor.actorNr == this.myActor().actorNr)
    {
        //自身が退室したとき
    }
    else
    {
        //他のプレイヤーが退室したとき
    }
};

ヒント

///////////////シンプルなオブジェクト同期///////////////

// 1.他のプレイヤーのオブジェクトを生成する
photonobject.photon.onActorJoin = function(actor){//Actorが入室した際に呼び出されるコールバック
    if(actor.actorNr != this.myActor().actorNr){
        //他のプレイヤーが入室したとき
        otherobject.generate(); // 他のプレイヤーのオブジェクトを生成する
    }
};

//自分が入室したときに他のプレイヤーがすでに入室していた時の処理 
photonobject.photon.onJoinRoom = function(){
    for(var i = 1;i < this.myActor().actorNr;i++){
        if(this.myRoomActors()[i]){
            if(!this.myRoomActors()[i].isLocal){
                //ルームにいるプレイヤーの数だけループする
                otherobject.generate(); // 他のプレイヤーのオブジェクトを生成する
            }
        }
    }
};

// 2. プレイヤーのスクリプト:オブジェクトのトランスフォーム情報を送信する
playercontrol.prototype.send = function(){
    photonobject.photon.raiseEvent(1, this.entity.getLocalPosition()); // イベントコード1でポジションデータを送信
    photonobject.photon.raiseEvent(2, this.entity.getLocalEulerAngles()); // イベントコード2で回転データを送信
};

// 3. 他のプレイヤーを管理するスクリプト:トランスフォーム情報を受け取る
otherplayercontrol.prototype.recive = function(){
    photonobject.photon.onEvent = function(code, content, actorNr){//メッセージを受け取った際に呼び出されるコールバック
        switch(code){
            case 1: 
                otherobject.setLocalPotisions(content.data[0],content.data[1],content.data[2]);
                break;
            case 2:
                otherobject.setLocalEularAngles(content.data[0],content.data[1],content.data[2]);
                break;
        }
    };
};

// 4. 退出時:オブジェクトを消去する
PhotonController.photon.onActorLeave = function(actor,cleanup){//Actorが退出した際に呼び出されるコールバック
    if(actor.actorNr != this.myActor().actorNr)
    {
        //他のプレイヤーが退室したとき
        otherobject.destroy();
    }
};

///////////////シリアライズ, デシリアライズ///////////////
somescript.prototype.send = function(){
    var message = "";
    message += this.entity.getLocalPosition().x + ",";
    message += this.entity.getLocalPosition().y + ",";
    .
    .
    .
    message += this.entity.getLocalEulerAngles().z;

    var oldmessage = "";
    if(message != oldmessage){
        PhotonController.photon.raiseEvent(1,message);
        oldmessage = message;
    }
};

somescript.prototype.recive = function(){
    photonobject.photon.onEvent = function(code, content, actorNr){//メッセージを受け取った際に呼び出されるコールバック
        switch(code){
            case 1: 
                var recivemes;
                recivemes = content.data.split(",");
                otherobject.setLocalPotisions(recivemes[0],recivemes[1],recivemes[2]);
                otherobject.setLocalEularAngles(recivemes[3],recivemes[4],recivemes[5]);
                break;
        }
    };
};

ドキュメント

Photon-Javascript_SDK Client API Documentation

ライセンス

MIT License

Copyright (c) 2016 Ryotaro Tsuda

Author

ryotaro portal blog playcanvas

last update 2017-01-03 13:23:56