Unity3D开发小贴士(七)Lua里扩展C#对象
2016-11-11 23:08
513 查看
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
end
end
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)
(相关原理,我们有机会再聊。)
相关文章推荐
- Unity3D开发小贴士(六)Lua里调用C#扩展
- Unity3D开发小贴士(四)调用Lua脚本
- Unity3D开发小贴士(三)愉快的使用Lua开发
- Unity3D开发小贴士(五)Lua调用C#
- Unity3D开发小贴士(十一)ToLua协同程序
- Unity3D开发小贴士(八)tolua库
- 学习经验谈:Unity3d开发中最佳语言还是C#
- Rational Functional Tester Proxy SDK 开发,第 2 部分: 使用 Proxy SDK 扩展 RFT 已支持 Java GUI 组件 Proxy 对象实现
- Unity3D与VS2008结合,加快Unity3D C#开发!
- C# 3.0新特性之Automatic Properties(自动属性)、Object Initializers(对象初始化器)、Collection Initializers(集合初始化器)和Extension Methods(扩展方法)
- C#特性 学习笔记(对象初始化器 匿名类型 扩展方法)
- ASP.NET (C#开发环境)Request对象 之 Browser对象
- 全球软件开发语言排行榜 2010年6月 (Lua强劲上升,C#首次进入第4名逼近C++)
- 复习:C#3.0面向对象测试开发包
- PHP内核介绍及扩展开发指南—类和对象
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏
- Rational Functional Tester Proxy SDK 开发,第 4 部分: 使用 Proxy SDK 新建 Proxy 对象扩展 Windows 组件 Proxy 对象
- 自定义控件:使用智能设备扩展在 C# 中开发自定义控件
- Visual C# 2008+SQL Server 2005 数据库与网络开发――3.2.2 对象初始值设定项
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十五)制作精美的可任意拖放对象的物品栏及装备栏