Sardinject is a simple DI (Dependency Injection) library for Unity C#, VRChat Udon(U#).
Sardinject は Unity C#、VRChat Udon(U#) 用のシンプルなDI(依存性注入)ライブラリです。
View on GitHub Pages
Unity 2022.3+ が必要です
Sardinject
の横の「+」ボタンを押す。vpm add repo https://vpm.hoshinolabs.com/vpm.json
cd /your-unity-project
vpm add com.hoshinolabs.vrchat.sardinject
以下を UPM でインストールします。
https://github.com/ikuko/Sardinject.git?path=Packages/com.hoshinolabs.sardinject
Sardinject はリリースタグを使用するので以下のようにバージョンを指定できます。
https://github.com/ikuko/Sardinject.git?path=Packages/com.hoshinolabs.sardinject#1.0.0
次のような Udon があるとする。
public class Sardine : UdonSharpBehaviour {
public void Hello() {
Debug.Log($"Hello. Do you like sardines?");
}
}
public class StartupGreeting : UdonSharpBehaviour {
[Inject, SerializeField, HideInInspector]
Sardine sardine;
private void Start() {
sardine.Hello();
}
}
依存関係を記述したスクリプトを作成します。
シーン上にオブジェクトを作成し SceneScope
コンポーネントと CustomInstaller
を追加します。
public class CustomInstaller : MonoBehaviour, IInstaller {
public void Install(ContainerBuilder builder) {
builder.RegisterComponentOnNewGameObject<Sardine>(Lifetime.Cached);
builder.RegisterEntryPoint<StartupGreeting>(Lifetime.Cached);
}
}
この例では、StartupGreeting
コンポーネントの sardine フィールドに Sardine
コンポーネントが自動的に設定されます。
StartupGreeting
コンポーネントと Sardine
コンポーネントは自動的にシーン上に追加されます。
以下のようにして、型からインスタンスを動的に解決することができます。
public class Sardine : UdonSharpBehaviour {
public void Hello() {
Debug.Log($"Hello. Do you like sardines?");
}
}
public class StartupGreeting : UdonSharpBehaviour {
[Inject, SerializeField, HideInInspector]
Container container;
private void Start() {
var sardine = container.Resolve<Sardine>();
sardine.Hello();
}
}
依存関係を記述したスクリプトを作成します。
シーン上にオブジェクトを作成し SceneScope
コンポーネントと CustomInstaller
を追加します。
public class CustomInstaller : MonoBehaviour, IInstaller {
public void Install(ContainerBuilder builder) {
builder.RegisterComponentOnNewGameObject<Sardine>(Lifetime.Cached);
builder.RegisterEntryPoint<StartupGreeting>(Lifetime.Cached);
}
}
実行が開始されると StartupGreeting
コンポーネントは動的に Sardine
コンポーネントを取得します。
この際、 Sardine
コンポーネントが自動的に生成され返却されます。
必要になるまで対象のオブジェクトを生成したくない場合に便利です。
以下のコンポーネントを提供する SomeonePackage
が存在するとします。
namespace SomeonePackage {
public class SomeoneSardine : UdonSharpBehaviour {
public Hello() {
Debug.Log($"Hello. What sardines are you?");
}
}
}
合わせて以下のスクリプトを作成します。
オブジェクトを作成し ProjectScope
コンポーネントと作成したスクリプトを追加し、プレハブとして保存します。
namespace SomeonePackage {
public class CustomInstaller : MonoBehaviour, IInstaller {
public void Install(ContainerBuilder builder) {
builder.RegisterComponentOnNewGameObject<SomeoneSardine>(Lifetime.Transient);
}
}
}
あなたのパッケージから SomeonePackage
の SomeoneSardine
コンポーネントを使いたいとします。
namespace MyPackage {
public class MySardine : UdonSharpBehaviour {
[Inject, SerializeField, HideInInspector]
SomeoneSardine sardine;
private void Start() {
sardine.Hello();
}
}
}
依存関係を記述したスクリプトを作成します。
MySardine
コンポーネントと同じ場所に SceneScope
コンポーネントと作成したスクリプトを追加します。
namespace MyPackage {
public class CustomInstaller : MonoBehaviour, IInstaller {
public void Install(ContainerBuilder builder) {
builder.RegisterComponentInHierarchy<MySardine>();
}
}
}
この例では、ビルド時にあなたの MySardine
コンポーネントの sardine フィールドに新規オブジェクトとして生成された SomeoneSardine
コンポーネントが設定されます。
つまり、必要なプレハブをシーン上に配置したり、どのオブジェクトに必要なコンポーネントがアタッチされているかをエディタ画面で探すことなく、スクリプタブルに依存関係を設定することができます。
ユーザーが手動で依存関係をエディタから設定したり、複雑なエディタ拡張機能を作成する必要はありません。
次のような Udon があるとする。
public class BuildDateKeeper : UdonSharpBehaviour {
[SerializeField, HideInInspector]
string builddate;
private void Start() {
Debug.Log($"Build was made `{builddate}`.")
}
#if !COMPILER_UDONSHARP && UNITY_EDITOR
[Inject]
void CalledAtBuildTimeOnly() {
builddate = DateTime.Now.ToString();
}
#endif
}
合わせて以下のスクリプトを作成し BuildDateKeeper
コンポーネントと同じ場所に SceneScope
コンポーネントと作成したスクリプトを追加します。
namespace MyPackage {
public class CustomInstaller : MonoBehaviour, IInstaller {
public void Install(ContainerBuilder builder) {
builder.RegisterComponentInHierarchy<BuildDateKeeper>();
}
}
}
この例では BuildDateKeeper
の builddate フィールドににビルド日時が埋め込まれます。
埋め込みに使用される CalledAtBuildTimeOnly()
メソッドはアップロードされたワールドデータには含まれないため、無駄なアップロードサイズや実行時の負荷はありません。
MIT
com.hoshinolabs.sardinject
https://github.com/hoshinolabs/Sardinject
0.8.6
2022.3 or later
No dependencies
No legacy packages
Undefined