ライフゲージの管理コード
サンプルのスクリプトについて、説明します
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
:ライフゲージのプレハブを参照するための変数。rectTransform
:RectTransform
コンポーネントへの参照を格納するための変数。_statusLifeBarMap
:MobStatus
オブジェクトとライフゲージの対応を格納するためのディクショナリ。
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で作成されたゲームでモブのライフゲージを管理するためのスクリプトです。このスクリプトは、LifeGaugeContainer
、LifeGauge
、そしてMobStatus
の3つのクラスで構成されています。
MobStatus
は、モブの状態を管理するための抽象クラスで、移動、攻撃可能かどうか、現在のライフなどを管理します。また、LifeGaugeContainer
と連携し、自身の状態をLifeGaugeContainer
に通知するためのLifeGaugeContainer.Instance.Add(this)
を呼び出しています。
LifeGaugeContainer
は、ライフゲージのコンテナを管理するクラスで、Add
メソッドでモブのステータスを受け取り、ライフゲージを生成します。また、Remove
メソッドでは、指定されたステータスのライフゲージを破棄します。
LifeGauge
は、各モブのライフゲージを管理するクラスで、Initialize
メソッドで親のRectTransform、カメラ、モブのステータスを受け取り、Refresh
メソッドで、ライフゲージの表示を更新します。具体的には、現在のライフの割合に応じて、ライフゲージの長さを調整し、モブの位置に合わせてライフゲージを表示します。
ディスカッション
コメント一覧
まだ、コメントがありません