キャラクターのステータスを考えてみる(Unity6)

開発Tips

HPバーを作ったので、ちゃんと動くか確認したいと思いステータスを考えてみました。

体力ゲージを作る(Unity6)
次は、体力ゲージを作っていきます。Sliderの追加UIのスライダーを追加する。Canvasが作成されない場合は、先にCanvasを作成してください。canvasの名前をUIにします。Sliderの名前をHPBarにします。Handleの〇...

ステータス管理用のスクリプトの作成

StatusComponentという名前でスクリプトを作成しました。

using UnityEditor.Rendering;
using UnityEngine;
using UnityEngine.UI;

public class StatusComponent : MonoBehaviour {
    
    [SerializeField] private int Lv;        //Level
    [SerializeField] private int HP;        //Hit Point
    [SerializeField] private int MaxHP;     //Max Hit Point
    [SerializeField] private int MP;        //Magic Point
    [SerializeField] private int MaxMP;     //Max Hit Point
    [SerializeField] private int STR;       //Strength
    [SerializeField] private int VIT ;      //Vitality
    [SerializeField] private int DEX;       //Dexterity(器用さ)
    [SerializeField] private int AGI;       //Agility(素早さ)
    [SerializeField] private int INT;       //Intelligence
    [SerializeField] private int RES;       //Resist
    [SerializeField] private int EXP;       //Experience(経験値)

    [SerializeField] private Slider HP_Bar;       //HPバー

    private void Start() {
        //HPバーの表示を更新するために値をセットする。
        HpValue = HP;
    }


    public int HpValue{
        set
        {
            HP = value;

            //HPが0を下回ったら0にする。
            if (HP < 0) HP = 0;

            if (HP_Bar != null)
            {
                HP_Bar.value = HP * 100f / MaxHP;
            }
        }

        get 
        {
            return HP;
        }
    }

    public void TakeDamage(int damage)
    {
        HpValue = HP - damage;
    }

}

これはステータスの管理を行うComponentとして作成しました。

ちなみにC#の基礎の部分ですがHP * 100f / MaxHPの部分、なぜ先に100fをかけているのかというと

HP,MaxHPともにint型なので、intをintで割るとintにしかなりません。
intは小数点が入らないため(切り捨てられる)ため、0になってしまいます。

そのため、パーセントを出す際に100をかけるので、この100を整数ではなくて浮動小数にするためのfをつけて最初に掛けてあげることで、型を浮動小数(float)にしています。float÷int=floatになるので、小数点まででるようになるということです。でないとSliderのValueに0が渡され、体力が残っていてもゲージは空っぽになります。

新しくスクリプトを作成した理由は

  • ステータス管理の機能をほかのオブジェクト(敵でも、プレイヤーでも、NPCでも)と使いまわせること
  • ステータスに関する処理をここに書くことでソースが煩雑になるのを防ぐ
  • ステータスオブジェクト複数あっても一つの同じソースを見に来るので管理が楽になる。
    • 例えば毒などのステータス異常などの処理はここに書けば、このコンポーネントをもっているオブジェクトすべてが同じ機能を使うことができる

など、利点が多いと考えたためです。

そういえばまだUnityちゃんがダメージを受けることを考えていなかった・・・。よしカプセルとつなげよう。

OnTriggerEnterに以下の処理を加えました。

//ダメージ表示
int damage = UnityEngine.Random.Range(0, 1000);                 //ダメージ取得
DamagePopupGenerator.current.CreatePopup(other.transform.position, damage.ToString(), Color.white);

StatusComponent status = other.GetComponent<StatusComponent>();
status.TakeDamage(damage);

確認してみる

Hitするとダメージが出てゲージが減ります。

敵の頭上に体力ゲージをつける

EnemyというからオブジェクトをつけてCapsuleを入れます。Enemyオブジェクトのタグを忘れずにEnemyにします。ColliderもEnemyオブジェクトにしておくのがよいかと思います。

Enemyオブジェクトの子供にCanvasを作成し、Sliderをセットします。Handleは邪魔なので削除します。

※上記の画像赤枠にCapsuleが入っていませんが、Capsuleまでが子供です。

Fill AreaとFillを以下の画像のようにします。この設定をするとValueが0の時にバーが残りません。

ただ、どうやらValueの値を変えると拡縮を設定しているようなので、角丸な四角形はValueが下限値で変な動きになります。長方形の画像がよいかと思います。

HPバーは常にこちらを向いてほしいのBillboardingをセットします。

詳しくはこちらの記事に書きました。

ダメージの文字をだす。(Unity6)
敵を攻撃したときにダメージがでるようにしたいと思います。今回はダメージを出すのが目的でダメージ計算はしません。とりあえず、ランダム値で出していきます。Canvasを作成し、TextMeshProを置くHierarchyに右クリックを押し U...

新しいSliderをStatusにセットしなおして完了です。

コメント

タイトルとURLをコピーしました