カテゴリの最新記事

多重スクロール背景の実装

今回は多重スクロール背景の実装を行う。
実装、とか偉そうなことは言ったが、あまり賢い方法ではないので違う方法を模索した方が良いだろう。最初は「テクスチャのUV座標をズラしていくだけで簡単にできるんじゃね?」とか思っていたが、それができるのはどうも何かのオブジェクトに貼っ付けてあるようなテクスチャだけでPaperSpriteに対してはできない……のかもしれない。できるのであればそうした手法を取りたかったが、私の頭ではいまいち理解できなかった。

で、完成したイベントグラフがこちら
WS2016-07-16_12_38_58
おおう……なんというか……空飛ぶスパゲッティコード……
なにをしているかというと、まずこのManagerアクターがBeginPlayされたときに自身の初期位置を設定する(Playerと同じ座標)。その後、4つのPaperSpriteコンポーネントに表示するスプライトを設定、スプライトのScaleを設定、スプライトの位置を設定(微調整)するというものである。
イベントティックで行っていることは、Managerアクターの位置をPlayerに追従させて、各背景スプライトに対しては前回描画時と現在のPlayer位置の差を取り、その差の分をそれぞれのスプライトに設定されている移動量を掛け合わせて動かしている(画面奥のSpriteはPlayerの移動量に対してゆっくりと動き、手前のSpriteはそれよりも早く動く)。
やっていること自体は単純だが、それを上手いこと簡潔に表せなかったのでこのような事態になってしまった。

では、このBPを細かく見ていくことにする。いや、あまり褒められた手法とは思えないので、わざわざメモに残す必要もない気はするが……

WS2016-07-16_13_12_05
まずは表示したい背景枚数分のPaperSpriteコンポーネントを追加する。
なんかもうこの時点で頭悪そうな実装方法の臭いがする。

WS2016-07-16_13_03_45
次に変数を作成していく。
作成する変数は、表示するSpriteを設定しておく変数、背景のスクロール量を設定しておく変数、背景の位置の微調整(オフセット)をするための変数、Spriteの大きさを設定しておく変数である。これらは表示したい背景枚数分用意したいので配列にするといいだろう。そして配置したレベル毎に背景を変更したいので、これらは全て編集可能な状態にしておく(目玉のマーク)。これらとは別にPlayerの位置情報を記憶しておく変数を一つ作っておく。

WS2016-07-16_13_03_46
次、まず最初にManagerアクターの位置をPlayerの位置と合わせる。
その後、各PaperSpriteコンポーネント一つ一つに表示SpriteやOffsetやScaleの配列の中身を渡していく。なんかLoop系のノード使えばすっきりさせられそうな気はするが、変に試行錯誤して動かなくなるのは嫌なので考えないことにする。

WS2016-07-16_13_19_29WS2016-07-16_13_19_36
イベントティックの方はといえば、イベント毎にManagerアクターの位置をPlayerの位置に合わせ、その位置と前回までの位置の差を取り、AddLocalOffsetノードでその差に移動量(画像で言うとMoveScale)を掛け合わせた数値分背景を動かし、最後にTempLocationに現在位置を記憶しておく流れだ。

スパゲッティコードではあるが、これで多重スクロールが実現できた。
とはいえ動作にも多少の問題があり、ジャンプの着地時などに何故だか背景がカクッと急な動きをする。気にしないようにすれば気にならない程度なので大問題というわけでもないが、気持ちの良い挙動ではないことだけは確かだ。
あれかな、Playerの後ろになんかデカい板を追従させて、そこにテクスチャ貼ってマテリアルの設定からUV座標の移動させればいいんかな。そうすれば左右でループする背景にもなるだろうし。現状は横に長ーーーいSpriteを表示させているに過ぎないので汎用性に欠ける。
何か楽な方法はないものか。

UE4

Posted by むいか