0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダークダンジョン (Unity3D)

Posted at

はじめに

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

ゲーム概要

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

主な特徴:

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

使用技術

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

主要な実装ポイント

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

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システム

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. インベントリシステム

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バー実装の核となる部分のコード例です:

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バーは非表示にするなどの最適化も行いました。

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、ゲームシステムの設計など、ゲーム開発の核となる部分について深い理解を得ることができました。

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

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?