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?

【Unity】VContainer を触ってみた

Last updated at Posted at 2025-09-09

触ってみた

GitHub
めっちゃ簡単なゲーム(?)を作ってみました。
赤いのが青い子を追いかけるだけ。

game_image

どこが違うか

参照を保持するコンポーネントは、これまでと一緒。

using UnityEngine;

internal sealed class CharacterTransforms : MonoBehaviour
{
    [SerializeField] internal Transform playerTransform;
    [SerializeField] internal Transform enemyTransform;
}

ロジック部
書き方とか考え方とかは、変わらない。とっつきやすい。

using System;
using UnityEngine;
using VContainer;
using VContainer.Unity;

internal sealed class Controller : ITickable, IDisposable
{
    private CharacterTransforms characterTransforms;
    private CharacterStatuses characterStatuses;

    [Inject]
    internal void Construct(CharacterTransforms transforms, CharacterStatuses statuses)
    {
        characterTransforms = transforms;
        characterStatuses = statuses;
    }

    public void Tick()
    {
        if (characterTransforms.playerTransform == null) return;
        if (characterTransforms.enemyTransform == null) return;

        Vector3 p = characterTransforms.playerTransform.position;
        Vector3 e = characterTransforms.enemyTransform.position;
        p.y = 0;
        e.y = 0;

        Vector3 e2p = (p - e).normalized;
        Vector3 eMove = e2p * (characterStatuses.enemySpeed * Time.deltaTime);
        Vector3 pMove = (Quaternion.AngleAxis(90, Vector3.up) * e2p) * (characterStatuses.playerSpeed * Time.deltaTime);

        characterTransforms.enemyTransform.position += eMove;
        characterTransforms.playerTransform.position += pMove;
    }

    public void Dispose()
    {
        characterTransforms = null;
        characterStatuses = null;

        Debug.Log("Controller.Dispose()");
    }
}

DI・フロー制御部
かなり簡潔に書ける。Dispose()も自動的に読んでくれるのが好感触。

using System;
using UnityEngine;
using VContainer;
using VContainer.Unity;

internal sealed class GameLifeTimeScope : LifetimeScope
{
    [SerializeField] private CharacterTransforms characterTransforms;
    [SerializeField] private CharacterStatuses characterStatuses;

    protected sealed override void Configure(IContainerBuilder builder)
    {
        builder.RegisterComponent(characterTransforms);
        builder.RegisterComponent(characterStatuses);

        builder.RegisterEntryPoint<Controller>(Lifetime.Singleton);
    }
}

総評

概ね好感触。簡潔に書けて、パフォーマンスも良い。
ただ、以下のような懸念点を感じた。今の所、個人開発で手を出すべきではないと思う。

懸念点

  • クラスやコンポーネントが増え、簡単な機能すら実装が手間。
  • イベント関数の実行順序が見えないので、この点は MonoBehaviour の問題点を解決できてはいない。

他諸々の面で、正しい理解のもと MonoBehaviour を使っていれば、わざわざ VContainer に置き換える意義は薄い、という感触でした。

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?