メインコンテンツまでスキップ

トレーナーの背面スプライトとボール投げ

2D バトルの開始時、プレイヤーのキャラクター(ダブルバトルでは味方トレーナーも)はカメラに背を向けて画面の隅に立ち、ボールを投げ、画面の外へスライドして消えます。これをすべて 1 つのコンポーネント BattleTrainerSprite が描画します。バトルシーンのトレーナースロットごとに 1 インスタンスです(AllyTrainerSprites、EnemyTrainerSprites)。

このページでは、そのスプライトの作り方と、どの画面でも投げ動作が正しく見えるようにコンポーネントが行ってくれることを説明します。

背面スプライトとは​

キャラクターの背面は CharacterType アセットに保存されます。

フィールド型意味
BackSpriteMaterialキャラクターのアニメーションする背面。列×行(_Flipbook)に並んだフレームのシート(_SpriteSheet)を保持し、MCE のフリップブックシェーダーで描画されるマテリアル
BackSpriteTimelineFlipbookTimeline投げ動作のセルと、それぞれの持続時間。エンジン自身のスプライトでは空

背面マテリアルを持たないキャラクタータイプ(たとえばインポートしたゲームのプレイヤー)は、単に描画されません。プレースホルダーの四角を表示する代わりに、レンダラーがオフになります。

フリップブックとそのタイムライン​

デフォルトでは、投げ動作はシートのセルを一定のペースで順に進めます。コンポーネントは AnimationDuration(速度 1 で 1 秒)を、マテリアルが _Flipbook で宣言するセル数で均等に割り(セルを 1 つ宣言するか何も宣言しない場合は、シリアライズされた FlipbookSteps、デフォルト 5 を使用)、折り返さず最後のフレームで止まり、0.4 秒でボールを放します。

自分で描いたスプライトならそれで十分です。しかしカートリッジでは、あるセルを数ティックだけ保持し、別のセルを 50 ティック保持します。FlipbookTimeline はまさにそれを記録します。

フィールド意味
cells各エントリで表示するセル
seconds各エントリの持続時間(速度 1 のとき)
releaseEntryボールが手を離れるエントリ(なければ負の値)

テーブルが使用可能なのは、エントリが 1 つ以上あり、すべてのエントリに時間があり、すべての時間が 0 を超えているときだけです。それ以外(シーンがデフォルトで作成する空のテーブルを含む)は「使用不可」となり、トレーナーは均等なフリップブックを維持します。

使用可能なテーブルがある場合:

  • 各セルはそれぞれの時間だけ表示されます(秒 t に表示されるセルは CellAt(t))。
  • ボールは放出エントリが始まった時点で放たれます(ReleaseSeconds:それ以前のエントリの合計)。
  • 投げ動作全体は TotalSeconds の間続き、その後は最後のセルが保持されます。

FlipbookTimeline.FromTicks(cells, ticks, ticksPerSecond, releaseEntry) を使うと、カートリッジの数値からテーブルを作成できます。例として、HeartGold の投げ動作は 1/60 秒のティックで 8、16、6、2、4、2、2、52、2 であり、ボールは 4 番目のエントリの開始時、つまり 8 + 16 + 6 = 30 ティック後(0.5 秒後)に離れます。

投げ動作は独自のクロックで動く​

投げ動作はスライドに結び付いていません。ThrowAndSlide(speed, callback) は両方を開始しますが、投げ動作はコンポーネント自身の Update(TickThrow)で進行します。経過時間に応じたテーブルのセルを表示し、ボールが離れるときに 1 回だけ callback を呼び、テーブルが終わると終了します。バトルの速度は両方に作用します。

この分離は重要です。オリジナルのスライド速度では、スライド(0.45 秒)は投げ動作(ボールが離れるのは 0.5 秒)より短いため、スライドの完了で駆動される投げ動作はボールを早く放してアニメーションを途中で切ってしまいました。そのほかの保証:

  • 別の投げ動作の実行中に開始された投げ動作はそれを置き換え、置き換えられた側はボールを放しません。
  • トレーナーのオブジェクトが非アクティブで更新できない場合、最後の手段としてスライドの終了時にボールを放し、バトルが永遠に待たされることがないようにします。

スライドは常に画面のすぐ外で終わる​

投げ動作の後、トレーナーは画面の外へスライドします。次の 2 点は自動で計算されます。

速度。 スライドは毎秒 SlideUnitsPerSecond ワールドユニットの線形移動です(デフォルトは 3.125:オリジナルの 1 フレームあたり DS 5 ピクセル)。0 にすると、代わりに固定の SlideDuration(速度 1 で 2 秒)を使います。

目的地。 バトルシーンには、固定された 1 つの x にマーカー(SlideTarget)があります。固定の x はすべての画面で正しくなることはできません。16:9 の画面では端がずっと近く、21:9 や 32:9 では、固定マーカーまでスライドするトレーナーは画面の内側で止まってしまいます。そのため、目的地はトレーナーを描画するカメラに合わせて計算されます。マーカー側の画面の端のすぐ向こうで、図形自身の到達範囲(描画がピボットからその端に向かってどれだけ伸びているか)に、さらに小さな余白(SlideExitMargin、0.1 ユニット)を足した位置です。高さと奥行きはマーカーのものです。カメラが正投影でない場合や 3D ステージでは、シーンのマーカーが決定します。

ピクセルパーフェクト描画​

ピクセルアートで作られ、ポイントフィルタが適用され、作成時のサイズで描画された背面シートは、ピクセルが 2 種類の幅で表示され(一部が他より画面ピクセル 1 つ分広くなる)、図形がざらついて見えます。こうしたシートに対して BattleTrainerSprite は、シートの各ピクセルが整数個の画面ピクセルを覆う(1 未満にはならない)ようにサイズを設定し、図形の足元をオリジナルと同じ位置に置きます。

  • サイズは、作成時のサイズに最も近い整数ピクセルのスケールです(PixelPerfectHeight)。
  • 高さは、立っている図形の最後に描かれた行が画面の下端に載るように選ばれます(最初のフレームの下の空行はテクスチャから数えられ、端より下に出ます。オリジナルでも体が画面の下からはみ出すためです)。テクスチャを読み取れないシートは、シーンが与えた高さを維持します。
  • 水平位置には触れません — それはスライドが管理します。

このルールは意味のある場合にだけ適用されます。ポイントフィルタのシート、正投影カメラ、そして 2D バトルです。バイリニアフィルタで描かれたアート(大きなイラストの背面)には保つべきピクセルがなく、作成時のままになります。3D ステージも同様です。シートがなくなれば、作成時のサイズに戻ります。

計算は各カメラが描画する直前に、レンダーパイプライン自身のイベント(URP の beginCameraRendering)に接続されて実行されるため、以前のフレームの値ではなく、カメラの最終的なズームが使われます。

3D ステージでは​

バトルが 3D ステージを使う場合、トレーナーはバトル全体を通してオリジナルが置く位置に立ちます。スライドしてもその場に留まり、待機フレームはゲームのクロックでループし、モンスターを繰り出すときに投げ動作を再生します(ThrowOnStage)。描画は、その 1 ピクセルがステージのピクセルサイズになるようにスケールされます。

影​

トレーナーにはモンスターと同様の影が付きます。描画の子オブジェクト Shadow で、シェーダーの影のグレーで塗られ、中心を図形の足元にして地面に横たわり、描画と同じ画像・同じ反転を持ちます。

セットアップ​

  1. フリップブックシェーダーで背面のマテリアルを作成し、シートを _SpriteSheet に割り当て、_Flipbook にシートの列数と行数を設定します。ピクセルアートのシートは Point フィルタを使う必要があります。
  2. それを CharacterType の Back Sprite フィールドに割り当てます。
  3. 任意。独自のタイミングを持つ投げ動作にするには、Back Sprite Timeline(セルのリスト、それぞれの秒数、放出エントリ)を埋めます。均等な投げ動作にするには空のままにします。
  4. バトルでは、BattleManagerCharactersModule がマテリアルとタイムラインをスロットの BattleTrainerSprite に渡します(SetMaterial(material, timeline))。

カートリッジからインポートしたゲームには、これらは一切不要です。インポーターが、カートリッジのデータから各プレイヤーキャラクターの背面マテリアルとタイミングテーブルを設定します(インポートされたゲームとゲームプロファイル を参照)。

リファレンス​

型名前空間役割
BattleTrainerSpriteOpenMon.MCE.Battleバトル中のトレーナーを描画・アニメーションする:投げ動作、スライド、ピクセルパーフェクト描画、影
FlipbookTimelineOpenMon.MCE.Battle投げ動作のセル、時間、放出エントリ
CharacterTypeOpenMon.MCE.CharactersBackSprite と BackSpriteTimeline を保持