Método de uso de actualización en caliente de xlua (1)

Introducción a la actualización en caliente

En la actualidad, el programa principal de actualización en caliente sigue siendo lua, de los cuales ulua, ToLua y Xlua son los más populares.

Tolua heredado de ulua
http://www.ulua.org/index.html
click para abrir
Inserte la descripción de la imagen aquí

Xlua

https://github.com/Tencent/xLua
xlua learning, primero mire los tutoriales y archivos de configuración imprescindibles en el documento
Inserte la descripción de la imagen aquí

C # visita a Lua

Inserte la descripción de la imagen aquí

Acceso de Lua a C #
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Nota: xlua solo admite la llamada de funciones sobrecargadas hasta cierto punto, porque el tipo de lua es mucho menos rico que C #, hay una situación de uno a muchos, como C # int, float, double corresponden al número lua, arriba En el ejemplo de TestFunc, si hay estos parámetros sobrecargados, la primera línea será indistinguible, solo se puede llamar a uno de ellos (el que está delante del código generado)
Inserte la descripción de la imagen aquí

Después de leer la configuración y los tutoriales dados por xlua, repasemos los ejemplos dados uno por uno, combine los tutoriales y los archivos de configuración para experimentar el uso de xlua en el desarrollo.

Instalar xlua en un proyecto vacío

Inserte la descripción de la imagen aquí

Recomendación de herramientas de desarrollo

Yo uso vscode para desarrollar lua aquí. Si es posible, puedo usar el rider para
Inserte la descripción de la imagen aquí
abrir el archivo lua con un sufijo .txt, que no es reconocido por vscode. ¿Por qué es el sufijo txt? ¿Se puede cambiar? Ver la respuesta oficial

Inserte la descripción de la imagen aquí
Resumen: El sufijo Lua puede usar un sufijo que no sea txt, y también se recomienda oficialmente. También creo que el calor debe reutilizarse donde sea necesario y usarse de manera conservadora, en lugar de simplemente implantarlo.
Así
Inserte la descripción de la imagen aquí
que eliminemos el sufijo txt y veamos ahora que vscode puede reconocerlo. (Después del reconocimiento, vuelva a agregar el sufijo txt para que aún se reconozca )
Vamos a abrirlo con rider y ver

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Descargué el complemento Emmylua. Se puede ver que solo se reconoce el sufijo lua, pero no se reconoce el sufijo txt.
Inserte la descripción de la imagen aquí

En el seguimiento, sugiero desarrollar el rider si es posible. La experiencia de desarrollo mixto de C # y Lua será mucho mejor. Todavía hay una brecha en el desarrollo de C # con vscode. Por supuesto, esto se puede hacer con vscode + vs. Use vscode para desarrollar más tarde (la experiencia del usuario de 30 días ha expirado)

Después de abrir, podemos ver que hay tres tutoriales de Xlua.
Inserte la descripción de la imagen aquí

El primer ejemplo es

C # llamar a lua

Hay notas detalladas, aquí hay un resumen del proceso. Primero cree un luaenv global, y luego cargue el script lua (usando el método DoString), Get accede directamente a las variables globales de lua, la tabla global es mapeada por interfaz y la función global es mapeada por delgate (también el método recomendado por el autor)

void Start()
        {
    
    
            luaenv = new LuaEnv();
            luaenv.DoString(script);

            Debug.Log("_G.a = " + luaenv.Global.Get<int>("a"));
            Debug.Log("_G.b = " + luaenv.Global.Get<string>("b"));
            Debug.Log("_G.c = " + luaenv.Global.Get<bool>("c"));


            DClass d = luaenv.Global.Get<DClass>("d");//映射到有对应字段的class,by value
            Debug.Log("_G.d = {f1=" + d.f1 + ", f2=" + d.f2 + "}");

            Dictionary<string, double> d1 = luaenv.Global.Get<Dictionary<string, double>>("d");//映射到Dictionary<string, double>,by value
            Debug.Log("_G.d = {f1=" + d1["f1"] + ", f2=" + d1["f2"] + "}, d.Count=" + d1.Count);

            List<double> d2 = luaenv.Global.Get<List<double>>("d"); //映射到List<double>,by value
            Debug.Log("_G.d.len = " + d2.Count);

            ItfD d3 = luaenv.Global.Get<ItfD>("d"); //todo 映射到interface实例,by ref,这个要求interface加到生成列表,否则会返回null,建议用法
            d3.f2 = 1000;
            Debug.Log("_G.d = {f1=" + d3.f1 + ", f2=" + d3.f2 + "}");
            Debug.Log("_G.d:add(1, 2)=" + d3.add(1, 2));

            LuaTable d4 = luaenv.Global.Get<LuaTable>("d");//映射到LuaTable,by ref
            Debug.Log("_G.d = {f1=" + d4.Get<int>("f1") + ", f2=" + d4.Get<int>("f2") + "}");


            Action e = luaenv.Global.Get<Action>("e");//todo 映射到一个delgate,要求delegate加到生成列表,否则返回null,建议用法
            e();

            FDelegate f = luaenv.Global.Get<FDelegate>("f");
            DClass d_ret;
            int f_ret = f(100, "John", out d_ret);//lua的多返回值映射:从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数
            Debug.Log("ret.d = {f1=" + d_ret.f1 + ", f2=" + d_ret.f2 + "}, ret=" + f_ret);

            GetE ret_e = luaenv.Global.Get<GetE>("ret_e");//delegate可以返回更复杂的类型,甚至是另外一个delegate
            e = ret_e();
            e();

            LuaFunction d_e = luaenv.Global.Get<LuaFunction>("e");
            d_e.Call();

        }

La interfaz también puede acceder a funciones (las funciones se agregan a la tabla), escribamos una y pruébelo
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Segundo tutorial

carga de archivo lua

Para cargar archivos lua, use la función require de lua, por ejemplo: DoString ("require'byfile '")
Aquí puede ver la parte de carga en el tutorial de xlua
Inserte la descripción de la imagen aquí

Cabe señalar que el archivo lua debe colocarse debajo del archivo de recursos y el sufijo debe ser txt (de lo contrario, no se reconocerán los recursos) antes de que se pueda cargar correctamente. De acuerdo con el tutorial, agregamos un main
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
y luego cargamos los archivos requeridos en main

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Dado que se carga de acuerdo con Recursos, si hay más de
uno, coloque uno en Recursos en Activos y otro en la ubicación del script C #, y encontrará que se llamará al script correspondiente en el archivo de Recursos en C #. Si no existe, busque otro script de Lua para la ubicación
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Puede ver la carga exitosa.
Además, también puede escribir directamente en dostring
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Carga personalizada del cargador

El tutorial muestra que require se carga de acuerdo con el cargador, probemos el cargador personalizado (por ejemplo, no queremos cargar desde Recursos, pero queremos cargar desde nuestro archivo personalizado)

Inserte la descripción de la imagen aquí
Las expresiones lambda se usan en el tutorial para escribir (funciones anónimas, no es necesario declarar los nombres de las funciones), podemos imitarlas o no usar lambda

Inserte la descripción de la imagen aquí
Puede ver que esta interfaz es para devolver una matriz de bytes, por lo que simplemente escribimos una función que devuelve una matriz de bytes, puede agregar un AddLoader, que pasa a una ruta de archivo, que es el nombre del archivo (nombre de archivo lua cargado),
siempre que a medida que cargamos el proceso en el interior, obtenga todo el contenido del script lua y convierta

Simplemente devuelva la matriz (si el script lua está en línea, puede descargarlo de Internet o el script lua está en la carpeta que especificamos) para
acceder a la carpeta especificada, necesita conocer la ruta de la carpeta de diferentes plataformas:
Inserte la descripción de la imagen aquí

Elija un experimento de ruta de datos de aplicación y el
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
último es

Lua llama ejemplo de C #

Copiemos la parte de lua para que se vea más claro. Los comentarios dados por el autor son muy detallados. Simplemente escriba donde lo necesite. El autor también tiene una introducción detallada a lua llamando a C # en el tutorial de xlua.
Inserte la descripción de la imagen aquí
Resumen: el
nuevo objeto debe usar CS. Espacio de nombres. Object ()
lectura de atributo estático con CS, escritura también con CS, llamada de método estático escribir directamente el nombre del método (todos los métodos de C # que necesitan ser llamados por lua, se deben agregar atributos [LuaCallCSharp ])
Guarde las clases para que C # las llame en Lua, de modo que no tenga que llamarlas con frecuencia a través de CS cada vez

Inserte la descripción de la imagen aquí

También se puede acceder directamente al tipo de enumeración lua de C # con CS.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Estos tres ejemplos, respectivamente, muestran todo el proceso de llamada mutua entre lua y C #, que sienta las bases para la actualización en caliente. En el próximo artículo, veremos la actualización en caliente pasos de xlua, xlua Cómo el funcionario hace la actualización en caliente.

Supongo que te gusta

Origin blog.csdn.net/euphorias/article/details/112063413
Recomendado
Clasificación