【UE5 C++】Unreal Engine で テトリス風ゲームを作ってみる#9
前回のつづき
前回は、レベルとスコア、UIについて確認した。今回はテトリミノの高速落下とステート管理について確認する。
Unreal Engine Version 5.3.2
テトリミノのステート管理
ステート管理方法は、Unity での実現方法と差分はない。Enum でステートを定義して、Actor::Tick メソッドや、入力イベントメソッドの中で場合分けして動作を変えればよいだけだ。結局はロジックで作成する部分はUnity でも Unreal Engine でも考え方は同じでよい。
- Tetrimino のステート定義
各ステートの定義はUnity の時と同じ。
enum class EState : int { IDLE, DROP, FASTDROP, LOCKED, MAX};
- TetriminoのTickメソッド
Unity だとMonobehaviour のUpdate メソッドの中で振り分けていたが、Unreal Engine では、Tick メソッドの中でステート処理を振り分ける。
- void ATetrimino::Tick(float DeltaTime)
- {
- Super::Tick(DeltaTime);
- TotalDeltaTime += DeltaTime;
- switch (State)
- {
- case EState::IDLE:
- TickEventIdleState();
- break;
- case EState::DROP:
- TickEventInDropState();
- break;
- case EState::FASTDROP:
- TickEventInFastDropState();
- break;
- case EState::LOCKED:
- TickEventInLockedState();
- break;
- default:
- break;
- }
- }
高速落下
高速落下状態(EState::FASTDROP)に入るイベントはDown キー入力イベントで、そこでステートを変更し、高速落下中は落下時間をFAST_SPEED_RATE 分だけ短縮して速度を上げる。
- // Down キーイベント
- void ATetrimino::OnMoveDown()
- {
- State = EState::FASTDROP;
- }
- // 高速落下状態処理
- void ATetrimino::TickEventInFastDropState()
- {
- if (TotalDeltaTime > FallSec*FAST_SPEED_RATE)
- {
- auto isDrop = FreeFall();
- TotalDeltaTime = 0.0f;
- if (!isDrop)
- {
- State = EState::LOCKED;
- if (Listener != nullptr)
- Listener->OnLocked();
- }
- }
- }
高速落下を実装したプロトがこちら。
次の記事
(準備中)