ダークダンジョン (Unity3D) 

## はじめに

この記事では、Unity3Dを使用して開発したアクションRPGゲーム「ダークダンジョン」について、その概要や主要な実装ポイントを解説します。

## ゲーム概要

「ダークダンジョン」は、プレイヤーが勇者となり、複数のダンジョンを探索しながらモンスターと戦い、宝箱を探す3DアクションRPGです。

主な特徴：
- 3Dダンジョン探索
- アクション性の高い戦闘システム
- 複数のステージと敵キャラクター
- 成長要素とアイテム収集

## 使用技術

- 開発エンジン：Unity 2021.x.x
- 開発言語：C#
- 3Dモデリング：Blender
- テクスチャ作成：GIMP

## 主要な実装ポイント

### 1. プレイヤー制御システム

```csharp
public class PlayerController : MonoBehaviour
{
    // プレイヤーの移動速度
    public float moveSpeed = 5f;
    
    // キャラクターコントローラーコンポーネント
    private CharacterController controller;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // 入力に基づいて移動処理
        float horizontal = Input.GetAxisRaw("Horizontal");
        float vertical = Input.GetAxisRaw("Vertical");
        Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;

        if(direction.magnitude >= 0.1f)
        {
            controller.Move(direction * moveSpeed * Time.deltaTime);
        }
    }
}
```

プレイヤーの制御には`CharacterController`コンポーネントを使用し、滑らかな移動と衝突判定を実現しています。

### 2. 敵AIシステム

```csharp
public class EnemyAI : MonoBehaviour
{
    public float detectionRange = 10f;
    public float attackRange = 2f;
    
    private Transform player;
    private NavMeshAgent agent;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        float distanceToPlayer = Vector3.Distance(transform.position, player.position);

        if(distanceToPlayer <= detectionRange)
        {
            if(distanceToPlayer > attackRange)
            {
                // プレイヤーを追跡
                agent.SetDestination(player.position);
            }
            else
            {
                // 攻撃範囲内なら攻撃
                Attack();
            }
        }
    }

    void Attack()
    {
        // 攻撃処理
    }
}
```

敵AIには`NavMeshAgent`を使用し、ダンジョン内での自然な経路探索を実現しています。

### 3. インベントリシステム

```csharp
public class Inventory : MonoBehaviour
{
    public List<Item> items = new List<Item>();
    public int maxItems = 20;

    public bool AddItem(Item item)
    {
        if(items.Count >= maxItems)
        {
            Debug.Log("インベントリがいっぱいです");
            return false;
        }

        items.Add(item);
        return true;
    }

    public void RemoveItem(Item item)
    {
        items.Remove(item);
    }
}
```

シンプルなリストベースのインベントリシステムを実装し、アイテムの管理を行っています。

## 開発で苦労した点
1. **HPバーの実装**: プレイヤーと敵キャラクターのHPを視覚的に表示するHPバーの実装に苦労しました。特に以下の点で工夫が必要でした：

   a. **UIとゲームワールドの連携**: 3D空間内のキャラクターの頭上にHPバーを表示する際、UIキャンバスとゲームワールドの座標系の違いに対処する必要がありました。

   b. **動的なHP更新**: ダメージを受けた際にHPバーをスムーズに更新する処理の実装に時間がかかりました。

   c. **最適化**: 多数の敵キャラクターが画面に表示される場合でも、パフォーマンスに影響を与えないようにする必要がありました。

以下は、HPバー実装の核となる部分のコード例です：

```csharp
public class HPBar : MonoBehaviour
{
    public Transform target; // HPバーを表示するターゲット
    public Vector3 offset; // ターゲットからのオフセット
    public Image fillImage; // HP量を表示するImage

    private Camera mainCamera;

    void Start()
    {
        mainCamera = Camera.main;
    }

    void Update()
    {
        if (target == null) return;

        // ワールド座標をスクリーン座標に変換
        Vector3 screenPos = mainCamera.WorldToScreenPoint(target.position + offset);

        // UIの位置を更新
        transform.position = screenPos;
    }

    // HP更新メソッド
    public void UpdateHP(float currentHP, float maxHP)
    {
        fillImage.fillAmount = currentHP / maxHP;
    }
}
```

このスクリプトを使用することで、キャラクターの頭上に常に表示されるHPバーを実装できます。`UpdateHP`メソッドを呼び出すことで、HPの変化をリアルタイムに反映させることができます。

また、パフォーマンスを考慮して、画面外のHPバーは非表示にするなどの最適化も行いました。

```csharp
void Update()
{
    // ... 前述のコード ...

    // 画面外の場合は非表示にする
    if (screenPos.z < 0 || screenPos.x < 0 || screenPos.x > Screen.width || screenPos.y < 0 || screenPos.y > Screen.height)
    {
        gameObject.SetActive(false);
    }
    else
    {
        gameObject.SetActive(true);
    }
}
```
この実装により、ゲームのビジュアル面が向上し、プレイヤーにキャラクターの状態をより直感的に伝えることができるようになりました。

## まとめ

Unity3Dを使用してアクションRPG「ダークダンジョン」を開発することで、3Dゲーム開発の基礎から応用まで幅広く学ぶことができました。特に、キャラクター制御、AI、ゲームシステムの設計など、ゲーム開発の核となる部分について深い理解を得ることができました。

今後は、オンライン機能の追加やグラフィックスの向上など、さらなる拡張を計画しています。

## 参考資料

- [Unity公式ドキュメント](https://docs.unity3d.com/)
- [ゲームAI技法](https://www.amazon.co.jp/dp/4774180076)
- [Clean Code](https://www.amazon.co.jp/dp/4048930591)