白黒羊飼いの庭

unityで作るゲームの製作メモでしたが、最近は機械学習とかデザインとか何でもやってます

unity1week「あつめる」に参加しました


7月のunity1week「あつめる」にゲームを提出しました(遅刻しました!!)
お題発表前から何となく作りたいゲームの構想があって、そこにこじつけようとしてこじつけにもなってない感じのゲームです。

投稿したゲーム

ヘキサダム | フリーゲーム投稿サイト unityroom
hexadum_icon
投稿したゲームです。
変則六目並べです。並べてるだけですがタイルを集めよう!!と言い張って参加しました。

hexadum_rule
集め方には3パターンあります

hexadum_play
こんな感じでゲームが進んでいきます

目標

事前に立てた目標としては、

  • UniRxを使ってみる
  • ML-Agentsを使ってみる(無理だったらすぐやめる)
  • キャラクターの画像とかに凝らずに使える素材を使う
  • 神クラスを作らないようにする(各クラス100行以内になるように分割する)(これは必ずしも守らなくても良いルール)
  • 平日の間に一通り遊べるようにして土日に追加修正をする
  • 自分ひとりで天才駆動開発をする
  • unity1weekが終わったら一本記事を書く

という感じでした。
前回の目標は「完成させる」だったので目標の立て方の時点で凄まじい進化を遂げている感じがします。
いまだに完成させるだけで結構すごいと思っているのですが、unity1week会場を見に行くとそんなもんではないレベルの作品がゴロゴロしていて怖いです。


UniRxを使ってみる


何に使ったとかではなく適当にReactivePropertyとかを使いました。
Presenter作って通知が来たらUIの更新をする、みたいな多分普通の使い方です。
UniRxが何となくどういうものなのかがわかったのとLINQの使い方が結構わかってC#が好きになれたのは良かったです。

とはいえUniRxではなくLINQの話ですが、WebGL出力したときにAOTエラーが出て怖い思いをしたのでLINQをむやみに使ってはいけないという教訓もありました。
手元で動くようになってビルドして、unityroomに投稿したところ、あれ……?動かない……?となり、Chromeデベロッパーツールを表示すると以下のメッセージが出ていました。

ExecutionEngineException: Attempting to call method 'System.Linq.Enumerable+WhereSelectEnumerableIterator `2::Select' for which no ahead of time (AOT) code was generated.
(Filename: currently not available on il2cpp Line: -1)

ちなみに、デベロッパーツールは右上のメニューから開くか、Macなら「⌥ Option」 + 「⌘ Cmd」 + 「J」、Windowsなら「F12」で開けます。
Unityで Debug.Log("テスト"); と書くとデベロッパーツールのコンソールにも「テスト」が表示されるのでどこにバグがあるのかを追い詰めていくのに便利でした。

表示されているエラーはLINQで書いたコードが事前コンパイルできてないから云々みたいな話で、解決方法は多分これなのですが、
docs.unity3d.com
理解する頭と元気がなかったので、LINQで書いていた部分を大人しくforeachに書き換えました。

動かなかったコード(LINQ)

var tileList = _tiles
  .Select(cell => tileMap.CellToWorld(cell))
  .Select(pos => RectTransformUtility.WorldToScreenPoint(Camera.main, pos))
  .Select(vec2 => new Vector3(vec2.x, vec2.y, 10f))
  .ToList();

動いたコード(foreach)

var tileList = new List<Vector3>();
foreach (var cell in _tiles)
{
  var pos = tileMap.CellToWorld(cell);
  var vec2 = RectTransformUtility.WorldToScreenPoint(Camera.main, pos);
  var vec3 = new Vector3(vec2.x, vec2.y,10f);
  tileList.Add(vec3);
}

どう悪いのかとかが全然わからないので今後注意して情報集めます。
これきっとiOSとかでもハマりそうなので気をつけたいです。


ML-Agentsを使ってみる

unity3d.com

今回のunity1weekで使ってみたかった技術の本命かつでも難しそうなので無理だったら即諦めようと思ってた機能です。
Unity本当に何でもできてすごいです。
ml-agents_sample
Unity公式より引用

今回AIと対戦する六目並べを作ったのでそのAIの強化に使ってみました。
が、投稿時にはまともな完成度にはならなかったので適当なところで諦めました。目標通り。
結構ハマったのが以下の「No episode was completed since last summary. Training.」が無限に出続ける問題。

INFO:mlagents.trainers: #####: *****Brain: Step: 1000. No episode was completed since last summary. Training.
INFO:mlagents.trainers: #####: *****Brain: Step: 2000. No episode was completed since last summary. Training.
INFO:mlagents.trainers: #####: *****Brain: Step: 3000. No episode was completed since last summary. Training.
INFO:mlagents.trainers: #####: *****Brain: Step: 4000. No episode was completed since last summary. Training.
INFO:mlagents.trainers: #####: *****Brain: Step: 5000. No episode was completed since last summary. Training.

ML-Agentsはもう少しわかったら別の記事にちゃんと書こうと思っているのですが、これに関しては、AgentReset();の段階でパラメータを全部リセットするの面倒だなと思ってシーンごと再読み込みしていたのですがその度にAgent自身もリセットされてしまっていたことが原因でした。
別のシーンに退避させて追加読み込みで盤面のシーンを呼び出すことで解決しました。

こんな感じで、勝手にひとりで遊んでくれるところまではできましたが全然強くなりませんでした。
色々検索してみたところ、三目並べとかでも学習させるの一苦労するみたいなのでこれは問題設定的に難しいのかもしれない。
hexadum_ml-agents_sample
動画は開発中のものなのでキャラクターが本編と違います

もっとこう、物理!!っていう方が向いているのかなあ。
ただ色々勉強になったので今後も試してみたいと思います。


お借りした素材

キャラ画像の素材

ゆるドラシル素材めちゃめちゃいいです。次回からも使っていきたいです。
yurudora.com

hexadum_character_select
かわいい。場面に応じて同じキャラの別パターン素材が使えるのでさっくり良い感じになる

音楽

アセットストアからお借りしてます。
モダンで素敵。


神クラスを作らない

前回よりは〇〇Manager頼りにならなかったのですが相変わらず設計については微塵もわからない状態です。
最大400行ぐらい。

インターフェースが使えるようになったのは良かった。
プレイヤーが人間でも弱いAiでもML-Agentsでも同じように動くのは便利でした。

作業効率あげようとして1week最中にリファクタをしたことが皮肉なことに間に合わなかった要因になっている気がします。
リファクタをしても大してまともな構造にならなかったので……。一体どうすればいいんだ……。
もうちょっと長いスパンで考え直してみます。せっかくMacbookも買ったのでアプリにしてみようかなという気持ちもあるので。
クリーンアーキテクチャ本を手にしたので読んでみます。


早めに完成させて土日に追加修正をする

寝言は寝て言ってほしかったです。


天才駆動開発

天才駆動開発とは、寸前みやこさんのブログで紹介されたチーム開発手法です。
szmiyako.blogspot.com
寸前みやこさんとだー1さんの共同開発に用いられた手法で、かなり話題になっていました。

事あるごとに「天才か?」と反応する事で、達成感に加えて「自分は天才なのだ」という満足感によって自尊心がどんどん上がっていき、作業のモチベが常に保たれるという活気的な開発術です。

お互いに「天才か?」を言い合うことによって、チームには天才しかいないことになります。まるで天才たちのゲーム制作頭脳戦のよう。

て、天才だ……。
みやこさん曰く、誰しも自分1人に対してなら「天才か?」と言っているはずで、それを他人にも言う手法とのことでしたが、私は自分にもやってないなあと思ったので導入することにしました。

が、結局。
1week中ただの一度も「天才か?」って思わなかったし言わなかったです……。
むしろ、ええ、何でできないの……?って何回も思ってしまった。
自分に期待しすぎないことが肝要ですね。
次回はもっと褒めてあげよう。

振り返り記事

というわけで感情と記憶がまだ残っているうちに記事にしました。
Tilemapを使ったのである程度使い方がわかったのは収穫でした。
今度はTilemap活用した2Dゲームを作りたいです。
それから公開後に皆がきゃっきゃしている側で黙々作る側で居続けるのは楽しさが若干減るので次回は遅刻しないようにもっと小さいものを作りたいです!!!!