再建を繰り返す街づくりゲーム開発(ランダムにキャラ絵を生成する)
過去記事で仕様を考えていた街作りゲームの要素開発の記事です。
今回はキャラ絵をランダム生成するあたりを実装します。どう考えてもこういう見た目の開発は後回しにすべきなのですが、その反省は最後にやります。
やりたいこと
普通のワーカー以外に、スキルを持ったリーダー相当のキャラを複数登場させたいので、そのポートレート画像をランダム生成できるようにします。
最初は Unity Asset Store で AI で自動生成された画像アセットから選ぼうと思ったのですが、なんか私のイメージに合うものがなかったので、DLsite で販売していた 【ドット絵素材】3種セット を使うことにしました。(顔パーツや衣服が画像ごとに分かれてる素材です)
価格を見たら 110 円で「おかしいでしょ! もっと高くしてよ!」と思いました。
今回の目標は、この素材をランダムに組み合わせて Unity で描画することです。
やったこと
まずは UI を定義して適当に選んだ画像を組み合わせて表示されるようにしました。
よいです。
枠の UI 素材には Pixel Art GUI 2 素材を使っています。
次に、画像を登録して、その登録した画像をどう使うかを YAML ファイルで定義しました。
↓ Odin Inspector アセットで Dictionary で画像の Sprite を登録したもの
↓ どういう風に描画するかを定義した YAML ファイル
toraneko_portraits_female.yaml.txt (1.28kB)
ダウンロードキャラの男女で異なるパーツが使われるようにするあたりは、この YAML 定義ファイルを男女で分けることで実現しています。
後は、なんやかんやで描画されるように実装しました。
↓ 今回の実装の主なファイル(記事を書いている時点のもの)
ToranekoPortrait.cs (2.03kB)
ダウンロードToranekoPortraitImages.cs (2.30kB)
ダウンロードここまでの実行結果がこれです。
よいです。
そして、口を開いているパーツが必要以上に目立つので使わないように定義を修正しました。
あと、髪の色を変更できるようにするあたりは、用意されていた髪の画像を ImageMagick を使って一括で灰色に変更しました。
↓変換に利用した Python スクリプト
import os
import subprocess
if __name__ == '__main__':
directories = ['..\\RR\\Assets\\RR\\Images\\【ドット絵素材】3種セット\\【ドット絵素材】ファンタジー職業2\\髪\\髪型',
'..\\RR\\Assets\\RR\\Images\\【ドット絵素材】3種セット\\【ドット絵素材】ファンタジー職業2\\髪\\前髪',
'..\\RR\\Assets\\RR\\Images\\【ドット絵素材】3種セット\\【ドット絵素材】ファンタジー職業2\\顔\\眉']
for directory in directories:
files = os.listdir(directory)
for fileName in files:
if fileName.startswith('gray_'):
continue
if not fileName.endswith('.png'):
continue
path = os.path.join(directory, fileName)
subprocess.run(f'magick {path} -color-matrix ".2 .5 .3 .2 .5 .3 .2 .5 .3" {directory}/gray_{fileName}')
そして、この灰色にした髪画像に Unity の処理で色を付けてみたものが、これです。
元の色の違いによって違和感はありますが、とりあえずよいことにしました。
気になるようなら手動で彩度を調整しようと思います。
最後に、ここまでは女性キャラで作業していたことを同様の手順で男性キャラを作れるようにしたらおしまいです。
↓ キーを押すとキャラのパーツをランダムで作り直すようにしたもの
このデモ表示は、上半分が女性で下半分が男性です。男女の区別がつきにくい気もするのですが、私がそこまで気にならないのでオッケーです。
よいです。
まとめと今後の予定
今回開発した要素はゲームシステム的にはそこまで重要ではないので、もっと後に開発すべきだったとは思います。ただ、素材を探して購入してしまうと、まぁ、その、気になり続けたので実装しちゃいました。
「お菓子があると食べちゃうから、痩せたいならそもそも買わないようにする」とかいう言葉が脳裏に浮かびました。はい、よくわかります。はい。
この「再建を繰り返す街作りゲーム開発」よりは他の2プロジェクトの開発を進めたいので、この開発については今後も不定期投稿にしようと思います。プロジェクト初期の開発は楽しいのですが、なんというか、開発を進めすぎないようにがんばります。