アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

オンラインゲーム制作で初心者がやってはいけない3つの罠

こんにちは!ジェイです。オンラインゲーム制作は難しいからできそうにない…興味はあるけど難しいんでしょ?と思ってる方は必見です。

結論からいうと、要点さえ押さえておけば、オンラインゲーム制作はそこまで難しくないですが、ある条件の仕様で作ってしまうと、オフラインゲームに比べて劇的に難しくなります。

記事内広告

オンラインゲーム制作を難しくする条件

  1. リアルタイム制の高いゲームで途中入室を許可する
  2. 武器やアイテムなど装備するものを実装する
  3. 車などのRigidbodyを使う乗り物を実装する

以上の3つをすべて掛け合わせてしまうと、オンラインゲーム制作は非常に難易度が高いものになってしまいます。

リアルタイム制の高いゲームで途中入室を許可すると難しくなる理由

結論からいうとプレイヤーの状態に差が出てしまい管理するのが難しくなるからです。

例えば、まず最初にルーム入ったプレイヤーAがいたとします。その人が銃を拾うなりアイテムを拾うなりの行動をして、ルーム入出時に初期の状況と違う状況になったとします。その後、違うプレイヤーBが入ってきて、最初に入ったプレイヤーAが銃を撃つやアイテムを捨てるなどの行動をすると、エラーが起きてしまいます。

上記の行動でエラーが起きてしまう理由は、プレイヤーAから見た画面では、プレイヤーAは武器やアイテムを持っていますが、後から入ってきたプレイヤーBから見た画面では、初期の状態で武器もアイテムも持っていません。その状態で、「銃を撃つ」や「アイテムを捨てる」などすると、持っていない「銃を撃つ」や「アイテムを捨てる」事になりエラーが起きてしまいます。

車などのRigidbodyを使う乗り物を実装すると難しくなる理由

これも結論からいうと

  • 乗り物を扱うには所有権を理解してないと意図した動作をさせられない
  • Rigidbodyを使うとカメラや物体のブレがひどくなる

まず所有権についてわからない方は以前の記事がありますのでこちらを参考にしてください。

Rigidbodyを使うとカメラや物体のブレがひどくなるについてもPhotonCloudPUN2なら、設定を正しくする事で何とか対応できます。MonobitEngineはRigidbodyとの相性が悪いので、なるべく使わないで同期するようにしましょう。

PhotonCloudPUN2でRigidbodyを使った同期でベストな方法は以下で解説してます。

カメラや物体のブレRigidbodyを使った同期はこれを見れば大体解決できます。それでは、次にプレイヤーの状態の差を埋める方法について考えてみましょう。

これも結論からいうと、RPCを使う時に指定できるバッファリング(遅延実行)を使う事です。

具体的には、武器を拾う時に以下のようなコードを書きます。注意する点はRpcTargetにAllBufferedを指定する所です。他にも自分以外に送るOtherBufferedもあります。

photonView.RPC("PickUpWeapon", RpcTarget.AllBuffered);
[PunRPC]
void PickUpWeapon()
{
// 武器を拾う処理
}

このようにTargetを指定することで、武器を拾った処理を後からルームに入ってきた人にも遅延実行で、RPCを実行してくれるので、状態に差が出にくいです。これはPhtonCloudPUN2で書きましたが、MonobitEngineでも同じ事です。

それともう1つ武器を拾う時にはPhotonViewのOwnershipSphereをTakeOverに設定して、スクリプト内でTransferOwershipを実行して、武器の所有権を武器を持つキャラクターに移す処理をするのを忘れてはいけません。理由は上記の所有権の記事に書いてあるので、よかったら参考にしてください。

遅延実行を使う時に気を付ける事

確かにRPCをAllBufferedを指定する事で遅延実行してくれますが、その時にStart関数よりも先に実行されてしまう場合があります。なので、初期に生成したプレイヤーと同じ状態にならなくてエラーが出る場合もあるので、注意が必要になります。

結論 リアルタイム制が強いゲームはマッチング機能を使おう

以上でオンラインゲームの難しい要素と解決方法を紹介してきましたが、初めて作る場合には、素直にマッチング機能を作って、開始と終了を合わせると難易度がだいぶ下がります。それと武器を持ったり、車に乗ったりするのは、所有権を理解してある程度慣れてからにしましょう。そうすれば、オンラインゲーム制作も難しくはありません。

アイコンは音炉さんからお借りしました。素敵なアイコンをありがとうございました。