在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
发布时间:2020-12-14 22:01:37 所属栏目:大数据 来源:网络整理
导读:前言:为什么要用Lua 首先要说,所有编程语言里面,我最喜欢的还是C#,VisualStudio+C#,只能说太舒服了。所以说,为什么非要在Unity里面用Lua呢?可能主要是闲的蛋疼。。。。。另外还有一些次要原因: 方便做功能的热更新; Lua语言的深度和广度都不大,易
前言:为什么要用Lua
首先要说,所有编程语言里面,我最喜欢的还是C#,VisualStudio+C#,只能说太舒服了。所以说,为什么非要在Unity里面用Lua呢?可能主要是闲的蛋疼。。。。。另外还有一些次要原因:
C#与Lua互相调用的方案
坦白来将,我并没有对现在C#与Lua互相调用的所有库进行一个仔细的调研,大概搜了一下,找到这样几个:
以上这些方案的具体内容,不是本文的重点,这里就不说了,感兴趣的同学,点开自己去看就行了。
最后我选用了uLua,主要原因是:uLua方案比较成熟,它并没有太多自己的代码,主要是把LuaInterface和Lua解释器整合了一下,都是比较成熟的代码,相对会稳定一些。另外,个人很欣赏LuaInterface这个库。接下来我们就看一下uLua。:)
uLua的基本使用
uLua插件的使用非常简单,基本上看一下他自带的几个例子就明白了。
游戏逻辑粘合层设计
uLua插件解决了语言层面的问题:C#与LUA两种语言代码互相调用,以及参数传递等相关的一系列底层问题。而我们游戏逻辑开发中,到底如何使用LUA是上层的一个问题。下面给出我摸索的一个方案,个人认为:够简单,够清晰,是很薄很薄的一层,不可能更薄了。
使用几个LuaState?曾经看过一个网友的方案,每次运行脚本就new一个LuaState,个人认为这种方案十分不妥。整个游戏的Lua代码应该运行在一个LuaState之上,原因有二:
实现LuaComponent首先说一下我的目标:
using UnityEngine; using System.Collections; using LuaInterface; /// 这段代码非常简单,实现以下几个功能点:
LUA代码约定为了很好的和LuaComponent协作,Lua脚本需要遵循一些约定:
例如:
require "EngineMain" local demoComponent = {} function demoComponent:Awake( gameObject ) Debug.Log(gameObject.name.."Awake") end return demoComponentLuaComponent回调函数中,主动将GameObject对象作为参数传递给Lua层,以方便其进行相应的处理。 Lua组件之间的互相调用(在Lua代码中)基于以上结构,就很容易实现Lua组件之间的互相调用。在Demo工程中,有一个“Sphere”对象,绑定了如下脚本: require "EngineMain" local sphereComponent = {} sphereComponent.text = "Hello World" function sphereComponent:Awake( gameObject ) Debug.Log(gameObject.name.."Awake") end return sphereComponent还有另外一个“Cube”对象,绑定了如下脚本,用来演示调用上面这个Lua组件的成员: require "EngineMain" local demoComponent = {} function demoComponent:Awake( gameObject ) Debug.Log(gameObject.name.."Awake") end function demoComponent:Start( gameObject ) Debug.Log(gameObject.name.."Start") --演示LuaComponent代码互相调用 local sphereGO = GameObject.Find("Sphere") local sphereLuaComp = LuaComponent.GetLuaComponent(sphereGO) Debug.log("Sphere.LuaDemoB:"..sphereLuaComp.text) end return demoComponent 完整版DEMO下载地址: 百度网盘链接: http://pan.baidu.com/s/1nt1eGPV 密码: 3g7b
最后,顺带总结一下:在设计上次游戏逻辑框架时,比较好的思路是:在透彻的理解Unity自身架构的前提下,在其架构下进行下一层设计,而不是想一种新的框架。因为Unity本身就是一个框架。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |