メインコンテンツまでスキップ

Foundation Services

OpenMon.Foundation レイヤーは、エンジン全体が乗る共有フレームワークです。依存性注入、 永続化、シーン管理、ローカライズを担います。これらのインターフェースは安定しており、Zenject で 注入可能で、あなた自身のシステムでも再利用できます。このページでは 3 つのサービスインターフェースと、 最もよく継承する 2 つの DI ヘルパーを解説します。

Foundation はエンジン非依存

OpenMon.Foundation の何もモンスターやバトルを知りません。具象実装ではなくこれらの インターフェースを注入することで、コードがテスト可能に保たれ、エンジンはあなたを壊さずに 実装を差し替えられます。

IPersister​

Namespace: OpenMon.Foundation.Persistence

すべてのセーブの背後にあるストレージ抽象。実装(JsonFilePersister、 ConfigurationJsonFilePersister など)はバイトがどこへ着地するかを決め、呼び出し側は 型付きのセーブ/ロードだけを扱います。

public interface IPersister
{
bool Save<TOriginal>(TOriginal data, string destination, bool suppressErrors = false);
bool Load<TOriginal>(out TOriginal data, string origin, bool suppressErrors = false);
}

Save<TOriginal>(TOriginal data, string destination, bool suppressErrors = false)​

data を destination へシリアライズします。

パラメータ型説明
dataTOriginal永続化するオブジェクト
destinationstring書き込み先
suppressErrorsboolエラーをログしない — リソースが欠けていても動作するシステム(例: 初回起動で不在の設定を読む設定マネージャ)に有用

戻り値: bool — 成功時 true。

Load<TOriginal>(out TOriginal data, string origin, bool suppressErrors = false)​

origin から data へデシリアライズします。

パラメータ型説明
dataout TOriginalロードされたオブジェクトを受け取る
originstring読み込み元
suppressErrorsboolリソースが正当に不在であり得るときエラーをログしない

戻り値: bool — 成功時 true(不在のファイルは例外ではなく false を返します)。

ISceneManager​

Namespace: OpenMon.Foundation.SceneManagement

Unity の SceneManager をラップし、ロード済みシーンの追跡、可用性検証、イベント配信を 追加します。シーンは SceneReference または名前でアドレス指定します。

public interface ISceneManager
{
List<string> LoadedScenes { get; }
string[] SceneNames { get; }

bool IsSceneAvailable(SceneReference scene);
bool IsSceneAvailable(string scene);

void LoadScene(SceneReference sceneReference, Action<float> progressCallback,
Action<bool> callback, LoadSceneMode mode = LoadSceneMode.Additive);
void LoadScene(string sceneName, Action<float> progressCallback,
Action<bool> callback, LoadSceneMode mode = LoadSceneMode.Additive);

void UnloadScene(SceneReference sceneReference, Action<float> progressCallback, Action<bool> callback);
void UnloadScene(string sceneName, Action<float> progressCallback, Action<bool> callback);

Scene GetActiveScene();
string GetActiveSceneName();
void SetActiveScene(SceneReference scene);
void SetActiveScene(string sceneName);

void MoveObjectToActiveScene(GameObject gameObject);
void MoveObjectToScene(GameObject gameObject, SceneReference scene);
void MoveObjectToScene(GameObject gameObject, string scene);
}

LoadedScenes​

現在ロードされている全シーンの名前。

型: List<string>(読み取り専用)

SceneNames​

Build Settings と addressable の両方の、既知の全シーン名。

型: string[](読み取り専用)

IsSceneAvailable(SceneReference scene)​

シーンが実際にロード可能か(アセットが存在するか)。名前を取るオーバーロードもあります。

戻り値: bool。

LoadScene(SceneReference sceneReference, Action<float> progressCallback, Action<bool> callback, LoadSceneMode mode = LoadSceneMode.Additive)​

シーンをロードし、進捗を progressCallback、成否を callback で報告します。起動/永続シーンが ロードされたままになるよう既定は Additive です。名前ベースのオーバーロードもあります。

UnloadScene(SceneReference sceneReference, Action<float> progressCallback, Action<bool> callback)​

シーンをアンロードし、進捗と成否を報告します。名前ベースのオーバーロードもあります。

GetActiveScene() / GetActiveSceneName() / SetActiveScene(...)​

Unity のアクティブシーン(新しいオブジェクトが生成されるシーン)を読み取り/設定します。

MoveObjectToActiveScene(GameObject gameObject) / MoveObjectToScene(...)​

GameObject をアクティブシーンまたは特定のシーンへ移動します — プール/永続オブジェクトを、 所有すべきシーンへ引き渡す標準的な方法です。

ILocalizer​

Namespace: OpenMon.Foundation.Localization

ローカライズサービス。テキストはキー付けされ、valueModifiers が解決後の文字列内の {0}、{1} … プレースホルダを置換します。インデクサは単一キーに対する使いやすい経路で、 GetText / GetTexts オーバーロードは言語選択とバッチ処理を追加します。

public interface ILocalizer
{
string this[string key, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers] { get; }

string GetText(string key, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers);
string GetText(string key, string language, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers);
string GetText(string key, int languageIndex, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers);

List<string> GetTexts(List<string> keys);
List<string> GetTexts(List<string> keys, string language);

string GetCurrentLanguage();
int GetCurrentLanguageIndex();
int GetLanguageIndex(string language);
List<string> GetAllLanguageIds();

void SetLanguage(string language);
void SetLanguage(int language);

void SubscribeToLanguageChange(Action<string> callback);
void SubscribeToLanguageChange(Action callback);
void UnsubscribeFromLanguageChange(Action<string> callback);
void UnsubscribeFromLanguageChange(Action callback);

void LoadNewLanguageValues(List<ScriptableLanguage> newLanguages);
void ReDownloadLanguagesFromGoogleSheet();
}

this[string key, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers]​

現在の言語で key のローカライズ文字列を返すインデクサ。valueModifiers は {number} プレースホルダを置換し、modifiersAreLocalizableKeys が true のときは修飾子自体もキーとして 扱われ、先にローカライズされます。

戻り値: string。

GetText(string key, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers)​

インデクサのメソッド形。オーバーロードは対象 language(ID またはインデックス)を追加し、 現在の言語に関わらず特定の言語から引き出します。

戻り値: string。

GetTexts(List<string> keys)​

複数のキーを一括で解決します。オーバーロードは対象言語を追加します。

戻り値: List<string>。

GetCurrentLanguage() / GetCurrentLanguageIndex() / GetAllLanguageIds()​

アクティブな言語(キーまたはインデックス)を照会し、利用可能な全言語 ID を列挙します。

SetLanguage(string language) / SetLanguage(int language)​

アクティブな言語を ID またはインデックスで切り替えます。言語変更イベントを発火します。

SubscribeToLanguageChange / UnsubscribeFromLanguageChange​

言語変更通知を登録/解除します(新しい言語 ID あり/なし)。解除には同じデリゲートインスタンスを 使ってください。

依存性注入ヘルパー​

Namespace: OpenMon.Foundation.DependencyInjection

エンジンは各共有アセットを小さな Zenject インストーラを通じてバインドします。データアセットを 注入可能にするときは、これらのいずれかを継承します。

LazySingletonScriptableInstaller<T>​

インスペクタで割り当てた ScriptableObject を型 T の遅延シングルトンとしてバインドする ScriptableObjectInstaller。

public class LazySingletonScriptableInstaller<T> : ScriptableObjectInstaller
where T : ScriptableObject
{
[SerializeField] protected T Reference;

public override void InstallBindings()
{
Container.QueueForInject(Reference);
Container.Bind<T>().FromInstance(Reference).AsSingle().Lazy();
}
}
QueueForInject は必須

Container.QueueForInject(Reference) は任意ではありません。ScriptableObject は Zenject に 自動注入されません。この呼び出しがないと、アセット上の [Inject] メンバーは null のまま です。その後 .AsSingle().Lazy() バインドが単一インスタンスを共有し、T が初めて要求されるまで 解決を遅延します。

自作のデータアセットを注入可能にするには、具象 T で継承します。

using OpenMon.Foundation.DependencyInjection;
using UnityEngine;

[CreateAssetMenu(menuName = "MyGame/MyConfig")]
public class MyConfig : ScriptableObject { public int Difficulty; }

public class MyConfigInstaller : LazySingletonScriptableInstaller<MyConfig> { }

兄弟の LazySingletonMonoInstaller<T> はシーンの MonoBehaviour シングルトンに同じことを 行います。

AssetManagementUtils(エディタ専用)​

Namespace: OpenMon.Foundation.Editor.Utils

一括アセットロードのためのエディタヘルパー。Runtime アセンブリに存在しますが、本体全体が UNITY_EDITOR でゲートされているため、プレイヤービルドには決して同梱されません。

public static class AssetManagementUtils
{
public static void CreateFolderIfDoesNotExist(string path);
public static List<T> FindAssetsByType<T>() where T : Object;
}

FindAssetsByType<T>()​

プロジェクト内の型 T の全アセットをロードします。

抽象基底型にはサブクラスフォールバックが必要

素の AssetDatabase.FindAssets("t:BaseType") は抽象基底型に対して何も返しません。 Unity はアセットを具象サブクラスとして保存するためです。T が抽象のとき、 FindAssetsByType<T> はロード済みの全アセンブリにわたって各具象サブクラスをスキャンする フォールバックに切り替えます。そのフォールバックがないと、例えば抽象 Move 基底をロードすると 空リストになり、MonsterDatabaseInstance.LoadAllMoves() のような呼び出し側が更新時に データベースの技リストを空で上書きし、インポートおよびデモゲームのすべての技を消してしまいます。 似た一括ローダを書く場合は、FindAssets を直接呼ぶのではなくこのヘルパーを再利用してください。

戻り値: List<T> — 一致したアセット、なければ空リスト。

使用例​

using OpenMon.Foundation.Localization;
using OpenMon.Foundation.SceneManagement;
using Zenject;

public class TitleScreen : MonoBehaviour
{
[Inject] private ILocalizer localizer;
[Inject] private ISceneManager sceneManager;

private void Start()
{
// プレースホルダ置換付きのローカライズテキスト。
Debug.Log(localizer["TitleScreen/Welcome", true, "Player"]);
Debug.Log($"Language: {localizer.GetCurrentLanguage()}");

// 最初のマップを加算的にロードし、進捗をログします。
sceneManager.LoadScene(
"Overworld",
progress => Debug.Log($"Loading: {progress:P0}"),
success => Debug.Log(success ? "Loaded" : "Failed"));
}
}