slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法:

  1. public class LuaBehaviour : Base {
  2. private string data = null;
  3. private AssetBundle bundle = null;
  4. private Dictionary<string, LuaFunction> buttons = new Dictionary<string, LuaFunction>();
  5.  
  6. protected void Awake() {
  7. Util.CallMethod(name, "Awake", gameObject);
  8. }
  9.  
  10. protected void Start() {
  11. Util.CallMethod(name, "Start");
  12. }
  13.  
  14. protected void OnClick() {
  15. Util.CallMethod(name, "OnClick");
  16. }
  17.  
  18. protected void OnClickEvent(GameObject go) {
  19. Util.CallMethod(name, "OnClick", go);
  20. }
    }

所以我琢磨了一下,在slua框架下用下面脚本来完成绑定:

  1. using UnityEngine;
  2. using System.Collections;
  3. using SLua;
  4.  
  5. public class LuaMonoBehavior : MonoBehaviour {
  6. public string V_LuaFilePath;
  7.  
  8. LuaTable self;
  9.  
  10. [CustomLuaClass]
  11. public delegate void UpdateDelegate(object self);
  12.  
  13. UpdateDelegate ud;
  14. UpdateDelegate enabled;
  15. UpdateDelegate disabled;
  16. UpdateDelegate destroyd;
  17.  
  18. // Use this for initialization
  19. void Start () {
  20. LuaState.main.doFile(V_LuaFilePath);
  21. self = (LuaTable)LuaState.main.run("main");
  22. var update = (LuaFunction)self["update"];
  23. var destroy = (LuaFunction)self["destroy"];
  24. var enablef = (LuaFunction)self["enable"];
  25. var disablef = (LuaFunction)self["disable"];
  26. if (update != null) ud = update.cast<UpdateDelegate>();
  27. if (destroy != null) destroyd = destroy.cast<UpdateDelegate>();
  28. if (enablef != null) enabled = enablef.cast<UpdateDelegate>();
  29. if (disablef != null) disabled = disablef.cast<UpdateDelegate>();
  30. }
  31.  
  32. void OnEnable()
  33. {
  34. if (enabled != null) enabled(self);
  35. }
  36.  
  37. void OnDiable()
  38. {
  39. if (disabled != null) disabled(self);
  40. }
  41.  
  42. // Update is called once per frame
  43. void Update () {
  44. if (ud != null) ud(self);
  45. }
  46.  
  47. void OnDestroy()
  48. {
  49. if (destroyd != null) destroyd(self);
  50. }
  51. }

对一个新预制,我们只需要挂上LuaMonoBehavior脚本并加上对应Lua文件路径即可,然后就在你的lua文件里控制逻辑了,这对热更新非常友好。

slua中,绑定lua文件到Monobehavior的一种方法的更多相关文章

  1. SLua 中使用 Lua 5.3 的编译工程

    2016-03-05 更新: 之前编译的库,在 Android 下 Lua_Number 和 Lua_Integer 被编译为了32位,导致从 C# 到 Lua 过程中有64位到32位整型转换会出现溢 ...

  2. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  3. linux中删除文件内空白行的几种方法。

    linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...

  4. PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...

  5. Mac 中显示资源库(Library)文件夹目录的几种方法

    Mac中Library目录在10.6.7系统之后默认隐藏的,要想找到此文件夹有如下几种方法:   1. 用命令可以使其显示: 在终端中执行命令: chflags nohidden ~/Library ...

  6. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  7. 页面中如何引用外部的HTML(四种方法)

    页面中如何引用外部的HTML(四种方法) 一.总结 一句话总结:a.iframe标签        b.ajax引入代码片段        c.link import的方法导入        d.re ...

  8. JSON文件加注释的7种方法

    JSON文件加注释的7种方法 缺省不能加注释,现实有需求 根据JSON规范(http://www.json.org, RFC 4627, RFC 7159),不支持注释.JSON规范之所以不允许加注释 ...

  9. 【转】oracle 中随机取一条记录的两种方法

    oracle 中随机取一条记录的两种方法 V_COUNT INT:=0; V_NUM INT :=0; 1:TBL_MYTABLE 表中要有一个值连续且唯一的列FID BEGIN SELECT COU ...

随机推荐

  1. 【JZOJ4725】质数序列 题解(数学)

    题目大意:质数序列是指这个序列中任意两个数的和均为质数.先给出一个序列${a_{n}}$,从中取出元素构成最长质数序列,问其长度并输出序列.若长度相同则求和最大的序列.保证答案唯一. -------- ...

  2. windows下Nginx+RTMP部署

    在windows下部署参考博客:https://blog.csdn.net/l1028386804/article/details/80022437 参考这个部署完成后,一般没有什么问题,可以看到视频 ...

  3. 面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在面经手册的前两篇介绍了<面试官都问我啥>和<认知自己的技术栈盲区 ...

  4. 家庭记账本APP开发准备(二)

    今天学习了选项卡,为记账本的分类做了准备.主登录界面进行了优化,但仍未实现各个组件之间的跳转. 选项卡 activity_main.xml <?xml version="1.0&quo ...

  5. SCOI2020迷惑记

    睡了个好觉还是很困但没咋吃饭就出门了. 到了之后随便跟认得到的人扯了两句就进去了. 结果让我们站在外面等... 然后通知说不能自带水和吃的那我这个中午没吃饭的咋整啊. 马上啃了半块巧克力就进了考场,然 ...

  6. FSAF

    Feature Selective Anchor-Free Module for Single-Shot Object Detection https://zhuanlan.zhihu.com/p/5 ...

  7. java List接口一

    一 List接口概述 查阅API,看List的介绍.有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的 插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置) ...

  8. Linux下gcc/g++中-I(i的大写)、-L和-l

    -I(i的大写)include头文件非标准库中存在的也不是在当前文件夹下的,需要将地址用-i(大写)包含例:-I /home/src/-L用到的函数或操作非标准库下的,需要将库存在的地址用-L包含,库 ...

  9. 2020-05-31:假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

    福哥答案2020-05-31: 使用keys指令可以扫出指定模式的key列表.对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?这个时候你要回答redis关键的 ...

  10. JavaScript Object初始化的不同方式

    不带原型的对象,纯对象 const plaintObject = Object.create(null) 带原型的对象 const originObject = new Object()