Unity3D开发小贴士(七)Lua里扩展C#对象
来源:互联网 发布:php 两个日期相差天数 编辑:程序博客网 时间:2024/04/28 16:57
Unity3D开发小贴士(六)Lua里调用C#扩展里介绍了如何在Lua里调用C#扩展,但是如果不希望使用C#的扩展,而是希望使用Lua扩展C#对象,那么就得使用到tolua.setpeer。
这个方法的第一个参数为userdata,第二个参数为table。
示例:
local function ExtendGameObject(go) local tbl = {} tolua.setpeer(go,tbl) tbl.__index = tbl local get = tolua.initget(tbl) local set = tolua.initset(tbl) local _base = go.base local _name = go.name --重写同名属性获取 get.name = function(self) return _base.name end --重写同名属性设置 set.name = function(self, v) if _name ~= v then _name = v _base.name = v end end function tbl:AddComponentIfNil(t) if nil == _base:GetComponent(t) then _base:AddComponent(t) end endend
tolua.initget和tolua.initset是初始化tbl的属性(property)访问器。
例如:
local go = UnityEngine.GameObject.New("ext")ExtendGameObject(go)go.name = "extended in lua"print(go.name)访问和设置name的时候就会调用到get.name和set.name。
我们还可以修改GameObject的同名方法,例如我们可以讲上面的AddComponentIfNil修改为AddComponent。
一般情况下,我们为一个对象添加两个Rigidbody时:
go:AddComponentIfNil(typeof(UnityEngine.Rigidbody))go:AddComponentIfNil(typeof(UnityEngine.Rigidbody))
会提示:
Can't add component 'Rigidbody' to extended in lua because such a component is already added to the game object!
但是扩展后,就只会对没有Rigidbody的对象添加Rigidbody了。
当然,这是不是一种科学的办法,因为会有一些组件可以在对象上添加多次,所以最好将这个方法独立出来,使用AddComponentIfNil这样的方法名。
在没有扩展之前,当我们访问或设置userdata不存在的成员的时候,程序就会出错,但是在扩展之后,我们便可以扩展对象的成员。
例如:
go.luaName = "test ext"print(go.luaName)
(相关原理,我们有机会再聊。)
0 0
- Unity3D开发小贴士(七)Lua里扩展C#对象
- Unity3D开发小贴士(六)Lua里调用C#扩展
- Unity3D开发小贴士(五)Lua调用C#
- es6对象扩展(七)
- Unity3D开发小贴士(三)愉快的使用Lua开发
- Unity3D开发小贴士(四)调用Lua脚本
- Unity3D-C#扩展方法
- Unity3d 开发(七)AssetBundle组织目录
- Unity3D开发七惑
- Unity3D开发七惑
- Unity3D开发七惑
- Unity3D开发七惑
- unity3d 使用c#如何访问某个对象里的c#脚本里的一个变量
- Unity3d C#脚本学习小结(七)[OnTriggerEnter的使用方法]
- [C++/Lua]开发Lua功能扩展DLL
- Lua游戏开发(二)---cocos2d VS libgdx VS unity3d
- Lua语法小贴士(七)错误处理
- ulua里如何将C#创建的UnityEngine对象返回给lua
- 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配
- 【数据结构与算法】计数排序
- VR系列——Oculus Audio sdk文档:二、Oculus音频SDK指南(1~2)——SDK内容和特点及要求
- GDAL学习笔记——OGR投影(一)
- 使用MODI(Microsoft Office Document Imaging)识别中文,但无法区分段落
- Unity3D开发小贴士(七)Lua里扩展C#对象
- Java应用缓存介绍与LRU(Least Recently Used)算法
- Cookie的弊端
- 读书笔记(4) 数据库
- Python入门——列表
- 了解new_handler的行为 set_new_handler
- 分治算法----火柴排队----NOIP提高组原题
- 用递归方法实现行列式求值
- 用C#识别图像中的文字_MODI OCR