游戏热更新(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追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个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优化建议注

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1