FC2ブログ
    09 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 11

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】ゲームで、キャラの状態異常とかを付けてみよう!バフ・デバフなどの効果をComponentで管理してみたよ。 

    こんにちは!坂内っす。

    UnityでRPGやアクションゲーム等のバフ・デバフ的なものを作ろうと思った時に、こうやったよーって話。

    まずは、状態クラスのベースを作りました。
    簡易版ですけどね。

    【PlayerConditionBase.cs】

    using UnityEngine;

    public class PlayerConditionBase : MonoBehaviour
    {
    protected bool isSetUp = false;
    protected PlayerController pController;
    float endTime;
    float timer;

    public virtual void SetUp(PlayerController pcon, float effectiveTime) {
    pController = pcon;
    endTime = effectiveTime;
    isSetUp = true;
    ProcStartCondition();
    }

    private void Update{
    if(!isSetUp){
    return;
    }
    timer += Time.deltaTime;
    if(timer >= endTime){
    ProcAfterEndCondition();
    Destroy(this);
    }
    }

    /// <summary>
    /// 状態異常が開始する時に行う処理
    /// </summary>
    public virtual void ProcStartCondition() {
    }

    /// <summary>
    /// 状態異常が終わる時に行う処理
    /// </summary>
    public virtual void ProcAfterEndCondition() {
    }
    }



    とりあえずこのクラスの子供を対象オブジェクトにくっつけたとして、すぐに動作しないようにisSetUp変数を持たせています。

    あ、キャラにはPlayerControllerが付いているの前提の話なので、Playerだとか自分のクラスに置き換えてくださいね。

    SetUpをすることで、引数で指定したタイマーが動き、effectiveTimeを越すと消える仕組みです。


    上記クラスを踏まえて、一定時間足が遅くなるクラスを作ってみました。

    【PlayerConditionSlowMovement】

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PlayerConditionSpeedUp : PlayerConditionBase
    {
    [SerializeField, Header("移動速度 効果倍率")]
    float moveSpeedEffectRate;

    public override void SetUp(PlayerController pcon, float effectiveTime) {
    base.SetUp(pcon, effectiveTime);
    }

    public override void ProcStartCondition() {
    pController.speedRate = moveSpeedEffectRate;
    }

    public override void ProcAfterEndCondition(){
    player.speedRate = 1.0f;
    }
    }



    【PlayerController.cs】


    PlayerConditionSpeedUp conditionSpeedUp = AddComponent<PlayerConditionSpeedUp>();
    conditionSpeedUp.SetUp(this, 5f);




    こんな感じでAddComponentをしてあげれば、SetUpで指定した時間の間プレイヤーのspeedRateが変動できます。

    これを使えば、色々な状態異常ができそうですよね!

    色々素敵なやり方はあると思いますが、今日はキャラの状態異常にComponentを付けてあげる方法でした。
    これなら状態異常毎にクラスを作るから管理が簡単かも??

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/631-bcb8aeb0
    この記事にトラックバックする(FC2ブログユーザー)