はじめに
この記事では、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);
}
}
シンプルなリストベースのインベントリシステムを実装し、アイテムの管理を行っています。
開発で苦労した点
-
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、ゲームシステムの設計など、ゲーム開発の核となる部分について深い理解を得ることができました。
今後は、オンライン機能の追加やグラフィックスの向上など、さらなる拡張を計画しています。