オンラインゲーム制作で立ちはだかる大きな壁をUnityとPhotonPUN2で超える
こんにちは!ジェイです。今回は現在制作中のUnityChanAutoOnlineで特に難易度が高くて、オンラインゲーム特有の難しさとぶちあたっている問題について書きます。
オンラインゲーム制作特有の概念
オンラインゲーム制作が難しい理由と意識しなければならない事については以下の記事で書いてます。
所有権という概念は他のプログラミングではないので、特に意識いなければならないということです。更に「武器を拾う」や「乗り物に乗る」といった処理は難しくなります。
さらに難しくする要素
こちらのツイートで言った通り上記の3つを仕様にすると、とんでもなくオンラインゲーム制作難易度はあがります。理由は所有権を移行しなければ、実行できない関数があるのと、途中入出を許可すると、最初から入っている人と新しく入ってきた人の状況が違って、それがエラーの原因になってしまうからです。
例えば、最初に入室している人が武器を持って、その後に誰かが入ってきて、そのまま武器を捨てるとエラーが出てしまいます。理由は後から入ってきた人は武器を持ってないという状態になっているからです。この状況を回避するにはAllBufferedやotherBufferedなど使って遅延実行で同期させる事です。
現在苦戦している事
最近は上記の問題以外に大人数でバスに乗る配信をして、乗り物に乗れるようにするチャレンジしてます。そして、現在進行形で苦戦しているのが、バスが乗り降りする時に吹っ飛んでしまうということです。
バスでサッカーゲーム笑 RigidBodyよりもCharactorControllerの方が強いということですね💦
最悪の場合は以下の様に空をとんでしまいます。
これに対しては、バスのみでisKinematicをtrue(物理演算の干渉を受けない)にしている時のみ乗り降りできるという仕様に変更しました。
さらに座席のTransformをキャラクターのTransformで上書きしてしまっていたので、瞬間移動する現象が起きていました。こちらは、キャラクターの座席のTransformを座席のTransformの子オブジェクトにすることによって解決しました。
苦しい制作の中にも楽しみあり
バグを修正している時になかなか修正できないと確かに、苦しかったりしんどかったりすることもありますが、もちろん楽しいこともあります。
こんな感じで自分の作った車の助手席に初めて乗った時はすごく楽しかったです!
乗り物デバッグ配信最終章
そして、今夜20時まさに乗り物の処理との闘いとの決着が今こそつくか!?ということで第8回Unity PhotonPUN2でオンラインゲーム制作を配信しますので、完成するかご期待ください!