Cz_mirror Game開発備忘録

週末にUnity でゲーム開発をしています。ゲーム開発を通じて得た情報の備忘録として活用するブログになります。

UniRx+コルーチンのダメージ後の一時的無敵処理

RAYSERという開発中のゲームでUniRxとコルーチンを用いたダメージを受けた際の、一時的な無敵処理を実装してみました。


https://gyazo.com/e89d1f4ba01090c9fee341e378fbe5ab

 

こちら具体的にはダメージを受けた際に、コルーチンの実行とともに、ReactiveProperty<bool>shieldActivateでシールドのフラグを有効にして、コルーチンの終了とともに無効にする程度の簡単なものになります。

shieldActivateを他のコンポーネントでも購読することでバリアのエフェクトを有効にする処理も別で実装しています。

 

プレイヤーのシールド関連処理(ダメージ、一時的な無敵の処理など)

using System.Collections;
using System.Collections.Generic;
using Doozy.Engine.Utils.ColorModels;
using UniRx;
using UnityEngine;
using UnityEngine.UI;

public class PresenterShield : MonoBehaviour
{
[SerializeField]
private Image imageComponent;

[SerializeField]
private GameObject player;

[SerializeField]
private Sprite[] shieldImages;

void Start()
{
if (!player)
{
player = GameObject.Find("Player");
}

if (!imageComponent)
{
imageComponent = GetComponent<Image>();
}

var playerShield = player.GetComponent<PlayerShield>();
playerShield.shield.Subscribe( x => { RefreshUI(x); }).AddTo(this);
}

// シールドUI更新
void RefreshUI(int shield)
{
var index = shield;
if (index < 0)
{
index = 0;
}

imageComponent.sprite = shieldImages[index];

}
}

 

バリアのエフェクト処理

using System.Collections;
using System.Collections.Generic;
using Doozy.Engine.Utils.ColorModels;
using UnityEngine;
using UniRx;

public class PlayerShieldEffect : MonoBehaviour
{
private GameObject player;

void Start()
{
player = transform.root.gameObject;
var playershield = player.GetComponent<PlayerShield>();

playershield.shieldActivate.Subscribe(x =>
{
ShieldActivate(x);
}).AddTo(this);

gameObject.SetActive(false);
}

void ShieldActivate(bool x)
{
if (x)
{
gameObject.SetActive(true);
}
else
{
gameObject.SetActive(false);
}
}


}