オセロ制作記録 第3章:11日目~15日目

11日目:ビジュアル修正2

[add]新規追加

  • ピンチインアウトでカメラの画角を調整できるようにする
  • カメラの位置を動かせるようにする
  • ひっくり返す時に効果音とエフェクトを発生させる
  • 石の数を種類別にカウントする
  • UIをざっくり追加

[update]機能修正

  • オセロをひっくり返すアニメーションを修正する
  • カメラの高さの動きをTweenアニメーションで動かす

[fix]不具合修正

  • ひっくり返ったマスからの生成がされない場合があった

楽しくなってきた。

アニメーションとか付けたらそこそこ見るに耐えるものになった気がする。

エフェクトとかは全く適当だけど、とりあえず機能的には出来たので後は修正するだけ。

ひっくり返す石が増えたら音も変化させていくとか色々やりたいことはあるけど、その辺はまた後にしよう。

ゲームとして成り立つようにUIを入れたりマッチメイキングについても調子していこう。

ゲームのシステムについても進める。

とりあえずGameManagerクラスと時間を管理するGameTimeManagerクラスを作成した。

それと勝敗を判定するために白石と黒石の数を記録しておく処理を作る。

アニメーションが終わった瞬間に石が加算されるようにしよう。

UIも考えていく。

プレイヤーが知るべき情報のリストは、

  • 現在の石の数
  • ゲーム終了までの残量

二つくらいかな。ちょっと考えてもこれくらいしか思いつかない。

ともかく形にしてみる。

石の数が合わないけど修正は明日しよう。

手早く全体を作ろう。細部にこだわるのは最後にする。

12日目:UI調整1

[add]新規追加

  • オンライン上で、石を置く関数が呼ばれたとき、相手からの呼び出しか自分が呼び出したのかを判別する

[update]機能修正

  • 生成されるマスに親オブジェクトを設定する
  • 石の割合を示すSliderの値変化をTweenアニメーションにする
  • 石の色は相手が置いたら自分と逆の色にするだけでいい
  • 石の色はプレイヤーが選べるようにする

[fix]不具合修正

  • ひっくり返す処理が終わったときのイベントが呼ばれない不具合を修正
  • 作られないマスがある場合があった

UIを修正する。

UIに表示する情報のリストを整理する。

  • ゲームの残り時間
  • 石の個数
  • プレイヤーの名前
  • 対戦相手の名前
  • プレイヤー側の石の色

ざっくり実装した。細部のこだわりは出来ればしていく。まずゲームになることを目指す。

オンライン対戦の時に自分が置いたか相手が置いたかの判定にはPhotonがPhotonMessageInfoという嬉しい機能を用意していてくれたおかげで簡単にできた。

オセロの石の色について、今は

  • 石が無い状態
  • 黒色
  • 白色

みたいに管理してたけど、

  • 石が無い状態
  • 相手の色か
  • 自分の色か

で管理するべきだったかもしれない。オンラインで対戦することを踏まえれば。

スクリプトで盛大にはまった。

プレイヤーが白石か黒石か選べるようにして、相手は自分と逆の石を置かれるようにしたが、最初に置く石をプレイヤー側の色と相手側の色と区別することに苦戦した。

最終的にPhotonでプレイヤーの情報を全て取得して、最初に置く石はプレイヤー1か2で区別するようにしたが。最初に置く石だけうまくできれば何とかなった。

プレイヤーの色を自由に選べるようにしたけど、その場合ステージに最初から置かれている石の色の管理はどうするべきか。

石を置いたときにまだマスがちゃんと生成されない場合があった。修正できたが、以前直したときに必要ないと思って消したコードが必要あった。悲しい。

ゲームの終了条件について、時間制か先に目標の個数まで石を獲得するかとか、色々追加したいけど、こちらは後にして、とりあえずゲームが成り立つことを最優先にしよう。

切りのいい? とこで2週間ちょうどの14日目で審査申し込みまで終わらせたい。

13日目:UI調整2

[add]新規追加

  • スタートのUIを作った
  • プレイシーンのUIを作った
  • スタートからクリアまでが形になった
  • プレイシーンを読み込んでから開始するまでに遅延時間を作った

[update]機能修正

  • 対戦相手の探し方をランダムにした

スタートの画面を作っていく。オンラインで対戦するためのUIの作成が主になる。

UIに表示する内容は

  • 対戦相手の検索を開始するボタン
  • タイトル名
  • 設定
  • 現在のプレイ人数(必須ではない)

どんな設定可能な項目があるかはまだ未検討。

DoozuUIのグラフコントローラを使ってUIの遷移を作った。使い勝手の良いアセットだ。

接続ボタンを押して、接続待ちの間メッセージを表示して、相手が見つかったらプレイシーンに移る。

ゲーム開始時の遷移に関するUIが形は出来た。

まだ絵がしょぼいが。

部屋を作る処理を書く。

マッチメイクはランダムにする。

ランダムなオンライン上のルームに入る処理はPhoton公式にそのまま載っていた。

タスカル。

部屋を作るときのルーム名がNullじゃダメになってるみたいだけど。ルーム名は適当にGuidで割り当てることにした。

ゲーム開始からプレイシーンまでの遷移は出来た。

ゲームからまたStartシーンに戻るまでを実装していく。

リザルトを表示して、次の相手を探すか、スタートシーンに戻るかのUIを作成する。

勝負結果に表示したい情報は

  • 勝利したプレイヤー名
  • 敗北したプレイヤー名
  • 石の数
  • スタートに戻るボタン
  • 次の相手を探すボタン

ぐらいかな。

とりあえず、スタートから対戦終了してまた次の対戦まで。

なんとか一周が形になった。

明日までに審査に申し込みたいが、厳しいかも。

かなり粗雑のままにすれば出来るかもしれないが。

でも最低限ゲームとして成り立っていれば公開するつもりではある。

レビューで指摘でもあれば儲けものだし。

14日目:マッチメイク機能修正1

[update]機能修正

  • サーバー接続のコールバックで呼ばれる処理を修正した
  • UIの遷移を修正した
  • 開始するときに時間を同期するようにした

再戦するときの処理が上手くいかない。サーバへの接続を管理するスクリプトがめちゃくちゃになってきた。

部屋を退出するときとか、次の部屋を探す時とか、コールバックの順番を理解してないとすぐに例外が出される。

ゲームが開始する瞬間を同期できるようにした。こういうオフラインじゃやらない処理が面倒に感じる。慣れてないからスムーズに実装できないし。

Photonの機能でカスタムプロパティというのがあった。

現在のルームかプレイヤーに設定できるHash値。

同期をとるときにこれを使うことにした。

ひょっとしたらマスの管理もこれを使うべきかもしれない。今のままだと同じところに同じタイミングで石が置かれると確実におかしなことになりそうだし。とりあえず公開してみて、見過ごせなくなってきたら実装してみよう。

それとPhotonに共通の時間を参照できる変数があるのでそれも使うことにする。

やればやるほど思ったけど、オンライン対戦の処理は沼だ。

簡単なマッチメイクでもなかなかうまくいかない。ターン制に近いゲームだから、オンラインゲームの中じゃそこまで難しくないアプリだと思うんだけど。

今日中に審査に出したいとか思ってたけど無理だった。思いのほかPhotonの沼にはまった。

サーバーに勝手につながったり、変なところでシーンを何回も読み込んだりする。

コールバックの関係を整理しておかないと。

とりあえず、実装しながら思ったことは

  • 部屋の生成と参加は「マスターサーバ」に接続していない時に呼び出すべきではない
  • フラグ変数がいくつか必要になる気がする
  • UIをサーバーの接続状況によって変えるのが面倒。接続中とか対戦相手を探している状態とか、次の相手を探す時とか。

ずれてる考えもあると思うけど、ちょっとづつ修正していこう。

それと、TextMeshProが描画されないことがある。参考になりそうな情報も見つけたけど……。

15日目:マッチメイク機能修正2

[update]機能修正

  • サーバーの接続状況に関するUIをスタートシーンとプレイシーンで分けた
  • 本当に無理なく周回できるようになった
  • ゲーム終了時、アニメーションをしている石はアニメーションをスローにして、アニメーションが終わらない場合は取った石にカウントしない

[fix]不具合修正

  • サーバーの遷移とUIがあってないのを直した

サーバーにつないだりルームに入ったりしたときにUIがごっちゃになったり、どんな時に呼ばれるかわけわかんなくなったり。

UIの構成を大きく見直した。今まで3DのEmptyオブジェクトの子にCanvasを設定していたが、TextMeshProが描画されない原因になっていたかもしれない。結果を表示するTextをインスペクタから設定しやすいし、プレハブに使いまわせるので、子にしていたけど、変えた。スクリプトは書き直さずに済んで良かった。

スタートシーンとプレイシーンでサーバーに関するUIをプレハブとして使いまわそうとしたけど、全く同じものは使いづらい。

サーバーの接続状況に関する遷移がかわるし。

UIの遷移条件も変える必要があった。

Doozyのノードで感覚的に制御できたからよかったけど。

ただ、自分のPCのスペックもあるんだろうけど、Doozyのノードエディタとデータベースのアセットエディタは処理が重い気がする。

多少は整理できたが、相手がプレイ中に退出した場合とかを考えるとフラグ管理が難しい。

上手くまとめられる気もするんだけど。

相手が退出したらOnLeftRoomとかOnconnectedMasterとか勝手に呼ばれるコールバックが沢山ある。

なんとかスタートからプレイ終了してまた再戦するまで形になったかも。

ゲームの終わり方を大きく分けた。

正常に終了したか、不正な終わり方をしたか。

少し楽に整理できた。

開始シーンの同期が中々出来ない。PhotonのCustomPropertiesはなんか変なことになる。同じキーの値はセット不可とかあるのかな。

丸二日かかったけど、何とかサーバーの遷移とUIの遷移は出来た。形だけだけど、一番きついところだった気がする。

同期も出来た。

きつかった。

いちいち変なわけわかんないところで止まるし。

DoTweenは予想と違った動きするし。いや、それは使い方勘違いしてただけなんだけど。

でも、完成した。

形だけは。

う れ し い 。

やったぁ!