游戏热更新(XLua)专题四(XLua)

2023-12-17 18:38
文章标签 更新 游戏 专题 xlua

本文主要是介绍游戏热更新(XLua)专题四(XLua),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

插件下载:https://github.com/Tencent/xlua


  • 01_Helloworld: 快速入门的例子。
  • 02_U3DScripting: 展示怎么用lua来写MonoBehaviour。
  • 03_UIEvent: 展示怎么用lua来写UI逻辑。
  • 04_LuaObjectOrented: 展示lua面向对象和C#的配合。
  • 05_NoGc: 展示怎么去避免值类型的GC。
  • 06_Coroutine: 展示lua协程怎么和Unity协程相配合。
  • 07_AsyncTest: 展示怎么用lua协程来把异步逻辑同步化。
  • 08_Hotfix: 热补丁的示例(需要开启热补丁特性,如何开启请看指南)。
  • 09_GenericMethod: 泛化函数支持的演示。
  • 10_SignatureLoader: 展示如何读取经数字签名的lua脚本,参见数字签名的文档介绍。
  • 11_RawObject: 当C#参数是object时,如何把一个lua number指定以boxing后的int传递过去。
  • 12_ReImplementInLua: 展示如何将复杂值类型改为lua实现

目录

一、HelloWorld

二、U3DScripting 


一、HelloWorld

using UnityEngine;
using XLua;public class Helloworld : MonoBehaviour
{// Use this for initializationvoid Start(){//创建一个Lua运行的环境,可以去执行我们的lua代码LuaEnv luaenv = new LuaEnv();//打印luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");//销毁我的执行环境luaenv.Dispose();}
}

 


二、U3DScripting 

1.Cube(LuaBehaviour):

Injections是一个Injection类型的数组 

    Size:是数组的长度

    lightObject是数组里面的元素

        Name:依赖注入(每一个name对应一个物体,lua脚本只要用这个Name既可以找到物体)(例如有一个物体身上有灯组件:①Name: A, ②把物体拖进Value ③通过A:GetCompent(typeof(CS.UnityEngine.Light))获取)

        Value::把物体拖进去

LuaBehavior:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using XLua;
using System;[System.Serializable]
public class Injection
{public string name;public GameObject value;
}[LuaCallCSharp]
public class LuaBehaviour : MonoBehaviour
{public TextAsset luaScript;public Injection[] injections;internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!internal static float lastGCTime = 0;internal const float GCInterval = 1;//1 second private Action luaStart;private Action luaUpdate;private Action luaOnDestroy;//lua中有表类型,而C#中没有表类型,LuaTable和Lua中的表相对应,后续实现转换private LuaTable scriptEnv;void Awake(){scriptEnv = luaEnv.NewTable();//为每个脚本设置一个独立的环境,可一定程度上防止脚本间全局变量、函数冲突LuaTable meta = luaEnv.NewTable();//元表 对lua数据结构(表)进行功能上的扩充//"__add"\"__sub"\"_mul.....";meta.Set("__index", luaEnv.Global);scriptEnv.SetMetaTable(meta);meta.Dispose();scriptEnv.Set("self", this);foreach (var injection in injections){scriptEnv.Set(injection.name, injection.value);}luaEnv.DoString(luaScript.text, "LuaBehaviour", scriptEnv);Action luaAwake = scriptEnv.Get<Action>("awake");scriptEnv.Get("start", out luaStart);scriptEnv.Get("update", out luaUpdate);scriptEnv.Get("ondestroy", out luaOnDestroy);if (luaAwake != null){luaAwake();}}// Use this for initializationvoid Start(){if (luaStart != null){luaStart();}}// Update is called once per framevoid Update(){if (luaUpdate != null){luaUpdate();}if (Time.time - LuaBehaviour.lastGCTime > GCInterval){luaEnv.Tick();LuaBehaviour.lastGCTime = Time.time;}}void OnDestroy(){if (luaOnDestroy != null){luaOnDestroy();}luaOnDestroy = null;luaUpdate = null;luaStart = null;scriptEnv.Dispose();injections = null;}
}

 

LuaTestScripts: 

local speed = 10
local lightCpnt = nilfunction start()print("lua start...")print("injected object", lightObject)--找到lightObject,获取它身上的Light组件lightCpnt= lightObject:GetComponent(typeof(CS.UnityEngine.Light))
endfunction update()local r = CS.UnityEngine.Vector3.up * CS.UnityEngine.Time.deltaTime * speed--让cube旋转self.transform:Rotate(r)--改变light的颜色lightCpnt.color = CS.UnityEngine.Color(CS.UnityEngine.Mathf.Sin(CS.UnityEngine.Time.time) / 2 + 0.5, 0, 0, 1)
endfunction ondestroy()print("lua destroy")
end

2.LuaCallCSharp

①新建一个脚本Test.cs

using XLua;[LuaCallCSharp]
public class Test
{public int index;public int Add(int a, int b){return a + b;}
}

②新建一个luaTest.lua.txt(在文件夹修改后缀)

function start()--找到C#脚本local Test=CS.Test--实例化local test=Test()--属性赋值test.index=66print("index"..test.index)--调用方法print("打印返回值"..test.Add(test,1,4))//冒号与点的区别,点,要把对象传进去,冒号则不需要print("打印返回值"..test:Add(1,4))	   
end

 

这篇关于游戏热更新(XLua)专题四(XLua)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/505414

相关文章

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注