ライフゲージの管理コード

2023年4月12日

サンプルのスクリプトについて、説明します

LifeGaugeContainerスクリプト

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

[RequireComponent(typeof(RectTransform))]
public class LifeGaugeContainer : MonoBehaviour
{
    static LifeGaugeContainer _instance;

    public static LifeGaugeContainer Instance
    {
        get
        {
            return _instance;
        }
    }

    [SerializeField]
    Camera mainCamera;

    [SerializeField]
    LifeGauge lifeGaugePrefab;

    RectTransform rectTransform;

    readonly Dictionary<MobStatus, LifeGauge> _statusLifeBarMap = new Dictionary<MobStatus, LifeGauge>();

    void Awake()
    {
        if (_instance != null)
        {
            throw new Exception("LifeBarContainerのインスタンスはすでに存在しています");
        }

        _instance = this;

        rectTransform = GetComponent<RectTransform>();
    }

    public void Add(MobStatus status)
    {
        var lifeGauge = Instantiate(lifeGaugePrefab, transform);
        lifeGauge.Initialize(rectTransform, mainCamera, status);
        _statusLifeBarMap.Add(status, lifeGauge);
    }

    public void Remove(MobStatus status)
    {
        Destroy(_statusLifeBarMap[status].gameObject);
        _statusLifeBarMap.Remove(status);
    }

}

このコードは、Unityゲームエンジンのコンポーネントである LifeGaugeContainer クラスを定義しています。

LifeGaugeContainer クラスは、Mobのステータスに基づいてライフゲージを追加および削除する機能を提供します。このクラスは、 RequireComponent 属性を使用して RectTransform コンポーネントが必要であることを宣言しています。

また、LifeGaugeContainer クラスは、単一のインスタンスを保持するための _instance 変数を持ち、 Instance プロパティを介してアクセスできます。これにより、別の場所で LifeGaugeContainer のインスタンスを作成することを防ぎ、すべてのオブジェクトが同じインスタンスを参照できるようになります。

LifeGaugeContainer クラスは、以下の機能を提供します。

  • Add(MobStatus status) メソッド:与えられた MobStatus オブジェクトに対応するライフゲージを作成して、ステータスとライフゲージの対応を _statusLifeBarMap ディクショナリに追加します。
  • Remove(MobStatus status) メソッド:指定された MobStatus オブジェクトに対応するライフゲージを _statusLifeBarMap から削除し、ゲームオブジェクトを破棄します。

さらに、 LifeGaugeContainer クラスは、以下の変数を宣言しています。

  • mainCamera:ライフゲージの位置を決定するために使用するカメラを参照するための変数。
  • lifeGaugePrefab:ライフゲージのプレハブを参照するための変数。
  • rectTransformRectTransform コンポーネントへの参照を格納するための変数。
  • _statusLifeBarMapMobStatus オブジェクトとライフゲージの対応を格納するためのディクショナリ。

LifeGaugeスクリプト

using UnityEngine;
using UnityEngine.UI;

public class LifeGauge : MonoBehaviour
{
    [SerializeField]
    Image fillImage;

    RectTransform _parentRectTransform;
    Camera _camera;
    MobStatus _status;

    void Update()
    {
        Refresh();
    }

    public void Initialize(RectTransform parentRectTransform, Camera camera, MobStatus status)
    {
        _parentRectTransform = parentRectTransform;
        _camera = camera;
        _status = status;
        Refresh();
    }

    void Refresh()
    {
        fillImage.fillAmount = _status.Life / _status.LifeMax;

        var screenPoint = _camera.WorldToScreenPoint(_status.transform.position);

        RectTransformUtility.ScreenPointToLocalPointInRectangle(_parentRectTransform, screenPoint, null, out Vector2 localPoint);

        transform.localPosition = localPoint + new Vector2(0, 80);
    }
}

このスクリプトは、Unityのゲームオブジェクト上に表示されるライフゲージを制御するためのスクリプトです。

スクリプトは、Unityの Image コンポーネントを持つ fillImage 変数、ゲームオブジェクトの位置をカメラのスクリーン座標に変換するための _camera 変数、MobStatus スクリプトの _status 変数、そしてゲームオブジェクトの RectTransform コンポーネントを持つ _parentRectTransform 変数を定義しています。

Update() メソッドは、毎フレーム Refresh() メソッドを呼び出しています。

Initialize() メソッドは、ゲームオブジェクトを初期化するために呼び出され、_parentRectTransform、_camera、_status 変数を設定し、Refresh() メソッドを呼び出します。

Refresh() メソッドは、ライフゲージの fillAmount を更新し、カメラのスクリーン座標に基づいてゲームオブジェクトの位置を変更します。具体的には、_status.transform.position をカメラのスクリーン座標に変換し、RectTransformUtility.ScreenPointToLocalPointInRectangle() を使用して、スクリーン座標を _parentRectTransform 内のローカル座標に変換します。そして、transform.localPosition を設定して、ゲームオブジェクトの位置を更新します。ここでは、80 ピクセルだけ上に移動するようにしています。

MobStatus スクリプトは、Mob(動くオブジェクト)のステータス情報を管理するために使用され、LifeGauge スクリプトは、Mobのライフゲージを更新するために使用されます。

Refreshメソッド

void Refresh()
{
    // ライフゲージの fillAmount を更新する
    fillImage.fillAmount = _status.Life / _status.LifeMax;

    // モブの位置をカメラのスクリーン座標に変換する
    var screenPoint = _camera.WorldToScreenPoint(_status.transform.position);

    // スクリーン座標を _parentRectTransform 内のローカル座標に変換する
    RectTransformUtility.ScreenPointToLocalPointInRectangle(_parentRectTransform, screenPoint, null, out Vector2 localPoint);

    // ライフゲージの位置を更新する(ローカル座標を使用し、80 ピクセルだけ上に移動する)
    transform.localPosition = localPoint + new Vector2(0, 80);
}

このメソッドは、現在のMobのライフの割合に基づいて、fillImage の fillAmount を設定します。具体的には、_status.Life を _status.LifeMax で割った値を fillAmount に設定しています。これにより、モブのライフが変更されるたびに、ライフゲージが更新されます。

次に、_status.transform.position をカメラのスクリーン座標に変換します。_camera.WorldToScreenPoint() メソッドを使用して、モブの位置をスクリーン座標に変換します。これにより、ライフゲージが常にモブに対して正しい位置に表示されます。

次に、RectTransformUtility.ScreenPointToLocalPointInRectangle() メソッドを使用して、スクリーン座標を _parentRectTransform 内のローカル座標に変換します。これにより、ライフゲージを _parentRectTransform 内に正しく配置することができます。

最後に、transform.localPosition を設定して、ライフゲージの位置を更新します。ここでは、localPoint に新しい Vector2(0, 80) を追加することで、ライフゲージがモブの上部に表示されるようにしています。

まとめると

このコードは、Unityで作成されたゲームでモブのライフゲージを管理するためのスクリプトです。このスクリプトは、LifeGaugeContainerLifeGauge、そしてMobStatusの3つのクラスで構成されています。

MobStatusは、モブの状態を管理するための抽象クラスで、移動、攻撃可能かどうか、現在のライフなどを管理します。また、LifeGaugeContainerと連携し、自身の状態をLifeGaugeContainerに通知するためのLifeGaugeContainer.Instance.Add(this)を呼び出しています。

LifeGaugeContainerは、ライフゲージのコンテナを管理するクラスで、Addメソッドでモブのステータスを受け取り、ライフゲージを生成します。また、Removeメソッドでは、指定されたステータスのライフゲージを破棄します。

LifeGaugeは、各モブのライフゲージを管理するクラスで、Initializeメソッドで親のRectTransform、カメラ、モブのステータスを受け取り、Refreshメソッドで、ライフゲージの表示を更新します。具体的には、現在のライフの割合に応じて、ライフゲージの長さを調整し、モブの位置に合わせてライフゲージを表示します。

Unity

Posted by hidepon