はじめに
Extenject,Zenjectの更新が2020年から止まっているようですので、代替候補のDIパッケージ「VContainer」を試してみました。
毎回公式から手順を探すのは辛いので最短で実現できる手順のメモを残します。
VContainerとは
以下公式サイトです。
試したこと
使用例としてButtonゲームオブジェクトに依存しないようにGameMangerコンポーネント内でButtonイベントを登録してみました。
利用手順
- "root/Packages/manifest.json"ファイルの"dependencies"に以下を追記する。
root/Packages/manifest.json
"jp.hadashikick.vcontainer": "https://github.com/hadashiA/VContainer.git?path=VContainer/Assets/VContainer#1.10.0",
※バージョン部分はその時の最新versionに書き換えること。
GameManager.cs
using UnityEngine;
public class MainButton : MonoBehaviour
{
}
- GameManagerオブジェクトを作成し、GameManagerスクリプトをアタッチする。
GameManager.cs
using UnityEngine;
using UnityEngine.UI;
using VContainer;
public class GameManager : MonoBehaviour
{
Button _mainButton;
private void Awake()
{
_mainButton.onClick.AddListener(OnButtonClicked);
}
private void OnButtonClicked()
{
Debug.Log("ボタンが押されました");
}
[Inject]
public void Constructor(MainButton injectMainButton)
{
// Awakeより先に呼ばれてコンポーネントを注入する
_mainButton = injectMainButton.GetComponent<Button>();
}
}
ちなみにこの状態でゲームを起動してもConstructorは動作しない。
- GameLifetimeScopeスクリプトをGameManagerにアタッチする。
このスクリプトに注入させたいコンポーネントを記述する。
注入するコンポーネントのインスタンスはゲーム開始時に自動で検索するので明示は不要である。
GameLifetimeScope.cs
using VContainer;
using VContainer.Unity;
public class GameLifetimeScope : LifetimeScope // LifetimeScopeを継承
{
protected override void Configure(IContainerBuilder builder)
{
builder.RegisterComponentInHierarchy<MainButton>();
}
}