ぼくのかんがえた(略)カードゲームシステムをUnityの習作として組んでみた。

始まり

色々あって、せっかくだから今更Unity触ってみるか。

とりあえずサンプルを触る。
アクション系はあんまり乗り気になれない。何か目標はないものか?

そういえば一年前にオンライン対戦カードゲーム(HTML)を動くところまで組んで放置していたので、あれをUnityで組みなおしてみるか。

CPU戦まで

とりあえず2Dで適当に画面を構築して、入力操作、スプライト操作等を調べながら弄る。

ゲームのルール部分を組んでいく。手始めにCPU戦をC#で組んでいく。

public interface IGameServer {}

public class OfflineGameServer : IGameServer {}

オンライン対戦も考慮してこんな感じ。
ちなみにこの"Server"はネットワーク上のサーバの意味で付けたが、どちらかというと給仕人の意味合いの方が強い感じに。(まあGMとか審判でもいいんだが(実際node.jsでのルール処理クラス名はGameMasterだったり))

ちなみにゲームのルールは簡単に言えば5属性じゃんけん。基本の属性効果以外に特殊効果もないのでめちゃくちゃシンプル。
プレイヤーは手札から一枚選び優劣を判定。劣勢が余計に一枚捨てる。先にカードがなくなった方が負け。
サーバに送るデータは選んだカードだけで、
サーバから送られてくるデータも、互いの選んだカードと優劣判定と追加でドローしたカード。これだけ。
破壊効果もバフデバフ効果も選択効果もランダム処理も無いからめちゃくちゃシンプル。

IGameServerを、UnityによるUIと演出を担当するGameClientに組み込んで調整。
(まあこの後もIGameServerの仕様はコロコロ変わっていくのだが)
(そしてGameClientも操作演出の総合デパートとしてブクブク肥大化していくこととなる)

なんやかんやあって、一応プレイする形は出来たのでバックアップにPlastic SCMとやらを使ってみつつ、
ついでにGitHubにも上げておく(Git操作はVisualStudioで)

https://github.com/Juna-Idler/FiveElements-OpenCombat

ここまでで大体十日ぐらい。

せっかくなのでUnityRoomに投稿。

オンライン対戦

サーバサイドの構築
と言ってもほとんど一年前のコピペ。変更したルール部分のみ修正していく。
(ちなみにサーバはnode.jsでwsを使ったWebSocket通信。VS Codeで編集)

https://github.com/Juna-Idler/FiveElements-OC-Server

クライアント側もClientWebSocketで自力で組んで動くところまできてみたが、
正直自前実装がやっつけなのと、WebGLだと動かないので通信ライブラリを探す旅に出る。

https://github.com/jirihybek/unity-websocket-webgl を見つけて、ちょっとエラーを修正して動いたが、
そのあと
https://github.com/endel/NativeWebSocket を見つけて、こっちのがいいかとなった。ちなみにこっちにもちょっとソースに手を入れた。

ちなみに、上から順に

public class OnlineGameServer : IGameServer {}
public class OnlineGameServer2 : IGameServer {}
public class OnlineGameServer3 : IGameServer {}

と名前を付けたので、
現在OnlineGameServer3だけが残っていて、3って何?状態。

ここまでで大体二十日。

作りこみ

日本語フォントを入れつつ https://github.com/kou-yeung/WebGLInput で日本語入力対応

そして謎の勢いでPhotonを弄りだし、マスタークライアント方式でとりあえず動くまでは実装。
クライアントでルール処理をするのでCPU戦から抜き出して分離抽出する。

後は演出を強化するためにDOTweenを入れて、ちまちまとそれっぽい動きを付けつつ、
CPU戦の思考パターンを多少マシにした(今までランダム選択のみ)Level1とLevel2を実装。

public interface ICPUCommander {}

public class Level1Commander : ICPUCommander {}
public class Level2Commander : ICPUCommander {}

CPU戦の切り替えもインターフェイスを使ってこんな感じに。
ちなみに最初はタスクを使ってプレイヤーの思考時間と並行処理!とかやってみたが、
WebGLだとタスク使えないのでやめた。
まあ思いついたのそんな複雑な処理じゃないので余裕で1フレームに収まってるだろうし?

ここで大体一か月。

完成?

そしてさらにUnityの機能をいくつか試しながら作りこみつつ、
とりあえずいったんゴールでいいんじゃないかな?
と思うようになったのが一カ月半。これを書くちょっと前。

と、リポジトリのコミット履歴を眺めながら思い返してみた。

この記事が気に入ったらサポートをしてみませんか?