Unityで依存性注入を使ったプレイヤーと敵の連携システム
この資料では、Unityと「VContainer」という依存性注入フレームワークを使って、プレイヤー(Player
)を追尾する敵(Enemy
)のシステムを作成する方法を解説します。
目次
依存性注入とは?
依存性注入(Dependency Injection)とは、必要なデータや機能(依存関係)を直接クラス内で作成するのではなく、外部から渡して利用する設計手法です。
メリット
- 疎結合な設計:クラス同士の結合が弱くなるので、他のクラスに影響を与えずに変更や拡張が可能。
- テストが簡単:モック(テスト用の仮オブジェクト)を注入することで、個々のクラスを独立してテストできる。
今回作成するシステム
- プレイヤー:自分の位置情報を他のオブジェクトに提供するクラス。
- 敵:プレイヤーの位置を追尾するクラス。
VContainerを使用して、敵にプレイヤーの位置情報を注入する仕組みを作ります。
準備
- Unityプロジェクトを作成する。
- Unity Package Managerから VContainer をインストールする。
コード解説
1. GameInstaller
依存関係を登録するセットアップクラス
using VContainer;
using VContainer.Unity;
public class GameInstaller : LifetimeScope
{
protected override void Configure(IContainerBuilder builder)
{
// シーン内のPlayerとEnemyを登録
builder.RegisterComponentInHierarchy<Player>();
builder.RegisterComponentInHierarchy<Enemy>();
}
}
ポイント
LifetimeScope
クラス
VContainerの依存関係を管理する基本クラスです。RegisterComponentInHierarchy<T>()
シーンに配置された MonoBehaviour を継承したスクリプトを登録します。
2. Playerクラス
プレイヤーキャラクターの情報を管理するクラス
using UnityEngine;
public class Player : MonoBehaviour
{
public Transform PlayerTransform => transform;
}
ポイント
PlayerTransform
プロパティ
プレイヤーの位置や回転情報を外部に提供します。
3. Enemyクラス
プレイヤーを追尾する敵のクラス
using UnityEngine;
using VContainer;
public class Enemy : MonoBehaviour
{
private Transform playerTransform;
// 依存性注入でPlayerの情報を受け取る
[Inject]
public void Construct(Player player)
{
playerTransform = player.PlayerTransform;
}
void Update()
{
if (playerTransform != null)
{
// プレイヤーの位置に向かって移動
transform.position = Vector3.MoveTowards(transform.position, playerTransform.position, 2f * Time.deltaTime);
}
}
}
ポイント
[Inject]
属性
- VContainerがこのメソッドを呼び出して依存関係を注入します。
Player
クラスのインスタンスを受け取り、playerTransform
に格納します。
追尾ロジック
Vector3.MoveTowards
を使用して、一定速度でプレイヤーに近づく動きを実現します。
Unityでの設定
シーンにオブジェクトを配置
Player
とEnemy
のオブジェクトを作成し、それぞれに対応するスクリプトをアタッチします。GameInstaller
をアタッチした空のオブジェクトを作成します(名前はGameInstaller
などわかりやすいものに)。
動作確認
- プレイモードで、敵がプレイヤーを追尾する動作を確認します。
仕組みの全体図
以下は、クラス間の関係を示した図です。
GameInstaller
がPlayer
とEnemy
を登録。Enemy
にPlayer
の情報を注入。
重要な注意点
- RegisterComponentInHierarchy<T>() の動作
- 対象は、
MonoBehaviour
を継承したスクリプト。 - シーン内に配置されているオブジェクトにアタッチされたコンポーネントのみ登録されます。
new
で生成するオブジェクトやスクリプトは対象外。
- 対象は、
- シーンに配置していない場合のエラー
- コンテナに依存関係を登録できず、実行時にエラーが発生する可能性があります。
まとめ
- VContainerを使用すると、Unityのコードを疎結合に設計できます。
- この例では、敵がプレイヤーの位置を追尾する動きを簡単に実現しました。
- 依存性注入を学ぶことで、ゲームの機能を柔軟に構築できるようになります。
応用例
- 他のキャラクター(味方やボスキャラ)にも依存性注入を適用。
- プレイヤーや敵の動作を差し替えて、新しいゲーム要素を追加。
ディスカッション
コメント一覧
まだ、コメントがありません