前两期主要对修改field做了初步介绍,但field的功能限制于它的数量
而这期介绍的method/方法可以实现的功能远比field强大的多
在思考一个东西怎么实现的时候,第一想法应该是找有没有现成的method可以使用,找到一个适合的method可以省下一堆事
至于method是什么,可以简单理解为函数
这里给常见的方法类型分个类,当然这个分类是完全不准的
主要是对常见的几种方法留个大概印象
call就是调用的意思
refbook里关于调用obj下面的method是这么写的
对于method,大致用法有三类:拿数据,直接调用,hook
如果你对第一期还有印象的话,应该记得有一个种可以类比指针的方法,就是get类,它一般指向一个特定的field
以上期的技能参数的field来说
我们是使用了get_field来拿到技能参数
对method进行检索
可以发现一个get_RefSkillParameter的方法
等等,名字都对不上啊,你怎么知道这个方法拿的东西是什么?
这时候你只需要看看方法左边的白字,这个就是它的拿到的那个类,这个类和field里的技能参数的类是一样的
所以我们调用这个方法也可以拿到技能参数
这里再给个小技巧,右键这个方法,点击copy name可以直接复制这个方法的名称(field不行)
因此对于拿到技能参数,也可以这么写,和那句get_field是完全等价的
括号可有可无
总结就是,对于一些我们想要的数据,并不一定能在field里找到,或者说一些时候通过field找不如method方便,此时方法是更优解
举个比较经典的例子
sdk.get_managed_singleton("snow.player.PlayerManager"):call("findMasterPlayer")
tip:manager经常被缩写为man,不要想当然认为是男人
就是这个你几乎会在所有mod里见到的findMasterPlayer
它指向的是本地玩家的PlayerBase,也就是玩家列表里index为0的那个
根据武器的不同这个也会相应变化,要找本地玩家的数据,call这个方法是最简单的
至于masterPlayer这个,后面单独开一期来讲,因为很实用
至于set型,如果你懂了get型是直接拿到一个类,那你也会懂set型就是直接对那个类进行操作
例如弓下面的这个方法,设置当前蓄力等级
使用的话,看好括号内的输入参数类型,他不是一般的Int或者float,所以我们去看看snow.player.Bow.ChargeLevel到底是个什么
到搜索框里搜索这个类名,可以发现它是Enum,也就是枚举类型,这意味着他只能取一些特定的值(还有种是位枚举,到时再开一期单独讲),并且这个值的输入类型是System.Int32(value__),可以看到四个蓄力等级Lv1到Lv4,取Lv4,它的值是3
所以要使用这个方法把蓄力等级设置为Lv4的话,这么写(为什么要知道它的取值范围呢,因为像一些数值超出范围,轻则报错重则闪退,平常需要多注意)
而像设置太刀气刃槽数值的话
他只需要输入一个System.Single(单精度浮点型),所以这里输入数值就随意(不过还是得注意,原本的气刃槽数值范围是0~100,至于超出了原本的上限会怎么样,我也不知道)