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

どこが違うか
参照を保持するコンポーネントは、これまでと一緒。
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
に置き換える意義は薄い、という感触でした。