游戏热更新(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

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓