Unityエディタでのオブジェクトライフ表示システム資料

2025年4月12日

1. はじめに

本資料では、Unityエディタ上でオブジェクトの位置にオブジェクト名とライフ値を表示するための仕組みについて説明します。
主な対象は以下の2つのスクリプトです。

  • DebugMobStatus
    UnityエディタでGizmosを用いて、オブジェクト名とライフ値をシーン上に表示します。
  • MobStatus
    Mob(動くオブジェクト)の状態およびライフ管理を行う抽象クラスで、今回の用途においてはライフ値の管理部分が関連します。

Sceneビューの様子


2. DebugMobStatusクラスの概要

2.1 目的と概要

DebugMobStatusクラスは、Unityエディタ上でシーンに配置されたオブジェクトの位置に情報(オブジェクト名とライフ値)を表示するために作成されています。
この表示は、UnityEditorのGizmos機能を利用しており、エディタ実行時のみ有効となります。

2.2 主なポイント

  • 条件付きコンパイル
    #if UNITY_EDITORディレクティブを用いることで、Unityエディタでのみコードがコンパイル・実行されるようにしています。
    これにより、ビルド後の実行ファイルにエディタ用コードが含まれないように配慮しています。
  • インスペクターで指定可能なラベルカラー
    公開フィールド labelColor を追加し、ラベルの色をインスペクターから設定可能にしています。
    これにより、表示のカスタマイズが容易になります。
  • OnDrawGizmosメソッド
    Unityエディタでシーンビューが更新されるたびに呼ばれるメソッドであり、Gizmosの描画処理を担当します。
  • Handles.Labelを使用したラベル表示
    UnityEditorのHandlesクラスのLabelメソッドを利用して、指定位置にテキストラベルを描画しています。
    テキストには改行文字(\n)を挿入することで、2行に分けた表示を実現しています。
    例:
    • 1行目:オブジェクト名
    • 2行目:ライフ値(例:"ライフ: 10″)
  • MobStatusコンポーネントの取得
    同一GameObjectにアタッチされているMobStatusコンポーネントを取得することで、ライフ値などのデータを参照しています。

2.3 サンプルコード

次のコードを表示させたいゲームオブジェクトにアタッチしましょう
ただし、MobStatusまたは、その派生クラスがアタッチされている必要があります

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class DebugMobStatus : MonoBehaviour
{
    // インスペクターで指定可能なラベルの色(デフォルトは白)
    public Color labelColor = Color.white;

#if UNITY_EDITOR
    void OnDrawGizmos()
    {
        // ラベルの表示色をインスペクターで指定された色に設定
        GUI.color = labelColor;

        // 同一オブジェクトにアタッチされたMobStatusコンポーネントを取得
        MobStatus mobStatus = GetComponent<MobStatus>();

        // ラベルテキストを生成(1行目:オブジェクト名、2行目:ライフ値)
        string labelText = mobStatus != null
            ? $"{name}\nライフ: {mobStatus.Life}"
            : name;

        // オブジェクトの位置にラベルを描画
        Handles.Label(transform.position, labelText);
    }
#endif
}

3. MobStatusクラスの関連部分説明

MobStatusはMob(動くオブジェクト)の状態管理を行うための基底クラスです。
DebugMobStatusでは、以下のライフ管理の部分が主に利用されています。

3.1 ライフ値の管理

ライフ最大値と現在のライフ値

[SerializeField] private float lifeMax = 10; // ライフ最大値
private float _life; // 現在のライフ値
  • lifeMaxは、オブジェクトが持つ最大のライフ値です。
  • _lifeは、実際に現在保持しているライフ値となり、初期状態ではlifeMaxの値が代入されます。

ライフプロパティ

public float Life => _life;
  • このプロパティにより、外部から現在のライフ値を読み取ることができ、DebugMobStatusでラベル表示に利用されています。

3.2 その他の関連メンバ

  • 状態管理
    MobStatusは、オブジェクトの状態(通常、攻撃中、死亡)を内部的に管理しています。
    DebugMobStatusでは、この状態管理自体は使用せず、ライフ値のみが表示対象となっています。
  • ライフゲージ管理への連携
    Startメソッド内で、ライフゲージの管理クラス(LifeGaugeContainer)との連携が行われていますが、こちらも本資料の対象部分(ライフ値の表示)に直接関係する部分のみとして触れています。

4. 補足事項

  • 条件付きコンパイルの利点
    Unityエディタ用コード(UnityEditor名前空間、Handlesクラスの利用など)は、実行ファイルに含まれず、エディタでのみ動作するため、パフォーマンスやビルドサイズの面で有利です。
  • 拡張性
    DebugMobStatusの仕組みは、他のデバッグ情報の表示(例:状態やスコアなど)にも応用可能です。必要に応じて、表示内容やプロパティを拡張してください。

5. まとめ

本資料では、DebugMobStatusクラスがUnityエディタ上でオブジェクト名とライフ値を表示する仕組みについて解説しました。
また、MobStatusクラスのライフ管理部分に関して、DebugMobStatusから利用されている内容に焦点を当てて説明しました。

C#,Unity,デバッグ

Posted by hidepon