ノーツ描画の仕様【うみぐりゃーずアドベントカレンダー 2022】

うみぐりゃーずアドベントカレンダー 2022 3 日目の記事です。

adventar.org



はじめに

こんにちは、UMIGURI の開発者の いののて です。趣味でソフトウェアを開発したりゲーセンで某スライダーを擦る音ゲーをしたりしています。弾幕 STG音ゲーもぼちぼちしてます。ところで聖女アンナちゃん、可愛いですよね。もちろん今開催中のグッズキャンペーンで新規立ち絵入手するつもりです。アンナちゃんが貰える期間の最終日が 1 月 11 日、僕の誕生日は 1 月 15 日。近い。まるで誕生日プレゼントのようですね。

すこだ......

今回、嬉しいことに主催の ひとみとせ さんに うみぐりゃーずアドベントカレンダー 書きませんか!?と誘われて参加することになりました。

アドベントカレンダーは今まで専ら読むだけだったのですがこうして初めての記事、ということで結構緊張しますね。



ノーツ描画の仕様

画像がないと寂しいので適当にパワポで作成した画像

設定したテーマ 開発者として ということで、この記事では本家や UMIGURI のノーツ描画の仕様について 3 つ解説します。ギミックや AIR-TRACE などで装飾を施す際などに参考になれば幸いです。

地面ノーツの描画順

地面ノーツ (TAP、ExTAP、SLIDE、HOLD、FLICK、DAMAGE) はその種類とフィールド上の奥行き方向の位置によって描画順が決まります。(最背面から順に描画されます。)

幅が狭いノーツが上になり、同じ幅同士は奥のノーツが上になる

注意: UMIGURI は奥行き順ではなく時間順で描画するようになっているので (不具合です) 追い越しノーツの描画順が設計と異なる挙動になっています。また、本来は SLIDE の中継点と終点ノーツにもこれらの規則が適用されるのですが UMIGURI は無視して始点の描画順に依存して描画します。



AIR 系ノーツの描画順

AIR 系ノーツ (AIRAIR-HOLD、AIR-SLIDE、AIR-CRUSH、AIR-TRACE) は一部を除いて、その種類とフィールド上の奥行き方向の位置によって描画順が決まります。(最背面から順に描画されます。)

譜面に装飾を施しても意図した見た目にならない場合は描画順を考慮すると解決できることがあります。

それぞれのノーツに AIR-TRACE を重ねたときの様子

AIR 系ノーツの描画順について
AIR 系ノーツは立体的なオブジェクトなので、現実世界のように視点から見て手前に位置する物体は手前に、奥に位置する物体は奥になるよう描画したいですよね (開発者目線)。それを実現するためにゲームなどのリアルタイムレンダリング*1 用途の 3DCG では Z バッファ法 という技術があります。

この技術を使えば描画順を気にせず奥行きを考慮した描画ができるのですが、万能ではなく、テクスチャ (オブジェクトの表面に貼り付ける画像) に半透明で後ろが透けて見える部分があるとうまくいかないことがあります。

UMIGURI (や本家) では、AIR-CRUSH の箱の枠や始点の箱の紫の部分、AIR-ACTION は完全不透明なためこの技術を使って順番を気にせずに描画することができます。しかしそれ以外の AIR 系ノーツはテクスチャに半透明要素があるため、それらに描画順を設定し前後関係が擬似的に極力自然に見えるよう描画しています。

不透明と半透明
半透明オブジェクトを不透明オブジェクトと同じように描画するとおかしな結果になる

詳しい解説: ゲームなどのリアルタイムレンダリング用途では奥行きを処理するために高速な Z バッファ法 が用いられます。この手法を簡単に説明すると描画したいオブジェクトが手前のオブジェクトによって隠れていた場合は描画せず、隠れていなかった場合は描画する仕組みになっています。しかしこれには罠があり、手前のオブジェクトが不透明の場合は正常な結果が得られますが、半透明だった場合は後ろが透けているのにもかかわらず隠れた部分が描画されないためおかしな結果になます。そのため 3DCG を扱うゲームなどのソフトウェアでは不透明オブジェクトを先に描画し、次に半透明オブジェクトをそれらに描画順を設定して、物体同士の奥行き判定を不透明オブジェクトに限定しながら描画する実装になっていることが多いです。



ノーツが中央判定タイミングを超えたときの挙動

ノーツが中央判定タイミング (ガイド音が鳴るタイミング) を超えたとき、流れる速度が等倍になります。

例えば -1.0 倍速にして手前からノーツが流れるようにした場合は、判定線に重なった瞬間に反射したような挙動になります。

ロングノーツの背景部分は判定線跨いだとき、これを境に手前側は等速で流したときと同じ形状になります。

-1.0 倍速設定の SLIDE。判定線で反射したような見た目になる。手動プレイかつ放置しないと見られない貴重な光景
0.25 倍速設定の AIR-SLIDE。判定線から手前の部分は等速になるので吸われているような見た目になる
HOLD は判定線で切れて AIR-TRACE は判定線で切れないことを利用した、AIR-TRACE が出現したら一拍置いて HOLD を押すギミック。AIR-TRACE と HOLD は 0 倍速設定になっている


おまけ

UMIGURI NEW (仮)

UMIGURI v1 に潜在する様々な問題点を解決するために「UMIGURI NEW (仮)」としてほぼ一から開発している新バージョンです。

重かった UI 描画も独自のエンジンで軽量化し、表現力も向上させています。 開発進捗は Twitter @inonote で流しています。

プレイ画面
リザルト画面

※キャプチャ画像は開発中で未完成状態なので完成版は大きく変わっているかもしれません。
※プレイ画面の背景が新しくなっていますが、従来の背景に切り替えることも可能です。



UMIGURI ㊙情報

(ゲームディレクトリ)/data/music のサブディレクトリに .umgrignore の名前で空のファイルを配置すると、起動時の楽曲を収集する際そのディレクトリの存在が無視されます。

楽曲数が多くなるとその分起動時間も長くなりますが、この機能を使うことで起動時間を短縮することができます。

デバッグ機能として実装していたのですが消し忘れました。

例: EXAMPLE ディレクトリを無視したい場合

UMIGURI
┗ data
 ┗ music
  ┗ EXAMPLE
   ┣ 3dBackgroundTest
   ┣ 3dFieldTest
   ┣   ⋮
   ┣ Tutorial
   ┗ .umgrignore   ←こう配置する



好きな配置

一応作譜人 (さくふんちゅ) でもあるので好きな配置を置いておきます。

SLIDE 中継点を等間隔でカチャカチャ鳴らす配置
チャッチャッチャッチャ...って軽快な音が鳴るの好き。

例:

  • Bad Apple!! feat.nomico (MAS)

    ボーカルのリズムを無視して 4 分で音取ることで緩急が生まれる

  • 太陽曰く燃えよカオス (MAS)

    動きが付くと楽しい

  • staple stable (MAS)

    ボーカルに無い音を取っているが前後の流れを崩さない配置

何とは言わないけど星 PLUS から始めた民なので残念ながら一番上以外は遊んだことないです... (復活してくれ)

ノーツの効果音を巧みに使っている配置

楽曲のメロディーの音の高さが上がるのに合わせて AIR-HOLD を配置して高音の効果音を鳴らすようにしています。

また、効果音の高さは TAP → SLIDE 終点 → AIR-HOLD の順で高くなることが知られていますが、この配置は 1 拍目で TAP を鳴らし、 2 拍目で SLIDE 終点 を鳴らし、 3 拍目で AIR-HOLD を鳴らすことで段階的に音が高くなるようになっており、プレイが盛り上がるようになっています。(同時に鳴る効果音の種類も 1 → 2 → 4 と増えてますね。)



最後に

ここまで読んでいただきありがとうございます。
これからチ...ニズムで遊ぶ時はノーツ描画の仕様の知識を活かして、このノーツは描画順があのノーツよりも上だからこんな見た目になってるんだなーとか意識して譜面を見るとより面白くなるかも知れません。僕はしてます。

*1:その場で画面を描画すること。高負荷な処理は極力避け、描画を短時間 (画面の垂直同期の間隔内) で済ませる必要がある。反対にあらかじめ描画しておくことを事前レンダリングという。ゲームの途中に挟まれるムービーなどが大抵それ。