Unity中另类的使用Lua的一种方式
2017-08-02 12:05
459 查看
自定义的Unity中Lua粘合(基于Tolua#)
为了适应很多组里的程序不习惯写lua,而且习惯了挂组件。。。开发了这套工具。Lua的组件很像C#的behavior了。性能不是很优秀,但是易上手,适合快速开发很小的项目。想要源代码的可以加我QQ。下面只是贴出具体的使用和功能。基础功能
扩展功能
基础功能
Lua组件脚本的创建
在对应需要创建的文件夹下右键菜单创建文件,点击后输入文件名,会在文件中自动创建对应名称类(类似C#中的组件类)创建后的类文件如下图,如非必要,请勿修改基础代码。
--游戏lua组件模版 Editor中通过Luacomponent挂载 --[====[ *******添加序列化内容 请勿删除******** ******************************************]====] print("Example") Example = class("Example",LuaBehaviour) function Example:ctor() Example.super.ctor(self) self.name = "Example" end function Example:Awake() end function Example:Start() end function Example:Update() end return Example
Lua组件脚本的挂载
如果需要将一个lua文件挂载到对象上请先挂在C#组件 LuaComponent,如图所示黑色区域显示红字,代表当前组件尚未挂载lua组件类。此时必须拖动创建好的lua类文件到黑色框内。黑色区域显示青色类名,则代表已经绑定了Lua组件类。
Lua组件脚本绑定序列化属性
手动添加绑定:点击上图中六个添加按钮分别可以添加不同属性注意事项:
值类型包括
int,
float,
string,
bool四种。
对象类型可以拖入
Gameobject,或材质贴图等
UnityEngine.Object类型对象
集合类型可以使用
Vector4,
Vector3,
Vector2,
Color,
Quaternion五种类型
每个类型的第一个输入框为属性名称,如其中
valueInt可以在lua类中直接通过
self.valueInt来访问
数组类型在lua中都是索引从1开始的lua的数组,如
#self.arr_object=3
点击全部清除可以删除所有
如果挂载的是
Gameobject,可以从下拉菜单中选择挂载对象所挂载的其他组件如
Transform或
MeshRender等,包括Lua组件。其中lua组件可以精确到哪一个lua类的组件。如果是C#组件,在Lua中获取到的是C#对象。如果是Lua组件,获取到的是Lua组件挂载的Lua类对象(通常是一个Table),可以直接访问其中的属性,调用其中的方法。
通过Lua中的定义来生成:点击黑色框旁边的打开按钮,打开lua类文件。在注释中加入下面代码,然后点击加载lua定义属性按钮,之后可以看到自动加载了对应的绑定。 强烈推荐使用这种方式绑定。
--游戏lua组件模版 Editor中通过Luacomponent挂载 --[====[ *******添加序列化内容 请勿删除******** Serialize<Object>(a) Serialize<Boolean>(b,false) Serialize<Number>(c,0) Serialize<String>(c,0) Serialize<Vector4>(d) ******************************************]====]
支持的绑定代码如下表所示
示例代码 | 对应类型 | 默认参数 |
---|---|---|
Serialize<Boolean>(a,false) | bool | true |
Serialize<Number>(a,0) | float | true |
Serialize<String>(a,test) | string | true |
Serialize<Object>(a) | Object(具体根据选择决定) | false |
Serialize<Vector4>(a) | Vector4 | false |
Serialize<Vector3>(a) | Vector3 | false |
Serialize<Vector2>(a) | Vector2 | false |
Serialize<Quaternion>(a) | Quaternion | false |
Serialize<Color>(a) | Color | false |
Serialize<Boolean[]>(a,{1,2,3}) | bool[] | true |
Serialize<Number[]>(a,{true,false}) | float[] | true |
Serialize<String[]>(a,{aaa,bbb}) | string[] | true |
Serialize<Object[]>(a) | Object[](具体根据选择决定) | false |
Serialize<Vector4[]>(a) | Vector4[] | false |
Serialize<Vector3[]>(a) | Vector3[] | false |
Serialize<Vector2[]>(a) | Vector2[] | false |
Serialize<Quaternion[]>(a) | Quaternion[] | false |
Serialize<Color[]>(a) | Color[] | false |
扩展功能
宏定义
示例代码if UNITY_EDITOR then print("test") end
示例代码 | 对应类型 | 默认参数 |
---|---|---|
UNITY_EDITOR | 编辑器模式 | |
DEBUG | DEBUG模式 | |
UNITY_IOS | IOS平台 | |
UNITY_ANDROID | 安卓平台 |
协程的使用
注意使用self:StartCoroutine和
self:StopCoroutine会随着对象的销毁自动停止,全局的则不能
co = self:StartCoroutine(function() print("aaa") WaitForSeconds(3) print("bbb") WaitForFixedUpdate() print("ccc") WaitForEndOfFrame() print("ddd") Yield(0) print("eee") end) self:StopCoroutine(co)
AnimationEvent响应
在具有animtion的gameobject下挂载一个lua脚本,打开animtion面板,增加事件,在面板中Function选择LuaAniEvent,参数填入一个json字符串
{"type":"EventCanGotoStory","param":0}其中
其中
type字段为触发的lua中的方法名称。
其中
param字段为触发时传给lua方法的参数。
在绑定的lua中添加下面方法,会在动画播放到关键帧时触发,不填则不触发
function Example:EventCanGotoStory(param) print(param) end
LuaStateMachine
LuaBehavoir支持扩展组件,
PTLua.Globel.StateMachine为状态机的扩展,调用过
self:addExtendComponent("PTLua.Globel.StateMachine"):exportMethods()后自身将会具有状态机功能
self:addExtendComponent("PTLua.Globel.StateMachine"):exportMethods() self:setupState({ initial = PageFiremanMain.States.Idle, events = { {name = PageFiremanMain.StateEvents.PlayMovie, from = PageFiremanMain.States.Idle, to = PageFiremanMain.States.Enter}, {name = PageFiremanMain.StateEvents.StartGame, from = PageFiremanMain.States.Enter, to = PageFiremanMain.States.PlayIdle}, {name = PageFiremanMain.StateEvents.PigJump, from = PageFiremanMain.States.PlayIdle, to = PageFiremanMain.States.PlayJump}, {name = PageFiremanMain.StateEvents.PigJumpFinish, from = PageFiremanMain.States.PlayJump, to = PageFiremanMain.States.PlayIdle}, {name = PageFiremanMain.StateEvents.PlayEndMovie, from = PageFiremanMain.States.PlayIdle, to = PageFiremanMain.States.Exit}, {name = PageFiremanMain.StateEvents.ShowResult, from = PageFiremanMain.States.Exit, to = PageFiremanMain.States.Result}, {name = PageFiremanMain.StateEvents.ResetGame, from = PageFiremanMain.States.Result, to = PageFiremanMain.States.Idle}, }, callbacks = { onIdle = handler(self, self.onIdle), onEnter = handler(self, self.onEnter), onPlayIdle = handler(self, self.onPlay), onPlayJump = handler(self, self.onPigJump), onExit = handler(self, self.onExit), onResult = handler(self, self.onResult), } })
AnimatorStateMachine
C#中原生支持在Animtor的动画状态机中对不同状态挂载脚本。如果需要触发Lua脚本,则要不同的使用方式。在状态机中挂载
LuaAnimatorStateMachineComponent这个C#组件。
在挂载使用该AnimtionController的Animtor的gameobject下挂载LuaComponent脚本
修改LuaComponent挂载的lua脚本,调用
self:addExtendComponent("PTLua.Globel.AnimatorStateMachine"):exportMethods()扩展组件,使其支持该功能。
如果挂载有多个不同的LuaComponent响应,可以对每个不同的State下的
LuaAnimatorStateMachineComponent黑色框内拖入对应的Lua类的文件。如果不拖入,那么该状态会影响所有挂载的扩展过的Lua脚本。
function Example:ctor() Example.super.ctor(self) self.name = "Example" self:addExtendComponent("PTLua.Globel.AnimatorStateMachine"):exportMethods() end function Example:OnStateEnter(animator,stateInfo,layerIndex) print("OnStateEnter") end function Example:OnStateUpdate(animator,stateInfo,layerIndex) print("OnStateUpdate") end function Example:OnStateExit(animator,stateInfo,layerIndex) print("OnStateExit") end function Example:OnStateMove(animator,stateInfo,layerIndex) print("OnStateMove") end functi 9ac2 on Example:OnStateIK(animator,stateInfo,layerIndex) print("OnStateIK") end
扩展事件调用
Unity的MonoBehavior中拥有一些扩展的方法触发,如触发器和应用触发。这些方法默认不打开支持,如果使用需要在扩展支持折叠框里的选项页中勾选(为了避免不必要的C#对Lua层的访问)对应的支持,并在lua中添加对应C#的同名方法。支持和方法对照表如下:示例代码 | 对应支持选项 | |
---|---|---|
OnTriggerEnter(collider) | Trigger | |
OnTriggerExit(collider) | Trigger | |
OnTriggerStay(collider) | Trigger | |
OnCollisionEnter(collisionInfo) | Collision | |
OnCollisionExit(collisionInfo) | Collision | |
OnCollisionStay(collisionInfo) | Collision | |
OnApplicationPause(pauseStatus) | Application | |
OnApplicationFocus(hasFocus) | Application | |
OnApplicationQuit() | Application |
相关文章推荐
- unity animator的一种使用方式
- [Unity热更新]tolua# & LuaFramework(七):lua使用DOTween
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- Unity协程(Coroutine)使用时需要注意的地方,协程异常中断,异常停止执行的一种可能性
- cocos-lua 定时器使用的2种方式
- 部分告别Qt调试,另类使用显示Qt程序中函数加载顺序的方式
- 一种奇怪的使用debug方式,写到最后觉得后果很可怕[bsnhk原创]
- 【Unity】如何使用MD5加密方式传递资料
- CString对象的一种错误的使用方式
- 使用类成员函数指针调用C++成员函数的一种方式
- 使用EF来进行查询的一种方式
- Unity用Lua开发的 使用度 问题
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
- 一种生成Word报表的另类方式
- Unity中XLua开发之使用C#加载lua脚本
- 在使用spring构建项目中,将db配置与程序jar包分离的一种方式
- R.swift:以一种优雅安全的方式使用资源文件
- 使用javascript用一种非主流的方式提交POST表单
- Unity使用NetworkView无法连接的一种解决方法
- 续 一种生成报表的另类方式--Excel