在lua里实现类似unity生命周期的监听事件

SLua-在Lua中实现Unity中的生命周期 Enumerable.Cast(IEnumerable) Method : Casts the elements of an IEnumerable to the specified type. 将一个IEnumerable的元素转换为一个具体的类型。 实现Unity中的Unity生命周期 1.获取Lua的表 2.获取表中的Update方法 3.使用强制类... 阅读详情

应用面:能用像写c#一样,在lua里实现业务功能,更好的理解lua

源码:

c#部分:我用的是xlua,注册方式使用[XLua.LuaCallCSharp],tolua的注册方式自行查找


namespace Game.Scripts.Listener
{
    [DisallowMultipleComponent]
    [AddComponentMenu("")]  // Hide in 'Add Component' menu
    [XLua.LuaCallCSharp]
    public class StartListenerIL : MonoBehaviour
    {
        public event Action listeners;

        public void AddListener(Action func)
        {
            listeners += func;
        }

        public void RemoveListener(Action func)
        {
            listeners -= func;
        }

        private void Start()
        {
            listeners?.Invoke();
        }
    }
}
namespace Game.Scripts.Listener
{
    [DisallowMultipleComponent]
    [AddComponentMenu("")]  // Hide in 'Add Component' menu
    [XLua.LuaCallCSharp]
    public class EnableListenerIL : MonoBehaviour
    {
        public event Action listeners;

        public void AddListener(Action func)
        {
            listeners += func;
        }

        public void RemoveListener(Action func)
        {
            listeners -= func;
        }

        private void OnEnable()
        {
            listeners?.Invoke();
        }
    }
}

namespace Game.Scripts.Listener
{
    [DisallowMultipleComponent]
    [AddComponentMenu("")]  // Hide in 'Add Component' menu
    [XLua.LuaCallCSharp]
    public class DisableListenerIL : MonoBehaviour
    {
        public event Action listeners;

        public void AddListener(Action func)
        {
            listeners += func;
        }

        public void RemoveListener(Action func)
        {
            listeners -= func;
        }

        private void OnDisable()
        {
            if (listeners != null)
                listeners.Invoke();
        }
    }
}

namespace Game.Scripts.Listener
{
    [DisallowMultipleComponent]
    [AddComponentMenu("")]  // Hide in 'Add Component' menu
    [XLua.LuaCallCSharp]
    public class DestroyListenerIL : MonoBehaviour
    {
        public event Action listeners;

        public void AddListener(Action func)
        {
            listeners += func;
        }

        public void RemoveListener(Action func)
        {
            listeners -= func;
        }

        private void OnDestroy()
        {
            if(listeners != null)
                listeners.Invoke();
        }
    }
}

namespace Game.Scripts.Listener
{
    [DisallowMultipleComponent]
    [AddComponentMenu("")]  // Hide in 'Add Component' menu
    [XLua.LuaCallCSharp]
    public class UpdateListenerIL : MonoBehaviour
    {
        public event Action listeners;

        public void AddListener(Action func)
        {
            listeners += func;
        }

        public void RemoveListener(Action func)
        {
            listeners -= func;
        }

        private void Update()
        {
            listeners?.Invoke();
        }
    }
}

以上几个是常用的生命周期函数,后续想添加其他接口,按相同的方式添加代码

Lua部分:

local Helpers = {}

function Helpers.AddEnableListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.EnableListenerIL);
	local listener = tr:GetComponent(types);
	if listener == nil or listener:Equals(nil) then
		listener = tr.gameObject:AddComponent(typeof(types)) 
	end
	listener:AddListener(func);

	if tr.gameObject.activeInHierarchy and func ~= nil then
		func();
	end
end

function Helpers.RemoveEnableListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.EnableListenerIL);
	local listener = tr:GetComponent(types);
	if listener ~= nil then
		listener:RemoveListener(func);
	end
end

function Helpers.AddDisableListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.DisableListenerIL);
	local listener = tr:GetComponent(types);
	if listener == nil or listener:Equals(nil) then
		listener = tr.gameObject:AddComponent(typeof(types)) 
	end
	listener:AddListener(func);
end

function Helpers.RemoveDisableListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.DisableListenerIL);
	local listener = tr:GetComponent(types);
	if listener ~= nil then
		listener:RemoveListener(func);
	end
end

function Helpers.AddStartListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.StartListenerIL);
	local listener = tr:GetComponent(types);
	if listener == nil or listener:Equals(nil) then
		listener = tr.gameObject:AddComponent(typeof(types)) 
	end
	listener:AddListener(func)
end

function Helpers.RemoveStartListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.StartListenerIL);
	local listener = tr:GetComponent(types);
	if listener ~= nil then
		listener:RemoveListener(func);
	end
end

function Helpers.AddDestroyListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.DestroyListenerIL);
	local listener = tr:GetComponent(types);
	if listener == nil or listener:Equals(nil) then
		listener = tr.gameObject:AddComponent(typeof(types)) 
	end
	listener:AddListener(func)
end

function Helpers.RemoveDestroyListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.DestroyListenerIL);
	local listener = tr:GetComponent(types);
	if listener ~= nil then
		listener:RemoveListener(func);
	end
end

function Helpers.AddUpdateListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.UpdateListenerIL);
	local listener = tr:GetComponent(types);
	if listener == nil or listener:Equals(nil) then
		listener = tr.gameObject:AddComponent(typeof(types)) 
	end
	listener:AddListener(func)
end

function Helpers.RemoveUpdateListener(tr, func)

	local types = typeof(CS.Game.Scripts.Listener.UpdateListenerIL);
	local listener = tr:GetComponent(types);
	if listener ~= nil then
		listener:RemoveListener(func);
	end
end

return Helpers

xLua笔记(2)—Unity对象的MonoBehaviour Lua脚本 我们通常用继承了monobehaivor的C#脚本来开发游戏,本节我尝试用lua脚本来制作这样这个脚本,在lua侧来开发实现业务逻辑。 1、根据unity对象的生命周期,我们定义常见的几个MonoBehaivor的函数,我们先创建一个lua脚本,包含了这里面的几个通用函数。 LuaMonoBehaviour.lua文件,目录在Assets\LuaScripts\Common下 function A... 阅读详情

相关推荐

Unity中C#与Lua通信:依赖注入与UI事件绑定实战解析

在游戏开发与跨语言编程中,依赖注入是一种重要的设计模式,它通过将依赖关系从代码内部转移到外部来提升模块的独立性与可测试性。其核心原理是控制反转,由容器负责创建和管理对象,并在运行时动态注入依赖。这一技术对于构建松耦合、可维护的大型系统具有关键价值,尤其在需要频繁更新和扩展的业务场景中。在Unity引擎的混合编程实践中,C#与Lua的交互是典型应用。C#作为稳定的底层,负责资源管理与核心系统;而Lua凭借其热更新能力,常用于实现灵活的游戏逻辑与UI交互。通过依赖注入,C#可以将管理器等实例安全地提供给Lua使

weixin_33888907的博客 286

Lua调用C#语言十(Lua实现Unity生命周期函数)

C#代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class LuaObjMgr : SingletonAutoMono<LuaObjMgr> { public UnityAction start; public UnityAction update; public UnityAction

赵某人 696

Unity热更新实战:基于xLua的Lua集成架构与性能优化指南

热更新是移动端游戏开发中的核心技术,它允许开发者在无需重新发布应用的情况下修复Bug或更新内容。其原理是通过在运行时动态加载和执行脚本代码,绕过平台审核流程。在Unity引擎中,Lua因其轻量级、高效和易于嵌入的特性,成为实现热更新的主流方案。通过C#与Lua虚拟机的双向通信桥梁,开发者可以将核心游戏逻辑脚本化,从而提升项目的可维护性和迭代效率。在应用场景上,Lua热更新广泛应用于需要频繁更新活动内容的移动游戏、大型MMO游戏的资源热更,以及需要快速响应线上问题的项目。本文聚焦于Unity与Lua的深度集成

weixin_34174105的博客 453

在lua里实现事件监听系统

功能优势:1.事件使用2级标签【2个key值】,相比起单个key值,2级标签能够适应多种场合与情况,。2.监听的绑定已支持自动销毁,随着物体被销毁而注销事件,并不需要人为的操作,以减少bug。3.事件支持休眠与唤醒功能,在物体隐藏时不在响应事件的接收,唤醒后自动刷新数据。【该功能很好适用于MVC框架,主要给在UI界面使用,界面某个物体隐藏时理应不在刷新数据,而它显示出来时会强制更新一次数据】 PS:该文章部分源码依据于此在lua里实现类似unity生命周期的监听事件_Le_Sam的博客-优快云博客 正

Le_Sam的博客 3155

Unity游戏Lua性能优化实战:从编码习惯到架构设计

在游戏开发中,脚本语言如Lua因其热更新能力而被广泛采用,但其解释执行的特性也带来了性能挑战。理解其虚拟机原理是优化的基础,关键在于管理内存分配与垃圾回收(GC),以减少因GC全停顿导致的帧率波动。优化的技术价值在于提升运行时效率与稳定性,直接影响玩家体验。在Unity引擎中,Lua与C#的交互、高频循环内的对象创建是典型的应用场景。通过局部变量、table.concat、对象池等【实战技巧】,并遵循从编码规范到架构设计的层次化策略,能系统性地解决【内存泄漏】与卡顿问题,确保热更新方案不成为性能瓶颈。

weixin_33889665的博客 441

Unity面试必备:Lua核心特性与热更新实战解析

在游戏开发领域,热更新是保障项目快速迭代与线上问题修复的核心技术。其核心原理在于将游戏逻辑与底层引擎分离,通过脚本语言动态加载和执行,实现无需重新发布客户端即可更新内容。Lua作为一种轻量级、可嵌入的脚本语言,凭借其高效的虚拟机、灵活的table数据结构和强大的元表机制,成为热更新方案的首选。其技术价值在于平衡了开发效率与运行时性能,通过C#与Lua的交互绑定,使得游戏逻辑可热更,而引擎核心保持稳定。在Unity手游和MMO等应用场景中,Lua不仅用于实现UI逻辑、玩法系统,更是构建整个热更新架构的基石。本

weixin_33727510的博客 440

unity和xlua 第三步如何在lua里面实现监听事件

1 --EventManager.lua 位于Assets/GameRes/Lua/ local EventManager = {} local listenerTable = { } --添加监听 是不是重复监听 EventManager.AddListener = function(eventType, listener,target) --如果其参数 v 的值为假(ni...

weixin_41995872的博客 3824

Unity集成Lua脚本:从架构设计到双向通信的完整实践指南

在游戏开发中,脚本语言是实现逻辑动态化和热更新的关键技术。Lua作为一种轻量级、高性能的脚本语言,因其易于嵌入和高效执行的特点,被广泛应用于游戏逻辑扩展。其核心原理在于通过虚拟机机制,实现与主程序(如C#)的隔离与交互,从而在不重新编译客户端的情况下更新游戏内容。这种技术为移动端游戏带来了灵活的内容迭代能力,显著降低了更新成本。在Unity引擎中,通过桥接层将Lua与C#结合,可以构建出既保持原生性能又支持动态更新的混合架构。本文以热更新和性能优化为切入点,通过一个完整的DEMO,详细展示了如何设计分层架构

weixin_33857230的博客 395

C#与Lua热更新架构:原理、实现与Unity游戏开发实践

热更新技术是现代游戏与大型应用开发中的核心工程实践,它允许开发者在无需重新发布客户端安装包的情况下,动态更新应用逻辑与资源。其基本原理在于将稳定的核心框架与需要频繁变动的业务逻辑进行分离,通常采用C#等编译型语言构建底层引擎,而使用Lua等脚本语言实现动态层。这种架构的技术价值在于极大地缩短了版本迭代周期,能够快速修复线上BUG和发布新内容,从而提升用户体验并降低玩家流失风险。在应用场景上,它尤其适用于手游、网游等需要频繁更新和运营的活动型项目。本文将以Unity引擎为例,深入探讨如何通过C#与Lua的组合

weixin_30732487的博客 315

Unity ToLua框架下Lua自定义属性系统实现指南

在Unity游戏开发中,热更新技术是提升项目迭代效率的关键,而Lua作为热更新方案的核心脚本语言,其代码的组织与架构能力直接影响开发体验。自定义属性(Attribute)是一种常见的元编程技术,它允许开发者为代码元素(如类、方法)添加声明式标记,从而实现自动化配置、依赖注入和反射式编程。其原理是通过在编译时或运行时解析这些元数据,驱动框架执行特定的逻辑。这项技术的核心价值在于将“是什么”与“怎么做”解耦,显著提升代码的可读性、可维护性和可扩展性。在Unity与Lua结合的热更新方案中,如ToLua或xLua

weixin_30905133的博客 426

Unity xLua动态UI:用Lua描述实现数据驱动的运行时界面生成

在Unity UI开发中,数据驱动架构正成为提升迭代效率与跨职能协作的关键范式。其核心原理是将界面结构抽象为可计算、可版本管理的数据描述,再通过运行时解析与组件化实例化完成GameObject树构建。xLua凭借零拷贝调用、生命周期深度集成及强调试能力,成为支撑该范式的首选桥接方案。它不仅降低热更新门槛,更使策划可直接参与UI配置,广泛应用于背包系统、登录页、商城等需高频调整与A/B测试的场景。本文聚焦于Lua描述定义、C#解析模型、UGUI组件按需注入与表达式绑定四大技术环节。

weixin_30521161的博客 603

Unity热更新入门:5分钟快速上手SLua框架与Lua脚本集成

热更新是移动游戏开发中的关键技术,它允许应用在不重新发布安装包的情况下更新内容和修复Bug,从而提升用户体验和运营灵活性。其核心原理是通过动态加载和执行脚本代码来实现逻辑的实时替换。在Unity引擎中,Lua因其轻量、高效和易于嵌入的特性,成为实现热更新的主流脚本语言选择。通过Lua绑定框架,开发者可以在保持核心性能模块使用C#的同时,将易变的业务逻辑交由Lua处理,极大提升了开发迭代速度。SLua正是为Unity量身打造的Lua绑定方案,它作为连接C#与Lua的桥梁,简化了集成流程。本文将以SLua为例,

weixin_30326741的博客 384

Unity开发者必备:Lua核心语法与热更新实战面试指南

在游戏开发领域,热更新是提升产品迭代效率和用户体验的关键技术,而Lua作为一门轻量级、高效的动态脚本语言,因其易于嵌入和灵活的特性,成为Unity等引擎实现热更新的主流选择。其核心原理在于通过虚拟栈和类型映射机制,实现与C#等宿主语言的高效交互,从而在不重新发布应用的情况下动态更新游戏逻辑。这项技术的核心价值在于大幅缩短更新周期,支持灵活的线上问题修复和内容投放。在Unity手游和MMO等应用场景中,开发者需要深入理解Lua的table、元表、闭包等核心概念,并掌握性能优化与内存管理,以构建稳定的热更新系统

weixin_33700350的博客 383

Unity热更新性能优化:Lua与C#交互原理与实战剖析

在游戏开发中,热更新技术是实现快速迭代和问题修复的关键能力,它允许开发者在无需用户重新下载完整安装包的情况下更新游戏内容。其核心原理是通过脚本语言与原生代码的交互机制,实现逻辑的动态加载与替换。这项技术的核心价值在于大幅缩短更新周期、提升运营灵活性,并降低用户流失率。在Unity引擎的生态中,Lua因其轻量级和热重载特性,成为实现热更新的主流脚本语言选择。然而,Lua与底层C#引擎的高效、安全交互是技术落地的难点,不当的调用设计会引发显著的性能开销,成为项目后期的性能瓶颈。本文聚焦于性能剖析与优化,深入拆解

weixin_30254435的博客 309

lua-events-mixin:为你的 Lua 对象添加事件能力(例如,事件调度监听器)

lua-events-mixin 为 Lua 对象添加事件功能(事件调度/侦听器) 该模块可以为您的任何对象添加事件功能。 它既可以用作 mixin 类,也可以通过“猴子修补”您的对象来使用。 它旨在与,并且也已作为 mixin 集成到中。 特征 添加事件监听器 移除事件监听器 事件 自定义事件 单元测试 例子 混合类 项目包含ObjectBase子类,它展示了如何将此模块用作具有多重继承的 mixin。 简而言之: -- import the events mixin module (adjust path for your project) local EventsMixModule = require ' dmc_lua.lua_events_mix ' -- create ref to mixin (optional) local EventsMix = EventsMi

unity2017热更新xLua 教程

unity2017热更新xLua 教程,有案例有教程,资源齐全仅供学习使用

【Unity/XLua】xlua自带教程示例分析(三)—— 使用C#为lua注入依赖,使用lua绑定UI事件

其通过self(即Button上的LuaBehavior组件),传入组件名称来获取自身的Button组件,并为onClick事件添加监听函数。函数内容中使用到了注入的input依赖,该input是一个GameObject,获取其身上的InputField组件中输入的text值并打印。在UI面板上创建一个Button和一个InputField,将LuaBehavior挂载到Button下。这个脚本中只有一个start函数,基于该C#类的功能,这个lua函数会和C#类一样,在Start时执行。

Siro_sama的博客 804

WSL2迁移后用户名不见了?一招教你快速恢复Ubuntu22.04默认用户

本文针对WSL2迁移后Ubuntu 22.04默认用户名丢失的常见问题,提供了详细的诊断与修复方案。通过分析迁移底层逻辑,指导用户使用`ubuntu2204.exe config --default-user`命令或配置`/etc/wsl.conf`文件快速恢复用户身份,并涵盖权限修复、冲突解决及自动化迁移脚本等进阶内容,确保子系统迁移后环境完整可用。

web39explorer的博客 558

Unity开发IDE选择:Visual Studio与Rider在C#与Lua混合调试中的深度对比

在游戏开发领域,集成开发环境(IDE)是提升编码效率与调试体验的核心工具。其工作原理在于通过语法分析、智能提示、编译集成和调试器连接,为开发者提供实时反馈与错误定位。对于采用Unity引擎的项目,特别是使用C#与Lua进行混合编程以实现热更新逻辑的团队,IDE的技术价值尤为凸显。它不仅能加速日常开发流程,更关键的是能无缝支持跨语言的断点调试与变量查看,直接决定了复杂问题的排查效率与项目的长期维护成本。应用场景广泛覆盖从大型手游到独立游戏的开发过程。本文聚焦于Visual Studio与JetBrains R

weixin_30706691的博客 382

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南)

本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。

weixin_28481133的博客 288

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+
上一篇: Unity编辑模式下找prefab内的标签
下一篇: 在lua里实现事件监听系统
Le_Sam
博客等级 码龄11年 342粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值