Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ レイジステート | 敵の行動
Unityでの格闘ゲーム

bookレイジステート

メニューを表示するにはスワイプしてください

public class RageState : State
{
    Animator animator;
    System.Action addHealth;
    System.Action changingAttackDmg;

    public RageState(Animator animator, System.Action addHealth, System.Action changeAttack)
    {
        this.animator = animator;
        this.addHealth = addHealth;
        changingAttackDmg = changeAttack;
    }

    public override void StartState()
    {
        animator.SetBool("rage", true);
        isStateFinished = false;
        changingAttackDmg(); // add the enemy dmg after raging
    }

    public override void UpdateState(float deltaTime)
    {
        addHealth();
    }

    public override void EndState()
    {
        animator.SetBool("rage", false);
    }
}

RageStateクラスの解説

RageState クラスは、敵がレイジモードに入った際の挙動を管理する特定のステートです。このクラスは State クラスを継承しており、レイジ状態の開始、更新、終了を行うメソッドを含みます。また、レイジモード中に体力を追加したり攻撃力を変更したりするアクションも含まれています。

クラス定義とメンバ変数

クラス定義

public class RageState : State このクラスは State クラスを継承しており、State で定義された抽象メソッドを実装する必要があります。

メンバ変数

Animator animator; アニメーション制御用。
System.Action addHealth; 敵の体力を追加するアクション。
System.Action changingAttackDmg; 敵の攻撃力を変更するアクション。

コンストラクタ

コンストラクタは、RageState を初期化し、必要なコンポーネントであるアニメーション用の Animator、体力追加用のアクション、攻撃ダメージ変更用のアクションを受け取ります。これらの値を対応するメンバ変数に設定します。

StartState メソッド

このメソッドは isStateFinishedfalse に設定し、アニメーターの "rage" ブールパラメータを true に設定してレイジアニメーションを開始し、changingAttackDmg を呼び出して敵のダメージを増加させます。

UpdateState メソッド

このメソッドは毎フレーム呼び出され、レイジ状態中に敵の体力を継続的に追加するために addHealth を呼び出します。

EndState メソッド

このメソッドは、アニメーター内の「rage」ブールパラメータを false に設定することで、レイジアニメーションを停止。

このように実装した理由

強化された敵の挙動

RageState は敵の攻撃力を増加させ、継続的に体力を回復させることで、プレイヤーにとってより手強い存在となる。 アクション(System.Action)を使用することで、敵の属性を柔軟かつモジュール式に変更可能。

ダイナミックで魅力的なゲームプレイ

敵がレイジ状態に入ることで、プレイヤーはより強力で耐久力のある敵に対応する必要があり、ゲームプレイがよりダイナミックで魅力的になる。

コンテキスト内での動作

レイジ状態への突入: 敵が RageState に入ると、StartState メソッドが呼び出され、レイジアニメーションが開始され、攻撃力が増加。

レイジ中: UpdateState メソッドが毎フレーム呼び出され、敵の体力が継続的に回復し、プレイヤーが敵を倒すのがより困難になる。

レイジ状態からの離脱: 敵が RageState を離れると、EndState メソッドが呼び出され、レイジアニメーションが停止。

このように RageState を構成することで、敵が大幅に強力かつ耐久力のある存在となり、プレイヤーにとってより大きな挑戦となり、全体的なゲーム体験が向上。

レイジ状態の初期化

rage = new RageState(animator, () => { health += 10f * Time.deltaTime; }, () => { attack1.ChangeAttackDmg(15); attack2.ChangeAttackDmg(25); });

解説

RageStateの初期化:

rage = new RageState(animator, (...) => {...}, (...) => {...}); RageStateという新しいrageインスタンスの作成;

Animator:

animator: アニメーション制御用のアニメーターを渡す;

体力増加:

() => { health += 10f * Time.deltaTime; } 1秒あたり10ずつ体力を増加させるラムダ関数;

攻撃ダメージの変更:

() => { attack1.ChangeAttackDmg(15); attack2.ChangeAttackDmg(25); } attack1の攻撃ダメージを15attack2の攻撃ダメージを25に変更するラムダ関数。

レイジ遷移

rageTransition = new Transition(() =>
{
    if (health <= 40f && haveRaged == false)
    {
        haveRaged = true;
        return true;
    }
    return false;
}, new StatePourcentage(rage, 100f));

rageTransition は、特定の条件が満たされたときに敵を RageState に移行させるトランジション。敵の体力が一定の閾値を下回り、まだレイジ状態に入っていない場合に、敵をより手強くするために設計されたトランジション。

トランジションの定義

条件:

トランジションは、敵の体力が40以下であり、かつ敵がまだレイジ状態に入っていない(haveRagedfalse)場合を判定。両方の条件が満たされると、haveRagedtrue に設定し、敵が一度だけレイジ状態に入るようにし、トランジションを発動するために true を返す。

State Pourcentage:

このトランジションは new StatePourcentage(rage, 100f) を使用し、条件が満たされたときに敵が100%の確率で RageState に移行することを示す。

このように実装した理由

強力な行動の発動: rageTransition により、敵の体力が危機的な状況になるとより強力な存在となり、プレイヤーへの挑戦性が増す。このトランジションは敵が一度だけレイジ状態に入ることを保証し、繰り返しレイジ状態に移行するのを防ぐ。

ダイナミックで挑戦的なゲームプレイ: 致命的な体力条件下でレイジ状態を導入することで、ゲームプレイがよりダイナミックかつ挑戦的になり、プレイヤーに戦略の適応を求める。

コンテキスト内での動作

ヘルスチェック:ゲーム中、敵がダメージを受けるたびにヘルスが監視されます。敵のヘルスが40以下になり、まだレイジ状態になっていない場合、rageTransition 条件が満たされます。

レイジ状態の発動:条件が満たされると、haveRagedtrue に設定され、100% の確率で RageState への遷移がトリガーされます。

レイジ状態への突入RageState が開始され、敵の攻撃ダメージが増加し、ヘルスが継続的に追加されることで、敵を倒すのが著しく難しくなります。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  8

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  8
some-alt