Saltar al contenido principal

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.

Foundation es agnostico al motor

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.

ParametroTipoDescripcion
dataTOriginalEl objeto a persistir
destinationstringDonde escribirlo
suppressErrorsboolNo 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.

ParametroTipoDescripcion
dataout TOriginalRecibe el objeto cargado
originstringDesde donde leer
suppressErrorsboolNo 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 obligatorio

Container.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.

Los tipos base abstractos necesitan el fallback de subclases

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"));
}
}