beasty-visual-novel / scripting / generated-accessors.md

Accesores generados: VNVars y VNChars

VNVars y VNChars son archivos C# que el editor genera a partir de las variables y personajes de tu proyecto. Hacen que un error de tipeo en una clave deje de ser una respuesta equivocada y silenciosa y pase a ser un error de compilación.

El problema que resuelven

El almacén de variables se indexa por string. VN.GetBool("met_maya") sobre una clave que en realidad escribiste como met_Maya no lanza excepción ni advierte: devuelve el valor de respaldo, false. La condición nunca se dispara, la rama nunca se ejecuta, y terminas buscando el bug en el grafo.

VN.SetInt("money", 100);      // compila sin importar lo que escribas
int m = VN.GetInt("mony");    // 0. Sin error. Sin advertencia.

Con los accesores generados, el mismo error no compila:

VNVars.Money = 100;
int m = VNVars.Mony;          // CS0117: 'VNVars' does not contain a definition for 'Mony'

Cómo se ven

VNVars es una clase estática plana, una propiedad por variable, tipada según el tipo de valor declarado de la variable:

El archivo VNVars generado, abierto en un editor de código

public static class VNVars
{
    /// <summary>Variable [money] (Fixed/Int).</summary>
    public static int Money { get => VN.GetInt("money"); set => VN.SetInt("money", value); }
}

VNChars es una clase estática por personaje, una propiedad por variable de personaje:

public static class VNChars
{
    public static class Maya
    {
        public static int Affection { get => VN.GetCharInt("maya", "affection");
                                      set => VN.SetCharInt("maya", "affection", value); }
    }
}

Los miembros exactos dependen de tu proyecto. Las claves se convierten en propiedades PascalCase; el id del personaje se convierte en el nombre de la clase anidada.

Regenerar

MenúRegenera
Tools > Beasty VN > Codegen > Regenerate VNVars AccessorsVNVars — una propiedad por variable
Tools > Beasty VN > Codegen > Regenerate VNChars AccessorsVNChars — una clase anidada por personaje

Regenera después de añadir, renombrar o eliminar una variable, una variable de personaje o un personaje. Nada más los cambia, y nada te avisa cuando quedan desactualizados — una variable renombrada deja un accesor apuntando a una clave que ya no existe, que lee el valor de respaldo exactamente igual que lo haría un error de tipeo.

Ambos archivos llevan un encabezado <auto-generated>. No los edites a mano: la próxima regeneración los sobrescribe. Ambos viven en el ensamblado y namespace Beasty.VN.Runtime, así que tus scripts de juego los ven sin ninguna referencia extra.

Usarlos junto a la API de strings

Son una comodidad sobre el mismo almacén, no un sistema separado. VNVars.Money compila a VN.GetInt("money"). Ambos caminos llegan al mismo VariableStore, así que puedes mezclarlos libremente:

using Beasty.VN.Runtime;

public static class Shop
{
    public static bool Buy(int price)
    {
        if (VNVars.Money < price) return false;

        VNVars.Money -= price;                      // tipado
        VN.SetBool("bought_something", true);       // con clave de string, sin accesor necesario
        VNChars.Maya.Affection += 1;                // tipado, variable de personaje
        return true;
    }
}

Todo lo que dice la API de VN aplica sin cambios, incluyendo la parte importante: estos leen la SESIÓN ACTIVA. Fuera de una historia en ejecución, cada getter devuelve su valor de respaldo y cada setter advierte y no hace nada. Para leer el estado del juego desde FreeRoam, el menú principal o tu propio modo, usa VNGameController.Instance.SharedVariables, o una de las APIs de gameplay, que ya lo hacen.

Una clave que nunca declaraste en el editor no tiene accesor. Escríbela con la API de strings, o declárala — declararla es lo que la hace visible para el selector de condiciones, el validador y el guardado.

ItemIds

La pestaña Items genera el mismo tipo de archivo para los ids de inventario: una clase ItemIds de constantes de string, pensada para pasarse a Inventory.Item(...). Aplican las mismas reglas — regenera cuando tus ids cambien, no la edites a mano. Consulta APIs de gameplay.

Ver también