Foundation Services
La capa OpenMon.Foundation es el framework compartido sobre el que se apoya todo el
motor: inyeccion de dependencias, persistencia, gestion de escenas y localizacion. Estas
interfaces son estables, inyectables via Zenject y reutilizables en tus propios sistemas.
Esta pagina documenta las tres interfaces de servicio mas los dos ayudantes de DI que mas
sueles heredar.
Nada en OpenMon.Foundation sabe de monstruos ni de combates. Inyectar estas interfaces
(en lugar de las implementaciones concretas) mantiene tu codigo testeable y le permite al
motor cambiar implementaciones sin romperte.
IPersister
Namespace: OpenMon.Foundation.Persistence
La abstraccion de almacenamiento detras de cada guardado. Las implementaciones
(JsonFilePersister, ConfigurationJsonFilePersister, …) deciden donde aterrizan los
bytes; quien llama solo trata con guardado/carga tipados.
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)
Serializa data a destination.
| Parametro | Tipo | Descripcion |
|---|---|---|
data | TOriginal | El objeto a persistir |
destination | string | Donde escribirlo |
suppressErrors | bool | No registrar errores — util para sistemas que funcionan bien cuando el recurso falta (p. ej. el gestor de configuracion leyendo una config ausente en el primer arranque) |
Devuelve: bool — true si tuvo exito.
Load<TOriginal>(out TOriginal data, string origin, bool suppressErrors = false)
Deserializa desde origin hacia data.
| Parametro | Tipo | Descripcion |
|---|---|---|
data | out TOriginal | Recibe el objeto cargado |
origin | string | Desde donde leer |
suppressErrors | bool | No registrar errores cuando el recurso puede faltar legitimamente |
Devuelve: bool — true si tuvo exito (un archivo ausente devuelve false, no una
excepcion).
ISceneManager
Namespace: OpenMon.Foundation.SceneManagement
Envuelve el SceneManager de Unity para agregar seguimiento de escenas cargadas,
validacion de disponibilidad y difusion de eventos. Las escenas se direccionan por
SceneReference o por nombre.
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
Nombres de todas las escenas cargadas actualmente.
Tipo: List<string> (solo lectura)
SceneNames
Todos los nombres de escena conocidos — tanto en Build Settings como addressable.
Tipo: string[] (solo lectura)
IsSceneAvailable(SceneReference scene)
Si una escena realmente se puede cargar (su asset esta presente). Una sobrecarga toma un nombre de escena.
Devuelve: bool.
LoadScene(SceneReference sceneReference, Action<float> progressCallback, Action<bool> callback, LoadSceneMode mode = LoadSceneMode.Additive)
Carga una escena, informando el progreso via progressCallback y el exito via callback.
Por defecto es Additive para que la escena de arranque/persistente siga cargada. Existe
una sobrecarga por nombre.
UnloadScene(SceneReference sceneReference, Action<float> progressCallback, Action<bool> callback)
Descarga una escena, informando progreso y exito. Existe una sobrecarga por nombre.
GetActiveScene() / GetActiveSceneName() / SetActiveScene(...)
Lee o establece la escena activa de Unity (aquella en la que se instancian los objetos nuevos).
MoveObjectToActiveScene(GameObject gameObject) / MoveObjectToScene(...)
Mueve un GameObject a la escena activa o a una escena especifica — la forma estandar de
entregar un objeto pooleado/persistente a la escena que deba poseerlo.
ILocalizer
Namespace: OpenMon.Foundation.Localization
El servicio de localizacion. El texto se indexa por clave; los valueModifiers
sustituyen los marcadores {0}, {1}, … en el string resuelto. El indexador es la via
ergonomica para una sola clave; las sobrecargas GetText / GetTexts agregan seleccion
de idioma y procesamiento por lotes.
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]
Indexador que devuelve el string localizado para key en el idioma actual. Los
valueModifiers reemplazan los marcadores {number}; cuando modifiersAreLocalizableKeys
es true, los modificadores se tratan a su vez como claves y se localizan primero.
Devuelve: string.
GetText(string key, bool modifiersAreLocalizableKeys = true, params string[] valueModifiers)
Forma de metodo del indexador. Las sobrecargas agregan un language objetivo (por id o
indice) para extraer de un idioma especifico, sin importar el actual.
Devuelve: string.
GetTexts(List<string> keys)
Resuelve varias claves de una vez, por lotes. Las sobrecargas agregan un idioma objetivo.
Devuelve: List<string>.
GetCurrentLanguage() / GetCurrentLanguageIndex() / GetAllLanguageIds()
Consulta el idioma activo (clave o indice) y enumera todos los ids de idioma disponibles.
SetLanguage(string language) / SetLanguage(int language)
Cambia el idioma activo por id o indice. Lanza el evento de cambio de idioma.
SubscribeToLanguageChange / UnsubscribeFromLanguageChange
Registra/desregistra notificaciones de cambio de idioma (con o sin el id del nuevo idioma). Usa la misma instancia de delegado para desregistrarte.
Ayudantes de inyeccion de dependencias
Namespace: OpenMon.Foundation.DependencyInjection
El motor enlaza cada asset compartido a traves de pequenos instaladores de Zenject. Cuando hagas inyectable un asset de datos, hereda de uno de estos.
LazySingletonScriptableInstaller<T>
Un ScriptableObjectInstaller que enlaza un ScriptableObject asignado en el inspector
como singleton perezoso de tipo T.
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 es obligatorioContainer.QueueForInject(Reference) no es opcional. Zenject no inyecta los
ScriptableObjects automaticamente: sin esta llamada, cualquier miembro [Inject] del
asset queda null. El enlace .AsSingle().Lazy() luego comparte una unica instancia y
difiere la resolucion hasta que T se solicita por primera vez.
Para hacer inyectable tu propio asset de datos, hereda con un T concreto:
using OpenMon.Foundation.DependencyInjection;
using UnityEngine;
[CreateAssetMenu(menuName = "MyGame/MyConfig")]
public class MyConfig : ScriptableObject { public int Difficulty; }
public class MyConfigInstaller : LazySingletonScriptableInstaller<MyConfig> { }
Un hermano LazySingletonMonoInstaller<T> hace lo mismo para singletons MonoBehaviour
de escena.
AssetManagementUtils (solo editor)
Namespace: OpenMon.Foundation.Editor.Utils
Ayudantes de editor para carga masiva de assets. Vive en el ensamblado Runtime pero todo
el cuerpo esta gateado tras UNITY_EDITOR, asi que nunca se embarca en un build de
jugador.
public static class AssetManagementUtils
{
public static void CreateFolderIfDoesNotExist(string path);
public static List<T> FindAssetsByType<T>() where T : Object;
}
FindAssetsByType<T>()
Carga todos los assets de tipo T del proyecto.
Un AssetDatabase.FindAssets("t:BaseType") plano devuelve nada para un tipo base
abstracto: Unity guarda los assets como subclases concretas. Cuando T es abstracto,
FindAssetsByType<T> recurre a escanear cada subclase concreta en todos los ensamblados
cargados. Sin ese fallback, cargar p. ej. una base Move abstracta da una lista vacia, y
un llamador como MonsterDatabaseInstance.LoadAllMoves() sobrescribiria la lista de
movimientos de la base de datos con nada en una actualizacion, borrando todos los
movimientos de los juegos importados y demo. Si escribis cargadores masivos similares,
reutiliza este ayudante en lugar de llamar a FindAssets directamente.
Devuelve: List<T> — los assets coincidentes, o una lista vacia si no hay ninguno.
Ejemplo de uso
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()
{
// Texto localizado con sustitucion de marcadores.
Debug.Log(localizer["TitleScreen/Welcome", true, "Player"]);
Debug.Log($"Language: {localizer.GetCurrentLanguage()}");
// Carga el primer mapa aditivamente, registrando el progreso.
sceneManager.LoadScene(
"Overworld",
progress => Debug.Log($"Loading: {progress:P0}"),
success => Debug.Log(success ? "Loaded" : "Failed"));
}
}