游戏达人
  
- 贡献度
- 80
- 金元
- 19062
- 积分
- 2236
- 精华
- 1
- 注册时间
- 2010-11-27
|
本帖最后由 yzzn2009 于 2013-12-24 06:05 编辑
授人以渔:开端
我们的修改技巧发展到今天,已经不单单只是修改,而是不断在加入一些创造性的内容,使饥荒世界不再是那个苦寒之地,逐渐演变成一片自由的乐土。我们可以生产销售产品,交女友,养孩子,建立海岛,空中巡逻,也可以创建小镇甚至变身为巨鹿,这都是用一行行枯燥的代码实现的,它就像乐高积木,每一片都平淡无奇,但组合在一起,却可以开创新的天地。几个月前,我对lua语言还一无所知,几个月后,却可以做出一些有趣的东西了。如果我可以,你也一定能做得到,更不要说还有这290余项的修改条目做你的案例。授人以鱼,不如授人以渔,相信许多人都是因为无从下手,才没有机会做出自己的作品的,今天讲一点修改的基础性问题,希望成为你走上创作之路的契机。
饥荒游戏中的功能,都是用命令调用function来实现的,例如行走手杖,文件是游戏目录\data\scripts\prefabs\cane.lua,以local function fn(Sim)语句为分水岭,上面为function,下面为命令,我详细解释一下每句的意思。
local assets= 声明调用的动画文件
{
Asset("ANIM", "anim/cane.zip"), 行走手杖动画
Asset("ANIM", "anim/swap_cane.zip"), 行走手杖装备动画
}
local function onfinished(inst) 名为onfinished的function,是在物品结束时起作用的,括号中的inst为声明的主语,在游戏中inst就是该物品自己
inst:Remove() 自己被删除
end 每一个function都必须用end结束,否则会报错。需要用end结束的还有if开头的语句等
local function onequip(inst, owner) 名为onequip的function,是在被装备时起作用的,括号中声明了inst(自己)、owner(所有者)两个主语
owner.AnimState:OverrideSymbol("swap_object", "swap_cane", "swap_cane") 所有者装备时的动画,其中swap_object是手部,swap_cane是行走手杖装备时的动画
owner.AnimState:Show("ARM_carry") 所有者显示携带物品的胳膊动画
owner.AnimState:Hide("ARM_normal") 所有者隐藏正常胳膊的动画
end 结束onequip这个function
local function onunequip(inst, owner) 名为onunequip的function,是脱下装备时起作用的,括号中声明了inst(自己)、owner(所有者)两个主语
owner.AnimState:Hide("ARM_carry") 所有者隐藏携带物品的胳膊动画
owner.AnimState:Show("ARM_normal") 所有者显示正常胳膊的动画
end 结束onunequip这个function
local function fn(Sim) 这是物品属性的function,上面那些function如果没有命令调用,就不会被执行。但fn这个function会在开始游戏时自动被执行
local inst = CreateEntity() 声明自己等于创建实体,这是基本格式,一般都修改都不会碰
local trans = inst.entity:AddTransform() 声明trans等于增加改变位置,也是基本格式
local anim = inst.entity:AddAnimState() 声明anim等于自己的实体加入的动画,也是基本格式
inst.entity:AddSoundEmitter() 自己的实体加入声音播放器,也是基本格式
MakeInventoryPhysics(inst) 制作库存物品的物理性,这是在别的文件中打包做好的一套物理性语句,用这句就可以全部插入了。这样整套的物理性还包括人物物理性、建筑物理性等
anim:SetBank("cane") 动画设置模型,cane为行走手杖,这里的anim在前面已经声明了,所以才可以用它做主语,如果没有声明,则需要写成inst.AnimState:SetBank("cane")
anim:SetBuild("cane") 动画设置贴图,cane为行走手杖
anim:PlayAnimation("idle") 动画设置播放idle(闲置)动画
inst:AddComponent("weapon") 自己添加物品标签,一些原本不是武器的物品,通过添加这个标签,就可以作武器用了,比如“犬牙手雷”,当然还要有下面的标签参数
inst.components.weapon:SetDamage(TUNING.CANE_DAMAGE) 自己武器标签设置伤害值为游戏目录\data\scripts\tuning.lua文件中的CANE_DAMAGE(行走拐杖伤害值),具体是34*0.5=17
inst:AddComponent("inspectable") 自己添加查看标签,inspectable(查看)标签几乎是所有物品都有的,所以修改技巧中许多新增的代码就都插在这句下面
inst:AddComponent("inventoryitem") 自己添加库存标签,有这句才能将行走手杖放进物品栏和背包中
inst:AddComponent("equippable") 自己添加可装备标签
inst.components.equippable:SetOnEquip( onequip ) 自己可装备标签设置在装备时调用的function为onequip,有这句,名为onequip的function才会起作用
inst.components.equippable:SetOnUnequip( onunequip ) 自己可装备标签设置在脱下装备时调用的function为onunequip,有这句,名为onunequip的function才会起作用
inst.components.equippable.walkspeedmult = TUNING.CANE_SPEED_MULT 自己可装备标签行走速度倍数,为游戏目录\data\scripts\tuning.lua文件中的CANE_SPEED_MULT(行走手杖速度倍数)具体为1.25倍
return inst 循环自己
end 结束fn这个function
return Prefab( "common/inventory/cane", fn, assets) 这句是任何物品都必不可少的,循环物品相关资源的路径,一般不会动到
以上就是饥荒游戏中一个典型物品的文件,首先了解了它的组成内容,才可以按自己想要的方式修改(插一句,行走手杖的代码中,名为onfinished的function因为没有命令调用,所以不会起作用,这是官方制作组留下的垃圾语句,像这样的垃圾在许多物品文件中都比比皆是,让那些以为官方做出来的东西就是最好的、修改不重要的人失望了)。我们可以修改标签参数中的数值,比如将inst.components.equippable.walkspeedmult = TUNING.CANE_SPEED_MULT替换为inst.components.equippable.walkspeedmult = TUNING.CANE_SPEED_MULT*2,就是将装备行走手杖的行走速度增加1倍;可以添加新的标签来扩展该物品功能,比如在inst:AddComponent("inspectable")的下一行插入inst:AddComponent("blinkstaff"),就可以让行走拐杖拥有鼠标右键点地实现瞬移的功能;还可以自己写function及命令,让行走手杖拥有更加强大的能力
好了,如果你耐心看完了,相信游戏的代码开始对你不再那么神秘了,当然,一旦入门你会产生更多的疑问,那就去钻研、去探索、去追寻(请不要问我,实在没有时间),将修改技巧中的条目和原文件做对比,最终你会得到满意的答案。抓住这个契机,从此刻开始,未来是属于你的
|
|