[Unity] ライクハドロというゲームを作りました(unityroomで公開中)

Nプログラマです。

最近unityroomの存在を知ったので、カードゲームを作って投稿してみました。

まだ機能不足が多いところもありますが、少しずつ作って楽しんでいます。 現在のバージョンは、v1.4です。

ライクハドロ | フリーゲーム投稿サイト unityroom

バージョニングのルールがいい加減で、アップデートするたびに0.1ずつ上がっていく感じです。 次回からアプリを作る時は、この辺も改善していきたいトコロ。

今回はv1.0、つまり一番最初に作った内容を、ゲーム制作の備忘録として残しておきます。

作りたいものをイメージ

唐突に何を作ろうという気になり、トランプのハイアンドローのような自分と相手のカードの大きさを競う、というものを作ることにしました。

紙に書き出した内容は、こんな感じ。字については、あまり気にしないように。。。

/img/article/2019/03/24/01.png
走り書きのメモ(清書)

こうやって紙に書いていくとイメージが膨らんできて、いろいろと機能を作りたくなります。

が、その誘惑をグッとこらえて一番のキモである、カードを選択し、大きさを競って、勝ち負けを判定する、というトコロを目標にしました。

素材の準備 素材を探すのに時間がかかりそうだったので、とりあえず自分で作ってみました。

とはいえ、時間もあまりかけられないのでシンプルにカードの表・裏と選択状態を表すチェックマークを作りました。

完成度があがり、作り込みたいと欲求が出てきたら改めて素材を探して差し替えていこう、というスタンスで作ります。

素材から完璧なものを探して準備すると、メインのゲームづくりのエネルギーとかモチベーションがなくなっちゃうので、自分はこんな感じで作っています。

この記事書いていて気が付きましたが、カードの画像は透過し忘れていますな。。。(四隅が白い)

使うアセットの追加

iTween

AssetStoreで利用できるフリーのアセット。
スクリプトで簡単にアニメーションの動きをつけることができるので、よく使っています。

iTweenのドキュメントは英語ですが、頑張って読んでいますw

ラノベPOPフォント

作りたいイメージにぴったりのフォントだったので、フォントな様が作っているラノベPOPフォントを利用することにしました。

利用しやすいライセンスなので、おすすめです。

ラノベPOPフォントのフリーフォントダウンロード

シーンの構成

タイトル

作ったのはこんな感じ。

/img/article/2019/03/24/05.png
タイトル画面

「はじめる」と押すと次のシーンに遷移して、「おわる」を押すと終了する。

「おわる」ボタンApplication.Quit()を入れているのだが、ブラウザだと終了しないのは何か間違えているのだろうか。。。

あとはここに「せってい」ボタンを作って、ゲームの音量調整をできるようにするつもり。

メイン

カードの大小を競うところのシーン。
大小を競うことをこのゲームではバトルと呼んでいます。

/img/article/2019/03/24/06.gif
バトルシーン

カードの配るテンポが個人的に気に入っています。

配った後は選択を促すメッセージを表示したほうがいいのかなーと思いつつ、まだ作っていない。。。

スクリプト(コードなし、説明だけ)

全部乗せると大変なので、印象に残っているスクリプトを部分的にメモ書き程度で書いていきます。

Card.cs

カードを表現するゲームオブジェクト。
実際のカードのパラメータは、CardParam.csにもたせてある。

iTweenを使うので、このクラスが肥大化するかもと思っていたら本当に肥大化して困った。
実際に、v1.4を作るまでにかなり大きくなったので、クラスへ分割しました。

種類

今は見た目だけですが、カードには4つの種類があります。

この種類を使い、属性相関をもたせてバトル時に補正をかけたいと思っています。
(黒マルは赤マルに強いから +1 など)

ただ今の画像だと、パッと見ただけで相関関係がイメージできないので、なにか別の素材に置き換える予定。

火とか水にしたほうがいいのかなぁ。。。
と、ぼんやりと考えています。

Deck.cs

Listでカードの参照を持っているクラスです。

カードの各種類が13枚あり、4 x 13の合計52枚のカードがシャッフルして初期化します。

シャッフル

初期化で使っている処理です。
リストをループを回しながら、ランダムでデッキの枚数以下の数字を取得し、リストの参照を入れ替えています。

カードを引く

デッキからカードを1枚引く処理です。
引いたカードの参照をデッキから削除して、そのカードの参照を返すようにします。

参照をデッキから削除したからといって、カードのインスタンスが削除されるわけではない、ということをちょっと忘れかけていたのはヒミツ。

バグが。。。

何度がプレイして頂いた方ならバグを見つけたかもしれませんが、山札が0になったらNULLが発生するのでゲームがそこでフリーズします。。。

0になったらリセットする処理を入れないといけませんね!

なぜ放置しているかというと、、、

仕様が固まっていないからです!

山札が0になったらゲーム終了なのか、何度も繰り返すのかをまだ決めきれていないからです。

0になったら終わりというのも味気ないので、繰り返しプレイできるようにしたいのですが、繰り返す楽しみの要素が思いついていないので、そのままの状態にしてあります。

どんな要素がいいのだろうか。。。

Dealer.cs

カードを配ったりする機能などを持ったクラス。

カードを配る、バトルを開始するなどイベント系の機能を持っています。

後述のField.csとの役割の境界があいまいで、実装がゴチャゴチャしている印象がある。

Mediatorのような役割のクラスになるんだろうと思っている。たぶんね。

Field.cs

デッキから配られたカードなどを配置するためのクラス。

Dealer.csが持つ機能がこっちに実装してしまったりしているので、キチンと分けたいところ。

カードの配置するための情報だけを扱うようにすればいいと思う。

おわりに

ダラダラと長く続いてしまいましたが、unityroomでライクハドロ v1.0を作った時の備忘録でした。

足りない機能はいっぱいあるけど、少しずつ楽しんで作っています。

v1.4を作った時の内容も記事にできればいいなと思っています。

それでは、このへんで。
バイナリー!

作成したUnityゲーム

ライクハドロ | フリーゲーム投稿サイト unityroom

使っているアセット