りばーしにゃいーぱー開発日記

## 「りばーしにゃいーぱー」とは
リバーシとマインスイーパーを混ぜたゲームです。
『オセロ』は株式会社メガハウスの登録商標なのでリバーシと呼んでいます。

## なぜ作ったか
人口の多いリバーシとマインスイーパーを使うことで、ユーザーの獲得を目論んだ。

## 開発環境
Unity2020.3.2f1
VisualStudio2019
PlayFab
Photon

## 使用アセット
- GitHub for Unity
- PUN2
- TextMeshPro
- GUI PRO Kit - Simple Casual

## 参考にしたサイト

https://qiita.com/JunShimura/items/4547563fbb2691f40626

http://next-next.com/2020/01/08/unity%E3%81%A7photonpun2%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%AF%BE%E6%88%A6%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%AA%E3%82%BB/

https://zenn.dev/o8que/books/bdcb9af27bdd7d

その他途中メモにて記載

## 日記本編
### 1日目(2022/01/27)
**進捗**

- PUN2でクリックしたら2人で同期オブジェクト交互に生成出来るようになった

### 2日目
**進捗**

- オセロマス自身が自分のstetusに合わせて動的に色が変わるようになった

### 3日目
**進捗**

- 理論上は置ける場所の判定と、実際に置くことが出来るようになった
- rayが働いていないことが分かった
- 見た目はリバーシになった
- オセロマスに画像と数字を重ねた(親：image、子：textMeshPro)

**メモ**
byte型→string型：(byte型変数).ToString()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/6644605e-2352-6fab-620e-cbb71b7f2fe0.png)

### 4日目
**進捗**

- オセロマスをuGUIからSpriteに移行した
- オセロマスをクリックで検知することができるようになった

**メモ**

- Vector2IntというVector2のInt型があるのを教えてもらった
- uGUIにRayを反応させようとすると処理を追加しないといけないらしい
- 毎フレームアニメーションする物体にはuGUIを使用しない方がいい(最適化の観点)
- UIと思ったらuGUI、他はSprite
- パーティクル載せたいならSprite
- uGUIは3D表現は相性が悪い
- uGUIも2D空間に存在している(Wireframeを選ぶと分かりやすい)
- UIの中のTextを使うとCanvas必須、TextMeshを使うと逃げられる
- uGUIの1unitは1pixwl、3D空間の1unitは1m
- Colider2Dを使用してるとRaycastも2Dにしないと検知できない

### 5日目
**進捗**

- オンライン対応リバーシになった

**メモ**

- ゲームサーバーに入るのに失敗した時のコールバックはアプリでオフラインで開いたときに使われそう
- セーブデータ保存にjsonが便利そう

https://www.youtube.com/watch?v=Va5I78_Oa2w

### 6日目
**進捗**

- 置けるところの色を変えた
- 置けない時のパス処理を追加した
- 終了処理を追加した

**メモ**

- 頭の中で考えてるのと紙に書いてみないとごちゃごちゃになり始めた

### 7,8日目
**進捗**
- 画面遷移のやつ書いた

![IMG_20220207_013402.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/6df50566-a2c0-d29b-d513-aaed742e76ee.jpeg)
![fu5SvmZV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/39d7436f-35b9-39e9-e467-ae9062a39761.jpeg)


### 9日目
**進捗**

- マッチングフェーズができた
- お互いに爆弾を置くフェーズができた
- 爆弾を上限まで置けなかった時ランダムで置く処理が必要
- 爆弾を送受信する関数がエラーを起こしている

**メモ**

- 最初,石が置ける場所全部に爆弾置いたらルールが破城することに気づいた(修正済み)
- []は配列であってリストではない

### 10日目
**進捗**

- 爆弾の送受信を除いてマッチング→爆弾設置→ゲーム開始のフェーズができた

**メモ**

- 同一のスクリプトファイルを複数のオブジェクトにアタッチすると、その数だけStart関数が呼び出される(今回はネットワークオブジェクト2つについているから2回呼ばれた)
- 上記の対策というか、基本ネットワークオブジェクト作るならphotonView.IsMineがないと複数回呼ばれる羽目になる
- photonView.IsMine君、もっと早く出会いたかった(サンプルコードの読み落とし)
- 爆弾が置けるのは周囲2マスにしないと2手目で後手が負けることに気づいた(修正済み)
- 爆弾の送受信にリストを使ってたけど非対応だったことが発覚、それでエラー吐かれていたみたい

https://doc.photonengine.com/ja-jp/pun/current/reference/serialization-in-photon

### 11日目
**進捗**

- 爆弾の送受信ができた
- 基本の部分が完成した
- 爆弾の個数を5から3に変更
- 簡易的なタイトルを作成
- UI周りを作成し始めた

**メモ**

- 爆発した爆弾がなんかしらで消えることが発覚(原因は特定できていない)(修正済み)
- 設置した爆弾はゲームが開始したら見えなくなるのに何故か見えてしまうことがある(見えなくしてから設置できている可能性微レ存)(修正済み)
- 爆弾の個数が多い(修正済み)

https://youtu.be/TTwGsrCThJ0

### 12日目
**進捗**

- オセロマスの見た目を色変更ではなくSprite変更に変えた
- オセロ盤を設置

**メモ**

- 下画像はエラーが起きてて爆弾が3つしか置けていない(修正済み)

![messageImage_1645008429220.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/c299b9aa-db6b-fc25-a72a-3d4435aae7be.jpeg)

### 13日目
**進捗**

- リファクタリングしたら爆弾の設置・送受信が壊れていたことが発覚、修正
- 爆弾設置時間をUIに反映させた
- 必要な画像などをスプレッドシートに整理した

**メモ**

- GameObject.Find()を20回ぐらい使ってるからFindWithTagに変更
- スクリプトの細分化が出来ない、以前よりは出来てるけどSOLID原則とやらは全然満たせていない<br>なんか練習サイトとか無いのかな
- オセロマスカウントの同期、UI変更が出来ない原因はわかってるけど、どうやってやればいいのか考察中

### 14日目(2022/02/21)
**進捗**

- 石を置いたらルーム内全員のコマ数が更新されるようにした
- 爆弾設置可能個数が分かるようにした
- UIをいじるスクリプトを変更した
- どっちのターンなのか分かるようにした
- 仮リザルト画面を設置した
- 爆発した所が何故か上書きされる問題を修正した
- おそらくα版(?)は完成した！！！めでたい！
- unityroomの公開範囲を限定から全体に変更

https://unityroom.com/games/reversinyaweeper

**メモ**

- PlayFabやらNCMBを使うと色々実装できるらしいことが分かった
- NCMB：簡単に気軽にできるよ！ PlayFab：ゲームに特化してるよ！<br>っていう印象持った
- クライアント側でレート計算するとチートされやすいらしい
- バックエンドは組み合わせ可能
- 「バックエンドは無理ー興味ないー」って思ったのに気づいたら片足突っ込んでた
- 開発者、知見を得る度に尊敬する
- GameServerServicesはあまり情報が出ないらしい
- public staticを使えばもっとスクリプト分割とかできそうだなって思った
- カスタムプロパティはちょっと変更があるみたい

https://qiita.com/TN0321/items/e7c62681e25783fa4c36
***
### 15日目
**進捗**
 
- ねこじょーかーさんのPlayFab入門本読み終わりました
- コピペして使えるPlayFabのソースコードをまとめた
- りばーしにゃいーぱーにPlayFabを組みこみ始めた
- 匿名ログイン
- ユーザー表示名登録

**メモ**

- なぜかPhotonのマッチング機能が死んでいる(修正済み)
- シーン遷移の内容を変えたせいで、マッチングキャンセルでタイトルまで戻ってしまう(修正済み)
- 理論上はできているのに全て新規プレイヤーになってしまう(修正済み)

https://playfab-book.com/

https://qiita.com/thorikawa/items/03b65b75fa9461b53efd

### 16日目
**進捗**

- 寝て起きたら新規プレイヤーの処理が直っていた
- ホーム画面のUI配置
- PlayFabからの情報取得
- レート・ランキングの初期化(なぜかできていない)
- 貨幣(ゴールド)追加(PlayFab側)
- ランキング追加(PlayFab側)
- ショップ・ランキング・設定の画面遷移
- キャラをタップするとセリフ出力

**メモ**

- C#本買います
- セリフが一定時間が消えるように教えてもらったasyncを使う
- TextにEventTriggerをつけても効果がない…

https://www.amazon.co.jp/dp/429710458X/

https://ufcpp.net/study/csharp/

### 17日目
**進捗**

- ランキングのスクロール
- ランキングの取得
- ランキングをUIに反映
- Playfabのデータ処理を修正(データ取得してからシーン遷移)

**メモ**

- get,setが便利なのが少しずつ感じ始めた
- 別のスクリプトの変数を使うのはプロパティが一番よさそう
- コールバック地獄ってそういうことね…ネスト深いわ…
- ソシャゲとかでNowLodingみたいな画面があるの理解した。データ取得に少し時間かかる

https://zenn.dev/daichi_gamedev/articles/2109cbfea057ad

https://qiita.com/AAA0125/items/9b79e6eb7e78d93af8c7

### 18日目
**進捗**

- Photonのエラー修正(Prefabのパスや場所が変わっていた)
- ログイン時ネーム・レート・ゴールド取得
- 上記のUI反映
- 勝敗数をプレイヤーデータに追加
- NowLoading画面を仮設置

**メモ**

- フォルダサイズが大きすぎてGitHubにPush出来ない
- なぜか周囲のランキングは自身も含まれるのにTOP10には含まれない

### 19日目
**進捗**

- ゲームシーンのTextをTMPに差し替え
- マッチングバグ修正

### 20日目
**進捗**

- ランキングをボタン押すタイミングで取得するように修正
- ランキングで自分が含まれないバグを修正
- プロフィール欄が表示されないバグを修正
- プロフィール欄のネーム・レートを変更
- 降参機能を実装

**メモ**

- スコア送信から2s程待たないとランキングに反映されないらしい
- 過去の自分の命名の仕方と今の命名の仕方が変わってしまっている(以前「text + 内容」、今「内容 + Text」)
- if文の書き方も変わってた(以前「if ()」、今「if()」)
- スクリプトからボタンのOnClickの内容を追加できるみたい
- GameObject.Findだと非アクティブオブジェクトは検索されないみたいTransform.Findならいけるっぽい
- どっちが降参したのかを反映させる

https://zenn.dev/st43/articles/ca46c3f814b560

### 21, 22日目
**進捗**

- 全てのシーンにおいてUIの差し替え中

**メモ**

- 有料アセットってすごい(小並感)
- TapToStartした後に名前を入力せずに終わると、次回ログインできなくなるバグ

https://youtu.be/1cb2xWv8z_M

### 23日目
**進捗**

- ショップのパネルを微調整
- PlayFabからカタログ・ストアデータを取得
- データを元にPrefab生成

**メモ**

- Json君と馴れ合う
- 実機テストやってみたら修正点が多く見つかった
- 録画したものを見ながら修正する

### 24日目
**進捗**

- 実機テストの際の修正点を修正

### 25日目
**進捗**

- ショップのアイコンが全部同じになるバグを修正

**メモ**

- カスタムデータのキーとクラスのプロパティ(?)は同じにしないと取得してくれない
- 取得しないと0を返すみたい
- デバック機能の為にクライアントから色々取得できるようにした(未来の私修正よろしく)

### 26日目
**進捗**

- ユーザー名変更機能
- 所持しているアイコンを取得

**メモ**

- アイコン購入の時にカスタムデータを付与

## 余談
### お世話になった・なっている方

- Unityゲーム開発者ギルドの方々

この場をお借りして、いつもありがとうございます。

### 開発中おかしくなったすのーさん集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/d1536d85-d5d1-0382-efe2-1c820ee1ea5e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/005b85cd-e1b8-a7df-c907-2779b9354921.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/bda83b95-e7f5-37f7-509b-eca57aeb8edb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/04f750d5-2c31-8d93-3dc6-b671eb7e8d6c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/479a6527-704e-80aa-3a87-9476cd56611f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/9ef516b5-0be8-98b4-da5a-b6b0bd03ad5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601545/20e9044c-47ac-d18a-0ce6-32fbc0f70a03.png)