はじめまして 今回初めて記事を書かせていただくkomugikoShimizu というものです。
今回関わった作品でローグライクの部屋生成を担当した話を記述していこうと思います。
初めてなので拙い文章になっていたら申し訳ございませんが、良ければご覧いただけますと幸いです。
目次
- 今回の実装要件
- 実装内容
- 終わりに
今回の実装要件
今回制作に携わった作品は 「アンドロイドメイドメガフィスト」 という作品です。
賞をいただいた作品なのでご存じの方もいるかもしれません。(良ければ調べてみてね)
このゲームは「2Dローグライクアクションゲーム」で、私は部屋生成も担当することになりました。
そこでプランナーから実装要件を聞いたところ
「部屋には道があったりなかったりしてほしい」といった要件がありました。
今回はこれをどのように実装したのかを話していこうと思います。
実装内容
細かいことはいったん置いておいて、まずは実装した方法を
private byte direction;
byte型変数1つです。
なぜbyte?? って思った方も少なくないでしょう。
なぜこのような実装にしたのかを解説していきます。
byte型である理由
byte型である理由は 「2進数として扱いたかったから」 です。
4ビットの2進数 が 1111 となるのは分かるかと思います。
2進数は 0 と 1 しかないためbool型のように扱うことができます。
これを4ビット分用意することで4つの道を表現することが可能になります。
// 1 1 1 1
// ↓ 10進数に直すと...
// 8 4 2 1
// ↓ これを各道に番号として割り振る
// 上 下 右 左
なぜbool型の配列ではないのか
ここまでの解説を聞いたところで 「でもbool型の配列でも同じことできない?」 と思った方もいると思います。
ではなぜバイト型を用いたのか それは 「乱数値の生成を1回するだけでいい」 というのが理由になります。
今回の道があるかないかという情報はランダムに決定されます。
これをbool型配列で実装しようとする場合、乱数値を4回生成する必要があります。
ですが、この実装方法を用いることで 「0から15までの乱数値」を1回生成するだけで良くなるのです。
byte direction = (byte)Random.Range(0,15); // これで15までの乱数を生成できる
不都合な点はないのか
正直ほぼなかったです。
道を足さなければいけない場合も、byte型変数に数値を足すだけで実装できますし
道があるかを確認する場合も、AND論理演算を行うだけで取得できます。
強いてあげるなら 「数値にバグがある場合、生成される道がおかしくなる」 という点です。
先ほど述べた通り、道の足し引きはbyte型変数に足し引きをすることで実装できます。
しかし、この演算に何かしらの間違いがあった場合「なぜか道があるorない」が発生する可能性があります。
実際にこれが発生した際、まず道の仕組みを疑ったため見つけるのに時間を要してしまいました。
終わりに
ここまでご覧いただき、ありがとうございました。
今回の制作を通し、うまく実装できたかと思ったため記事にした次第です。
読んでいただき「これがしたかったんだ!」という方が一人でもいれば記事にした甲斐があります。
ぜひ1例として参考にしていただければと思います。