[Unity, R3]ローグライクゲームのレリックを実装する
背景
ローグライクゲームを作る際に、PeglinやSlay the Spireのようなレリック効果の複雑な相互作用をどのように実装するべきか悩みました。
この際にR3(旧UniRx)というライブラリを使えば比較的綺麗に実装できるのではないかと思い、実装してみました。
(R3に関しては既に色々な解説記事があるので、解説は省略します。)
実装のイメージ
概要
ゲーム内のレリックが発動しそうなタイミング(プレイヤーが攻撃した時、コインを入手した時等)に、値を紐付けたイベント
を発行します。
この際にイベントに紐付けられたレリック
の処理を呼び出し、紐づけられた値
を任意に上書きし、上書き後の値をゲーム進行に使うという流れです。
処理の流れ
以下に、「プレイヤーの体力が8割以上なら獲得するコイン量が2倍になる」
というレリックの効果が発動する流れを説明します。
1.OnCoinGain
イベントを定義する
2.レリック処理を定義し、OnCoinGain
イベントに紐付ける
3.コインを2枚入手
3.OnCoinGain
イベントがValue=2
で発行される
4.レリック処理が発動し、条件を満たしていたらOnCoinGain
イベントのValue
を2倍にする
5.OnCoinGain
イベントのValue
を参照し、実際にコインを4枚獲得
6.OnCoinGain
イベントのValue
をリセットする
コード
以下に実際のコードを示します
GameEvent<T>
コード全文
IRelicBehavior
コード全文
EventManager
コード全文
レリック
コード全文
コイン獲得処理
コード全文
使用方法
EventManager
に任意のイベントを定義し、任意のレリックのIRelicBehavior.ApplyEffect()
内でレリックの処理をするメソッドをイベントのGameEvent<T>.Subscribe()
を使って登録します。
任意のタイミングで、GameEvent<T>.Trigger()
を呼び出すことでレリックの処理が発動するので、その後にGameEvent<T>.GetValue()
で値を読み取ってゲーム進行に使います。
最後に
冒頭でも書きましたが、この実装はあくまでR3を初めて触った自分が思いつきで実装してみたものです。
他にいい実装法をご存知の方が居られましたら是非コメントなどで教えて頂きたいです!🙇
Discussion