オンラインゲームが作りたい①〜UnityでPUN2

唐突にオンラインゲームが作りたくなったのでunityで開発を始めました。

イメージ的にはバトロワfpsの2d版みたいな感じを想定してる。

オンラインゲームという性質上今までのアプリのようにダウンロード数十人じゃ成り立たないので、ダウンロード数増えればいいなぁという願望を込めてブログに開発日記を書くことにしました(打算まみれ笑)。

まあそんな冗談はともかく現状こんな感じまで来た。

ここまでですでにまずまず大変だったので知見を共有していく。

タッチ操作の実装

これがかなり苦戦した。

最終的にTouchScriptでjoystickを実装することで落ち着いた。

最初Joystick PackのアセットとtouchscriptのtapGestureを用いて実装したが、

画面どこからでもジョイスティックを動かせるようにすると(dynamic joystick)、タップしたときにジョイスティックがタップ先に移動して上手く機能しなかった。

Joystick Packはコード見た感じdefaultのタップイベント検知して動かしてる感じでマルチタップに対応させるのは大変そうだったので、

touchScriptのイベントを使うようにJoystick Packの内部コードを完全に書き直した。

コードはここにおいてある。

https://github.com/Yanto7369/-JoyStickOnTouchScript

Joystick Packのコードがベースになっているので、Joystick Pack使ってた人ならすぐに使えると思う。

変更点は主に2つ

1つ目はタッチがジョイスティックに対する操作か単なるタップかを判定する機能。

TimeLimitはタップかを判定する時間。defaultでは0.01fでこの時間以上画面に触れるとジョイスティックに対する操作と扱う。

TimeLimitWhileDraggingはジョイスティックの操作中にタップかを判定する時間。defaultでは0.40fでこの時間未満指が画面に触れるとタップ操作が行われる。マルチタップに対応していて、ジョイスティックを動かしながらタップ操作も検知する。

タップ操作時の処理はJoystick.OnTappedに登録する。
var joystick=GetComponent<DynamicJoyStick>();
joystick.OnTapped+=myMethod
みたいな感じ。

2つ目はタッチ操作を検出する画面の範囲。

TouchScriptのDefaultLayerを使っている。JoyStickオブジェクトのLayerをJoystickなどと設定してStandardLyaerのLayerMaskに設定する。

上の画像のような感じです。JoyStickオブジェクトが配置されている画面部分を触ればタッチを検知する。上の例だと全画面になっている。

注意点はTouchScriptのLayerは重なっている場合一方しか検知しないみたいで、Joystickオブジェクトがある部分はこれしかタッチが反応しなくなってしまうこと。

もともとタップ操作は独立して設定させたかったけど、Joystickに書くことになったのはこの仕様のせい。

これでジョイスティック移動と弾の発射が両立できる。

オンライン同期させる

これがほんとに苦戦した。

まずphotonnetwork.instantiateとRPCの使い分けについて。

RPCは初期条件を与えられたら未来の行動が確定するようなオブジェクトの生成に使う。

ややこしく書いたが、結局プレイヤー入力を受けない物理法則に従うオブジェクト全般がこれでいいと思う。自分のゲームではエネミーと弾丸の生成をRPCで行った。

あとphotonnetwork.instantiateを使うと同期ずれがけっこう発生してつらいのでそれもポイント。

RPCはオブジェクト生成のキャッシュが残ってしまうので

参考URL

https://qiita.com/su10/items/4bae56bc814c4e6a2bc0#%E3%82%84%E3%82%8A%E6%96%B9%E3%81%94%E3%81%A8%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81

その点で使用を躊躇していたが、ObjectPoolと組み合わせるとそこまで問題にはならないと思う。

あとRPCでphotonViewを持ったPrefabを生成するときに注意点が一個あって、

RPCで生成する際はPhotonViewのIDを手動で設定しないといけない。

参考URL

https://forum.photonengine.com/discussion/9724/illegal-view-id-0-method-loadplayer-go-networking-manager

Illegal view ID:0 methodのエラーが出てるならこれが問題になってる気がする。

あと、実装方法が分からなかったのは敵をスポーンさせるスクリプトをオンラインで動作させる方法、つまり全員共有で一回スクリプトを動作させる方法を見つけるのに時間がかかったのでメモ。

この問題はMasterClientで解決。

if(photonView.isMasterClinet)でif文以下はmasterclientでしか実行されない。

簡単だね。ただ意外と知らないとハマる。

以上がPUN2を触る上での知見のようなもの。

この文章は初見向けではないので、PUN2触ったばかりなら

https://junyablog.site/post-3034/

この人のブログとか結構参考になるかも。

ではまた次回

yanto

大学生です。atcoder緑。ubuntuの民。ブログの他にアプリ開発とかやってます。趣味は読書、プログラミング。アニメ、映画も時々見ます。サムネイルに使わせていただいているサイト ・photoAC(https://www.ac-illust.com/) ・フリー素材ぱくたそ(www.pakutaso.com)

おすすめ

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA