さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

SRPGでのタンク職

1. 前置き

 MagicScrollTacticsのリリースはPC、Switch、PS4とすでに一段落していて、今は次回作をちまちまと作っているところなのだけど、もうひとつやり残していることがある。ゲーム設計の際にどういう意図があったのかをテキストにしておくというものだ。今は頭の中に残っているものの、次回作ができてしまうとおそらく曖昧になるだろうし、そもそも書く動機が薄くなる(最新作のことについて書きたくなるもんだし)。つまり今のうちにやっておくべきことだろう。

 ということで、企画というほどちゃんとした体裁ではないのだけど、つらつらとこんな感じの記事を何回か書くことになると思う。続くかどうかは謎です。

2. MSTのタンク職

2.1 モダンなゲーム

 MSTはジャンルSRPGではあるものの、RPGの文法で作っている部分がある。特にバトルまわり。小さいマップでパーティが少ないのはそういうことである。

 さて、RPGのバトル開発において、どうしたらモダンなものになるか?と考えたときに、MSTでの答えはロールの概念であり、ロールって何かというと、DPSだとかヒーラーだとか、タンクだとかだ。

2.2 SRPGとタンクの相性の悪さ

 タンク。困ったことに、実はSRPGとタンク職の相性はけっこう悪い。というのは、敵ユニットはAIで動くもので、AIというのは基本的にできるだけ賢くつくるものだからだ。固いユニットと柔らかいユニットが並んでいたらどちらを狙うか? 柔らかいほうに決まっている。しかし、タンク職は頑丈でなくてはならない。

 頑丈なタンク職が敵から狙われるにはどうすればいいか。

 ここで、SRPGだからといって位置の概念で解決するのは悪手だと思っている。確かに前線にタンクをおいて後ろに射撃部隊をおけば実現しそうだ。しかしそれをやるにはパラメータ調整にかなりの制限がかかる。敵の移動力は低くする、敵の射程は短くする、乱戦にはできない、味方の近接アタッカーは諦める…。

 ついでに、ユニット位置や射程が重要になると、プレイが重くなるという問題がある。いちいちステータスウィンドウで移動力と射程をチェックして、という作業をプレイヤーが要求されるからだ。(射程計算をシンプルにしておく必要もある。移動後の攻撃射程は単純な足し算で済んでいるか?)

 とまあ、位置調整によるアプローチが全くありえない訳ではないのだけど、かなりストイックなゲームになるだろうとは思う。それは今回やらない。

2.3 挑発スキル

 結局、MSTではAIにバカになってもらうことで解決している。挑発スキルがそれだ。

 挑発を使えば敵はこちらを狙う。理不尽極まりないが、ともかくそれで間違いなくタンク職は仕事をする。あとはスキル効果がどう途切れるかを設計すれば良い。

 反省点として、MSTの挑発スキルはヘイト値とかはなく確実に吸えるのでちょっと極端に強すぎた感じもある。この辺はまあ次の課題なのだけど、わかりやすく強くないと使ってもらえないタイプのスキルではある、という事情もあり…。ちなみにラスボスの二回行動は強すぎる挑発スキルへの対策として(あわてて)組んだ。

 (実はもうひとつ仕掛けはあって、モンスター系のAIは一番近いユニットを狙うようにできている。ただ近接系アタッカーはやっぱり狙われてしまうので、これだけでタンク運用は難しいと思う。ごま塩程度のもん)

2.4 とまあ

 SRPGだからといってユニット位置で解決しようとしたり、AIにただ賢さを求めると、あんまりうまく回らないなあ、という部分。

 こういうところは頭をゆるくして設計するのがよさそう。

2021年のこと

 年が明けてました。おめでとうございます。

去年振り返り

toriden.hatenablog.com

 MSTでやることが残ってる→PS4版でした。無事リリース。PS5では動いてるんですかね?

 裏方→一昨年の仕込みからの回収はうまく回っているので、おかげでさしあたり干からびなくてもよさそう。表には出ない部分だけど我ながら本当にうまくやった。

 去年コミケがなかったというのは実のところ良し悪しあって、スケジュールについてはだいぶ立てやすくてそれで回った部分があった。例えば外注しようとするとイベントの都合で納期が…というのはままある。

今年やること

次作品(SDC)

store.steampowered.com

 延び延び延びとなっていますが、開発が難航しているというより別件で手が止まっていたのが大きく。というわけでトラブルとかではない、はず。…いやいやそうやってフェードアウトしていくのがアカンパターンなんだが。

 関係ないけどなんか小さいゲーム作りたい。

MST

 アクリルスタンドを作ってあるんだけど頒布するイベントがないので宙ぶらりんになってたりする。半分自分用なのでわりと満足してるんだけど。イベントあったら頒布します。

実生活

 正月早々どうもめでたくない方向で節目になりそうなので、ちょっと備えがいるっぽい。あとは覚悟。ゆるくいくぞ。身体を愛え。

 去年は部屋をがっつり掃除して机を大きくしたのが良かった。今度はそろそろ椅子を替えよう。(年の初めに書くことか?という感じだけど、そのレベルでの大掃除だったのだ)

とまあ、

とりあえず死なないようにするというのはもちろんのこと、それに加えて5年後10年後にも馬力を出せるようにしておかないとなあというフェーズみを感じる。タフにならねば。

マウスを買うこと

マウスが壊れた。ので、買い替えることにした。普通なら電気屋に行って手触りを見たりするんだけど、このご時世に展示品に触るのはよろしくない。ということで無謀にも通販で勝負する。

先代

壊れたのはロジクール MX2000 MX Master 。多分4、5年ぐらい前に購入。マウスカーソルがなめらかに動かなくなり処理落ちするような動作になった。寿命。

まずは素直に同シリーズの最新を買う。

MX Master 3

これはなんといってもホイールが良くない。

ホイールの動作にはラチェットモード(カチカチする)とフリースピンモード(なめらかに回る)があるんだけど、ラチェットモードでの回転が認識されないことがある。回転し始めや回転方向の切り替え時に多発。ホイールってこんなもんだったっけ?と思って1000円ぐらいのマウスと比較したけど、1000円のほうはやっぱりちゃんと動いた。ナニコレ?

amazonレビューで同じような感想があった。きっついなー。とりあえずロジクールのサポートに相談はしてみたものの期待はしていない。 www.amazon.co.jp

ちなみにフリースピンモードはちゃんと動くので、そっちしか使わないなら問題ないと思う。

あとMX2000と比べてちょっと高さがある?ので、わりと握った時の感覚が違うのが困った。同じシリーズだといっても安牌にはなんないなあ。

MX Master3は電磁石ホイールを使っていた。次は電磁石ホイールを搭載していない少し古いやつを試す。

MX ANYWHERE 2S

ホイールクリックが無い。そんなことある?

ホイールの手前にボタンがあり、それがセンタークリック扱いなんだけど当然押しにくい。設定でサイドボタンを使うしかないか。

ホイールクリックを使わないなら問題ないと思う。ボタンの感触はかなり良い。

イマイチ煮え切らないので次はホイールクリックがあるやつを試す。

MX Anywhere 3

めげずに電磁石ホイール搭載機。だからかどうかは知らないが、ラチェットモードでやはり反応が悪いときがある。とはいえMX Master3よりはかなりマシ。

なんとか使えそうだけど、あとは贅沢を言うとフルサイズのマウスがいいんだよなあ。

まだ他のを試したい気持ちはあるんだけど、何せこの時点で出費がなあ! ということでしばらく上記のものを使ってみて慣れるかどうか。

【Unity】セーブデータにサムネイルを含める

やること

セーブデータ一覧で、ゲーム画面がサムネで表示されてるやつ。

コード

public async UniTask<byte[]> GenerateThumbnail(MonoBehaviour coroutineRunner)
{
    Texture2D thumbnail = null;
    await TextureUtil.CaptureScreenshot(width, height, _ => thumbnail = _).ToUniTask(coroutineRunner);
    var jpg = thumbnail.EncodeToJPG();
    Destroy(thumbnail);
    return jpg;
}

TextureUtil.CaptureScreenshotの実装は↓ github.com

表示時にはTexture2D.LoadImage(byte[])してRawImageコンポーネントに投げれば良い。

解説1.テクスチャのリサイズ

これが一発でとはいかない。

いかにもできそうなTexture2D.Resizeピクセル情報が初期化されるし、Graphics.ConvertTextureでは変更が反映されないようだ(VRAMが書き換わるだけなのか?よくわからんけど。)

参考

qiita.com

解説2.UniTaskの非対応部分

ScreenCapture.CaptureScreenshotAsTexture();を呼ぶにはyield return new WaitForEndOfFrame();で待つ必要がある。これがUniTaskでは非対応。READMEにもそう書いてある。

Some methods that require coroutine's end of frame(ScreenCapture.CaptureScreenshotAsTexture, CommandBuffer, etc) does not work correctly when replace to async/await. In that case, use a coroutine.

github.com

megabitconvention03 不参加のこと

当日ぎりぎりです。

今朝から体温を計測したところイベントの基準(36.8度)より高く、今回は参加を見送ることにしました。

頒布予定だったアクリルフィギュアについては、通販を検討するかなあというところ。

それではイベント参加の方はお気をつけて。

megabitconvention03前日です

というわけで23日、明日の開催です。

重要なお知らせ

いきなり申し訳ないんですが今回は長居せずにパッパと撤収する予定です。気になるという方はとりあえず11時30分までに来ていただけると。

頒布物

拙作MagicScrollTacticsのキャラのアクリルフィギュア。立てられる奴。

コミケとかが無くなった都合で今回の新刊(まだどのイベントでも出していない)になります。

とり・さかなの2種類で各600円。 f:id:enuenupi:20200822230507p:plain

新型コロナの関係でぎりぎりまで本当に参加できるかどうかは分からないところではありますが、気を付けていきましょう。読もう!公式サイト!

前の記事

toriden.hatenablog.com

【Unity】ビルド後にlightmapが反映されなくなる場合

Graphics->Shader Stripping->LightmapModesがCustom設定になっている場合がある。

チェックボックスを直すか、Automaticに設定する

f:id:enuenupi:20200725053349p:plain

参考

【Unity】なんか影が出ない問題の対策 - テラシュールブログ

これやっとけばライトマップは焼ける!Unity 2018 ライティング設定7項目 - いんでぃーづ