开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1969

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3518|回复: 19

[碧俐千仞] Unity3D热更新LuaFramework入门实战(3) 编写Lua逻辑

[复制链接]  [移动端链接]
排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

发表于 2016-8-2 22:57:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 tyxxxx 于 2016-8-2 23:12 编辑

热更新LuaFramework入门实战
第三篇:编写Lua逻辑

        为实现代码热更新,在Unity3D中使用lua,然而为此也需付出不少代价。其一,使代码结构混乱(尽管可以优化),其二降低了运行速度,其三增加学习成本(还要多学一门语言)。为了热更新,所有的逻辑都要用lua编写,那么怎样用lua编写游戏逻辑呢?
        知乎@ 罗培羽

1LuaUpdate方法        

        第一篇“代码热更新”演示了用lua打印HelloWorld的方法,第二篇“资源热更新”演示了加载坦克模型的方法。这一篇要把两者结合起来,用lua实现“用键盘控制坦克移动”的功能。用Lua和用c#编写的Unity3D程序大同小异,只需正确使用API即可,Lua语言的知识请参见《programing in lua》这本书。
         
1Update方法
        出于效率的考虑,tolua提供了名为        UpdateBeat的对象,在LuaFramework中,只需给UpdateBeat添加回调函数,该函数便会每帧执行,相当于Monobehaviour的Update方法。Lua代码如下所示:
        function Main()                                                                                
            UpdateBeat:Add(Update, self)
        end
         
        function Update()
                        LuaFramework.Util.Log("每帧执行一次");
        end
         
        除了UpdateBeat,tolua还提供了LateUpdateBeatFixedUpdateBeat,对应于        Monobehaviour        中的LateUpdateFixedUpdate
         
2)控制坦克
        现在编写“用键盘控制坦克移动”的lua代码,加载坦克模型后,使用UpdateBeat注册每帧执行的        Update方法,然后在Update方法中调用UnityEngine.InputAPI实现功能        。代码如下:
        local go; --加载的坦克模型
         
        --主入口函数。从这里开始lua逻辑
        function Main()                                                                                
                        LuaHelper = LuaFramework.LuaHelper;
                        resMgr = LuaHelper.GetResManager();
                        resMgr:LoadPrefab('tank', { 'TankPrefab' }, OnLoadFinish);
        end
         
        --加载完成后的回调--
        function OnLoadFinish(objs)
                        go = UnityEngine.GameObject.Instantiate(objs[0]);
                        LuaFramework.Util.Log("LoadFinish");
               
                        UpdateBeat:Add(Update, self)
        end
         
        --每帧执行
        function Update()
                        LuaFramework.Util.Log("每帧执行");
               
                        local Input = UnityEngine.Input;
                        local horizontal = Input.GetAxis("Horizontal");
                        local verticla = Input.GetAxis("Vertical");
               
                        local x = go.transform.position.x + horizontal
                        local z = go.transform.position.z + verticla
                        go.transform.position = Vector3.New(x,0,z)
        end
         
        运行游戏,即可用键盘的控制坦克移动。
Unity3D热更新LuaFramework入门实战31534.png

        图:        用键盘的控制坦克移动
         
2、自定义API
        

        框架中提供了数十个可供lua调用的c#类,但这些往往不够用,需要自己添加,本节将介绍添加自定义API的方法。

1)编写c#
        例如,编写TestLuaFun.类,它包含一个静态方法Log,会打印出“《Unity3D网络游戏实战》是一本好书!”和“《手把手教你用c#制作rpg游戏》也是一本好书!”两行文本。
        using UnityEngine;
        using System.Collections;
         
        public class TestLuaFun
        {
                        public static void Log()
                        {
                                        Debug.Log("Unity3D网络游戏实战》是一本好书!");
                                        Debug.Log("《手把手教你用c#制作rpg游戏》也是一本好书!");
                        }
        }
         
         
2)修改CustomSetting
        打开CustomSetting.cs,在customTypeList中添加一句“_GT(typeof(TestLuaFun))”。
Unity3D热更新LuaFramework入门实战31985.png


        图:修改        CustomSetting

        3)生成wrap文件
点击菜单栏的LuaClear wrap filesLuaGenerate All,重新生成wrap文件。由于刚刚在customTypeList添加了        TestLuaFun类,所以会生成TestLuaFun类的wrap文件        TestLuaFunWrap.cs
Unity3D热更新LuaFramework入门实战32146.png


        图:生成        wrap文件
         
        打开TestLuaFunWrap.cs,可以看到TestLuaFun注册了Log方法。关于static int Log(IntPtr L)的具体含义,请参见《programing in lua》中luac++交互的章节。
Unity3D热更新LuaFramework入门实战32272.png


        图:        TestLuaFunWrap
         
4)测试API
        修改main.lua,调用TestLuaFun.Log() ,即可看到效果。
        --主入口函数。从这里开始lua逻辑
        function Main()                                                                                
                        TestLuaFun.Log()  
        end
         

         Unity3D热更新LuaFramework入门实战32405.png
        图:调用自定义API
         
3、原理
        

        tolua实现了LuaInterface,抛开luaFramework,只需创建lua虚拟机,便能在c#中调用lua代码,如下所示。
        using UnityEngine;
        using System.Collections;
        using LuaInterface;
         
        public class test : MonoBehaviour
        {
                        void Start ()
                        {
                                        //初始化
                                        LuaState lua = new LuaState();
                                        LuaBinder.Bind(lua);
                                        //lua代码
                                        string luaStr =
                                                        @"               
                        print('hello tolua#, 广告招租')
                                                                        LuaFramework.Util.Log('HelloWorld');
                                                                        TestLuaFun.Log() ";
                                        //执行lua脚本
                                        lua.DoString(luaStr);
                        }
        }
         

         Unity3D热更新LuaFramework入门实战32906.png
        图:创建lua虚拟机,执行lua代码
         
        实际上LuaFramework也是用了相似的方法,框架启动后,会创建LuaManager、LuaLooper的实例。LuaManager创建lua虚拟机并调用Main.luaMain方法,LuaLooper处理了        UpdateBeat相关的事情。        如下所示:
Unity3D热更新LuaFramework入门实战33057.png


        图:        LuaManager的启动过程
         
        笔者也是刚刚接触LuaFramework不久,文章错误之处在所难免,请大家多加包涵。最后是广告时间:
        《仙剑5前传之心愿》是笔者两年前发起的一款仙剑同人游戏,使用Unity3D制作,是市面上第一款能够完成的3D仙剑同人游戏。如今我们各自踏上游戏开发一途,似乎要做点什么以致敬国产经典之作,在追求商业成就的同时,勿忘初心。可以在www.pal5h.com下载该游戏。
Unity3D热更新LuaFramework入门实战33355.png

图:《仙剑5前传之心愿》截图



Unity3D热更新LuaFramework入门实战(1)——代码热更新
http://zhuanlan.zhihu.com/p/21386682

Unity3D热更新LuaFramework入门实战(2)——资源热更新

http://zhuanlan.zhihu.com/p/21442566

Unity3D热更新LuaFramework入门实战(3)——编写Lua逻辑
http://zhuanlan.zhihu.com/p/21543715




评分

参与人数 1鲜花 +20 收起 理由
仅为年时 + 20 赞一个!

查看全部评分


回复

使用道具 举报

2初来乍到
146/150
排名
9824
昨日变化
6

0

主题

41

帖子

146

积分

Rank: 2Rank: 2

UID
159968
好友
0
蛮牛币
577
威望
0
注册时间
2016-8-1
在线时间
23 小时
最后登录
2016-10-28
发表于 2016-8-2 23:01:29 | 显示全部楼层
初级学者可以看看,值得借鉴。

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1386/1500
排名
1383
昨日变化
2

7

主题

326

帖子

1386

积分

Rank: 6Rank: 6Rank: 6

UID
104110
好友
0
蛮牛币
306
威望
0
注册时间
2015-5-29
在线时间
337 小时
最后登录
2017-11-10
发表于 2016-8-3 09:02:27 | 显示全部楼层
热更新只有使用lua框架这一种方式吗?如果全部代码都要用lua编写,那unity对这种方式支持的好吗?
[发帖际遇]: eagle1098 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-8-4 18:48:35 | 显示全部楼层
eagle1098 发表于 2016-8-3 09:02
热更新只有使用lua框架这一种方式吗?如果全部代码都要用lua编写,那unity对这种方式支持的好吗? ...

现在热更新主要使用lua,至于框架完全可以自己实现,只是现在已经有一套了,如果没有太多的开发时间,拿来用一用也可以。

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1124/1500
排名
1467
昨日变化
6

5

主题

114

帖子

1124

积分

Rank: 6Rank: 6Rank: 6

UID
117845
好友
1
蛮牛币
1918
威望
0
注册时间
2015-8-13
在线时间
301 小时
最后登录
2017-11-22
发表于 2016-8-5 09:29:22 | 显示全部楼层
tyxxxx 发表于 2016-8-4 18:48
现在热更新主要使用lua,至于框架完全可以自己实现,只是现在已经有一套了,如果没有太多的开发时间,拿 ...

我们的热更新是使用的C#的反射,是不是有什么缺点啊,感觉用的人很少

回复 支持 反对

使用道具 举报

7日久生情
2802/5000
排名
189
昨日变化
1

6

主题

115

帖子

2802

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
27325
好友
4
蛮牛币
5994
威望
0
注册时间
2014-5-29
在线时间
907 小时
最后登录
2017-11-22
发表于 2016-8-5 11:16:35 | 显示全部楼层
一些常见的作弊软件可以直接改内存,用lua能防止吗?  unity有插件可以防止C#中的变量被修改,lua怎么办呢?
[发帖际遇]: linchenrr 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

0

主题

2

帖子

19

积分

Rank: 1

UID
159938
好友
0
蛮牛币
58
威望
0
注册时间
2016-8-1
在线时间
17 小时
最后登录
2016-9-20
发表于 2016-8-19 10:34:22 | 显示全部楼层
可以把您的文章分享吗~

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-8-22 21:31:37 | 显示全部楼层
一枚糖糖吖 发表于 2016-8-19 10:34
可以把您的文章分享吗~

可以的,注明来源就好

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-8-22 21:32:48 | 显示全部楼层
linchenrr 发表于 2016-8-5 11:16
一些常见的作弊软件可以直接改内存,用lua能防止吗?  unity有插件可以防止C#中的变量被修改,lua怎么办呢 ...

没什么太好的办法,毕竟是运行在别人的机器上的,要防止修改就做成CS结构了

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-8-22 21:33:30 | 显示全部楼层
一如既往〃 发表于 2016-8-5 09:29
我们的热更新是使用的C#的反射,是不是有什么缺点啊,感觉用的人很少

IOS中无法使用反射热更新,只能在安卓中使用。

回复 支持 反对

使用道具 举报

排名
21083
昨日变化
45

0

主题

22

帖子

61

积分

Rank: 2Rank: 2

UID
131120
好友
0
蛮牛币
100
威望
0
注册时间
2015-12-7
在线时间
24 小时
最后登录
2017-8-3
发表于 2016-8-30 16:20:50 | 显示全部楼层
uLua和Lua区别是什么

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-9-17 00:09:45 | 显示全部楼层
杨杰旺 发表于 2016-8-30 16:20
uLua和Lua区别是什么

lua是一门语言,ulua是将lua应用于unity3d的插件

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-9-17 00:09:49 | 显示全部楼层
杨杰旺 发表于 2016-8-30 16:20
uLua和Lua区别是什么

lua是一门语言,ulua是将lua应用于unity3d的插件

回复 支持 反对

使用道具 举报

排名
21083
昨日变化
45

0

主题

22

帖子

61

积分

Rank: 2Rank: 2

UID
131120
好友
0
蛮牛币
100
威望
0
注册时间
2015-12-7
在线时间
24 小时
最后登录
2017-8-3
发表于 2016-9-23 17:45:52 | 显示全部楼层
tyxxxx 发表于 2016-9-17 00:09
lua是一门语言,ulua是将lua应用于unity3d的插件

谢谢!现在好像有的公司全部逻辑都LUA写

回复 支持 反对

使用道具 举报

排名
17698
昨日变化
37

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-9-27 10:23:41 | 显示全部楼层
杨杰旺 发表于 2016-9-23 17:45
谢谢!现在好像有的公司全部逻辑都LUA写

很多公司这样

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表