モノトーンの伝説日記

Apex Legends 楽しい!!

スプラトゥーンの塗りについて理論を考える 第1回

 まず最初に。

 この記事はより多くの情報を収集するために書かれています。Splatoon 3 のリリース前に,Splatoon の塗りのロジックについて詳細を考え,1 マガジン(あるいは 1 秒など)で理想的に塗った場合,どの程度塗れるかか,と言った理論でのお話を展開できるようにしたいと考えています。

1. シューター類の塗りについて

 まず最初に,シューター類について定義します。

 シューターの塗りをそのまま継承したブキをシューター類と呼ぶこととします。それには,基本的なシューター,リールガン,ボトルガイザー,スピナー,マニューバーといったシューターの塗りプログラムをそのまま採用しているブキが入ります。

 次に,塗りには 3 種類あることについて。

  • 着弾塗り
  • 飛沫塗り
  • 確定足元塗り

1.1 着弾塗り

 その名の通り着弾した部分(地面と弾のあたり判定が交差した位置)に発生する塗りです。

 よくカニ歩きで塗っていると,弾の末端には必ず塗りが発生していると思いますが,それは着弾したところに塗られるものです。

1.2 飛沫塗り

 射線上に飛散されるインクの塗りあとです。これには一定の規則が存在し,規則に従って散布されます。決して乱数ではありません。

1.3 確定足元塗り

 本来,1.2 の飛沫塗りで足元付近に発生する塗りも制御していたのですが,パラメーターを変更し,適切なシーンで足元塗りを発生するということはできません。なぜなら,射撃する方向によってパターンがどうしても変わってしまうからです。

 一般にうまい人ほど正面より少し上に向けて弾を発射します。そのときに最適な位置に足元塗りが発生するように,1.2 で制御していたはずです。しかし,初心者は下向きがちであるため,どうしても期待する飛沫塗りが発生しないケースが存在することになります。そのため確定で足元塗りを発生させるために追加されたロジックだと思われます。

2. 飛沫塗りについて

 今回のメインテーマである飛沫塗りについて検討します。

 そもそも飛沫塗りにパターンがあるのは「なんどろいどの開発記録」さんの以下の記事(しかも 1.4.0 時代!)に書かれているため知っている人も多いかもしれません。

nandroid.xilab.org

 このパターン周期は変数「SplashSplitNum」で定義されていると思っていいでしょう。当時の 1.4.0 のパラメーターと比較すると完全に一致していることは読み取れると思います*1

 基本的に,変数「CreateSplashLength」ごとに飛沫を 1 つ配置していく形になると思います。次の射撃にもステートは維持されます。

 ただし例外があって一番最後のリセットするときの射撃のみ,配置方法が変わります。なぜかわからないですが,弾が着弾したところから,変数「CreateSplashLength」を引いたところに着弾するようです。

※個人的に気力があまりないため,あまり検証数は多くないです。より適切な(appropriate)配置方法がある場合,Twitter の DM などで送り付けていただけるとうれしいです。

 ちなみにこれに基づいた飛沫配置シミュレーターを用意してあります。スプラシューターだけしか試してないので他のブキで当てはまるかわかりませんし,何なら射程というものが射撃角度によって変わるので,パターンを安定させるのは理想的なカメラリセット状態でしか再現できませんが…

jsfiddle.net

3. おまけ(サブウェポンの飛沫)

 サブウェポンも

  • 爆発地点の塗り
  • そこからはじけた飛沫

の 2 種類が存在すると思います。

 爆発地点の塗りは変数「Burst_PaintR」の半径で描画され,そこからはじける飛沫数は変数「Burst_SplashNum」で制御されます。

 飛沫数はスプラッシュボム(15),クイックボム・ロボットボム(10)のみ確認したのですが,おそらく実装上の都合により,指定した数値より 1 つ少ない飛沫しか発生しません。たまに時空のはざまに飲み込まれて少なくなったりはしますが,概ねこの傾向をもったまま飛沫数が生成されているのは確認済みです。

 たぶん for (int i = 1; i < Burst_SplashNum; ++i) 的な実装なんでしょうね。

まとめ

 少しでもスプラの塗りについて考えてもらえれば。

 個人的に飛沫塗りはスプラトゥーンの最大汚点なんじゃないかな? スプラトゥーン3 では改善する可能性はありそうですね。

 スプラトゥーンスプラトゥーン2の実装では,射撃射程が短くなったらドロップする飛沫数が単位時間あたりに少なくなりますから。本来,下向いたら隙間なく塗れたほうがより自然ですよね?

 個人的にこの点を改良するなら飛沫マップをあらかじめ生成しておき,実際の射撃射程が短くなったらより密に配置(つまり配置間隔をストレッチさせる),そんな感じがベターな気がします。今のロジックはそのまま使えますしね,理想射程の変数一つ増やすだけで。

 例えばスシの理想射程を 131 として,実際の射程は 92 しか届かない場合,今の場合,飛沫は 92 の位置に落ちますが,上の例のストレッチさせる場合,64.6 の位置に落ちます。

 もちろんこの場合の欠点はあります。上方向に撃った場合のケース(曲射)を考慮しないといけないということ。その場合は発生する飛沫半径を徐々に小さくする変数でも加えればいいでしょう。変数「SplashPaintRadiusReduceStartFrame」と「SplashPaintRadiusReduceEndFrame」でも加えて。そうすれば上方向の射撃と下方向の射撃で飛沫の大きさを変えることができますので。

 戯言はこれぐらいにして。今回は以上で!

*1:L3リールガンの塗り周期特定は難しい気がしますがそれは一致しています。H3リールガンはパラメーターと違うようですが,リールガンの塗り周期を把握するのは難しい気がしますのでここでは例外としてとらえます