搜索
热搜: 活动 交友 discuz
查看: 3762|回复: 3

[教程] 如何让你的Lua ability和modifier支持继承

[复制链接]

55

主题

356

帖子

3937

积分

大摸导师

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UID
12
金币
3929
精华
4
节操
-233

黑科技玩的6扛把子我是鸽手隐修议员教程大师创世者开拓者幸运儿!

发表于 2016-4-13 21:25:30 | 显示全部楼层 |阅读模式

前方高能预警!非战斗人员请尽快登录!

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

x
本帖最后由 Xavier 于 2016-4-13 21:56 编辑

Lua ability和Lua Modifier是个很好用的东西,但是就是不支持继承,本来V社支持了class之后,每次创建一个新的类似的modifier就需要重写代码真是让人很不爽,而且使用

newClass = class({},nil,baseClass)

貌似没有效果

经过一番研究(好吧,其实是因为写错了东西发现了报错,了解了V社究竟是怎么实现Lua Modifier的,同时发现了V社的代码为何会不支持继承),最终了解了如何使Lua ability和modifier支持继承。

首先,先看这个关键的函数:
这个函数在 game/core/scripts/vscripts/init.lua

function ExtendInstance( instance, luaClass )
     instance.BaseClass = getmetatable( instance ).__index
     setmetatable( luaClass, getmetatable( instance ) )
     setmetatable( instance, { __index = luaClass } )
     return instance
end


这个函数的作用是,使一个c++的lua ability或者lua modifier的实例(instance)继承一个lua类(luaClass)。
之后将这个luaClass的metatable指向instance的metatable,也就是CDOTA_Modifier_Lua这个C++类。
(关于这点可以打印一个LuaModifier的BaseClass域来查看 [instance.BaseClass = getmetatable( instance ).__index] )

根据这个再加上LinkLuaModifier这个API,我们可以知道,LuaModifier的作用机制应该是这样的。
C++创建一个空的CDOTA_Modifier_Lua的实例 -> 根据LinkLuaModifier指定的modifier名称对应的lua文件路径,去那个文件路径查找对应的luaClass->使用这个ExtendInstance函数来将这个instance的__index指向luaClass

所以为了支持lua ability的继承,我们需要重写这个ExtendInstance函数:

我的写法是这样的:

function ExtendInstance(instance, luaClass)
    instance.BaseClass = getmetatable( instance ).__index
    local base_class = luaClass
    while base_class:__getbase__() do
            base_class = base_class:__getbase__()
    end
    setmetatable( base_class, getmetatable( instance ) )
    setmetatable( instance, { __index = luaClass } )
    return instance
end
根据我的测试,在你的addon_game_mode.lua里面直接写这个函数是毫无作用的。应该是在过了init.lua之后,这个函数就已经被引擎载入,重写也就没用了。
不过幸好,我们可以把整个init.lua复制到你的vscripts文件夹中去。
你再打开你自己的RPG中的init.lua,修改掉这个函数,之后就OK了。



回复

使用道具 举报

54

主题

539

帖子

3414

积分

魔导师

UID
2370
金币
3418
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

发表于 2019-6-9 17:44:00 | 显示全部楼层
好贴 我顶!
回复

使用道具 举报

54

主题

539

帖子

3414

积分

魔导师

UID
2370
金币
3418
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

发表于 2019-6-9 17:44:36 | 显示全部楼层
这init.lua是在哪发现的……
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

Lv:1 隐谧贤者

UID
14609
金币
22
精华
0
节操
0
发表于 2019-6-28 12:36:25 | 显示全部楼层

(

本帖最后由 Alacrity 于 2019-6-28 12:46 编辑

你可以试试
child_class = class({base_class})


抱歉中国人不好。 我不知道我是如何通过注册表格的。(验证码 : 输入下图中的字符 =,=)
这是谷歌翻译:)
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|AMHC!dota2rpg~ ( 闽ICP备14009209  

GMT+8, 2019-7-23 10:35 , Processed in 0.155720 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc. Theme.Yeei

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