概要
説明
PlayCanvasとPhotonを利用して簡単にマルチプレイヤーWebGLアプリケーションを作成することができます。
こちらはphoton_JavaScriptSDKをPlayCanvas向けにラップし、手軽に使用可能にしたプラグインです。 このプラグインを利用することで、既存のPlayCanvasプロジェクトに手軽にPhotonを利用したマルチプレイが組み込むことが可能です。
このプラグインはPhoton cloud,Photon serverどちらも対応しています。

デモ (photon cloud 20ccu @東京・日本リージョン)
移動…WASD ショット…enter (モバイル端末、ゲームパッド対応)
6画面デモ *PCのみ
Project overview PlayCanvasページに遷移します。このプロジェクトはすべてパブリックです。
要件
PlayCanvasのみ
使用方法
- プラグインをダウンロードします
- ダウンロードしたファイルをすべてPlayCanvasプロジェクトへアップロードします
- app.jsをPlayCanvasで読み取り可能な状態のスクリプトにします app.jsはPlayCanvasのオブジェクトである必要があります。 INSPECTOR > SCRIPT > SCRIPTSから "PARSE"をクリックしてください
- "SCRIPT LOADING ORDER"を変更します Photon-Javascript_SDK.js及びdemoloadbalancing.jsはapp.jsの前に呼ばれる必要があるので、順番を変更します。
- app.jsを任意のオブジェクトにアタッチします
- parseをした後に、情報を入力してください.PHOTON SERVERの"server address"に値がある場合、pluginはphoton serverを使用します。Photon cloudを使用する場合、この欄は空白にしてください
- 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