Jump to content
模组网
icedream

有些脚本,不需要GameMode

Recommended Posts

本文转自《有些脚本,不需要GameMode》,原作者为
众所周知,对于武器和装备脚本,通常有onEquip,onUnEquip和GameMode等不同部分。它们之间有一些区别。
onEquip是定义装备状态,即可以定义装备后会发生什么变化,或者造成什么影响,onEquip脚本效果在装备后运行一次。在脚本中以begin onEquip开头,以end结尾。当然onEquip不是必须的。

onUnEquip是定义卸下装备的状态,即可以定义装备卸下后会发生什么变化,或者造成什么影响,onUnEquip脚本效果在卸下装备后运行一次。在脚本中以begin onUnEquip开头,以end结尾。onUnEquip也不是必须的。

GameMode是定义在游戏中的状态,即可以定义在游戏过程中会发生什么变化,或者造成什么影响。在脚本中以begin GameMode开头,以end结尾。GameMode脚本的运行次数可以定义一个浮点数fQuestDelayTime,然后在GameMode中设定该数的值,单位为秒,它即定义了GameMode脚本每多长时间运行一次,例如在GameMode脚本中给出 set fQuestDelayTime to 60,则表示每60秒GameMode脚本运行一次。若不定义fQuestDelayTime,则默认GameMode脚本每帧运行一次。

注意:fQuestDelayTime和其他变量不同,这个变量只能作为控制脚本运行间隔时间的变量,同样要控制脚本运行间隔时间也只能用这个变量。

上述是背景。以前不知道的,就当个科普。以前知道的,就当个回顾。下面进入正题。

大家知道成长型武器吗?其中一种是,武器的初始伤害,攻击速度和范围与玩家角色的等级,或基础力量,敏捷,速度等属性参数正相关。随着等级提高,属性参数也会随之提高,于是武器就会变强。(注意,这里说的是武器的初始伤害而非实际伤害,武器的实际伤害与初始伤害和武器相应技能等级有关)

于是我们就可以创造这样一个脚本,读取玩家角色的各相关属性值,然后建立武器属性与角色属性的关系,将脚本添加到武器上,武器就会随角色变强。

我们的问题是:这样一个脚本,需要重复运行吗?

我们知道,一个脚本就像一个小程序,每一次运行,都必然要消耗CPU和内存资源,只不过当脚本非常小时,这些消耗可以忽略不计。但是,假如游戏中每一帧都要运行多个脚本,则对于CPU和内存的负担,也是比较可观的。诚然,我们可以调整脚本运行的时间间隔,让脚本每分钟,甚至每五分钟运行一次。但是想一下,如果有些脚本只需要运行一次,为什么还要多次运行呢?就像——刚才说的成长型武器脚本。

角色很长时间才会升一级,如果武器属性关联的是角色的基础属性(Buff不算),那么好长时间升级后,才需要读取一次角色基础属性,调整武器属性。既然这样,让这个脚本一直随着游戏跑,显然是有些浪费。所以,我们的改进方案是:将这个脚本加在onEquip,而不是GameMode。当角色属性改变,只需要将装备卸下,再重新装备,武器属性就可以得到修正。

6月2号崭新更新:

有鉴于大家的指正,这里对自己的观点进行一次总结:
首先,脚本有三种类型: Quest(任务脚本)Object(物品脚本)和MagicEffect(魔法效果脚本)。

其次,在脚本中可以定义不同的Blocktype(我不知道怎么翻译,暂且叫它区块类型吧)。它们是:
GameMode,MenuMode,OnActivate,OnActorEquip,OnActorUnequip,OnAdd,OnAlarm,OnAlarmVictim,OnDeath,OnDrop,OnEquip,OnHit,OnHitWith,OnKnockout,OnLoad,OnMagicEffectHit,OnMurder,OnPackageChange,OnPackageDone,OnPackageStart,OnReset,OnSell,OnStartCombat,OnTrigger,OnTriggerActor,OnTriggerMob,OnUnequip,ScriptEffectFinish,ScriptEffectStart,以及ScriptEffectUpdate区块

其中,GameMode区块在非菜单状态下每一帧都会运行,MenuMode区块在菜单状态下每时每刻运行。对于这两个区块,我的观点是,从不影响游戏流畅性角度考虑,GameMode能不用就不用,尤其是只需要运行一次的,看用其它区块能否实现,用MenuMode不会影响游戏流畅性;MenuMode也是时刻运行的,从占用资源角度考虑,能不用也应该尽量不用。
以On打头的区块只是在特定情况下运行一次,ScriptEffectFinish和ScriptEffectStart区块只用于魔法效果脚本,分别在卷轴效果结束和开始时运行一次。对于这些区块,我的观点是,由于Object脚本和Magic Effect脚本从数量上是多于Quest脚本的,所以如果能够有效利用这些运行一次的区块,对资源的节省是相当可观的。
ScriptEffectUpdate区块随卷轴效果更新,持续到效果结束,游戏中卷轴效果更新的情况并不是随处可见的,所以对于该区块,并没有太多想法。

再次,对于fQuestDelayTime,Wiki上的原句是“fQuestDelayTime is a special float variable used by quest scripts to determine how often the script should run.”“fQuestDelayTime 是一个特殊的浮点变量,用于Quest脚本中以决定脚本多久运行一次。”也就是说,fQuestDelayTime是用在(而且貌似也是只能用在)Quest脚本的,而用在其他脚本效果未知(如Object脚本中貌似是没用的,貌似而已,当初用过,但是脚本不理想,很快就删掉了,于是也没有确定在Object脚本中是否有用)。

在Object脚本中,除了GameMode区块之外,以On打头的很多区块都可以用到,从而让某一件物品变得丰富多彩。例如,帝王项链玩家不能戴,它有一个Object脚本AmuletofKingsSCRIPT,脚本内容如下:

scn AmuletofKingsSCRIPT

ref tempRef

begin OnEquip player

MessageBox "The Amulet of Kings slips off as you try to fasten it around your neck."

set tempRef to GetContainer

tempRef.unequipitem AmuletofKings 1
end

即是用了OnEquip区块,针对的角色是玩家角色(player),在玩家佩戴帝王项链时,会出现信息:“The Amulet of Kings slips off as you try to fasten it around your neck.”“当你试图将帝王项链戴在脖子上时,项链滑了下来。”同时,强制卸下该物品(unequipitem命令)。

上述只是其中一个例子。事实上还可以用OnXXX区块来实现很多有意思的功能,比如某些东西不能卖,就可以做脚本,用OnSell区块,当物品被卖掉时,怎么怎么样,等等等等,不一而足。

至于5楼DKEros提出的问题(如果我想给召唤物定义存在的时间 应该在magic effect脚本中如何定义),事实上,设定一个spell,类型视需要而定,在其中添加一个effect,如下图:
gallery_1_23_138563.png
effect选Script effect,duration选择你想要持续的时间,然后定义一个Magic Effect脚本,脚本中用到ScriptEffectFinish和ScriptEffectStart区块。事实上,这应该也是游戏官方的定义方法,应该说,这种定义方法也是在游戏的大框架之下优化了脚本对资源的占用的。
这只是基本思路框架,具体细节还需要自己完善。

下面,针对V大说的没有实物和没说一样的观点,我就简单举例说一下上文提到的一种成长型武器脚本:
gallery_1_23_3391.png

上述脚本的核心内容就是OnEquip区块,而OnEquip区块的核心内容也不过是蓝色背景的四句话。
当然,这里只是简单举例,所以也只是取了武器初始伤害与玩家角色基础力量属性的一对一函数关系,但是基本思路就是这样,包括防御装备的一些基本属性也可以按照这种思路。这种思路的优点就是脚本只在装备时运行一次,占用资源小,缺点是不够智能,玩家角色基础力量属性提高时,需要卸下武器并重新装备,并且由于脚本只运行一次,导致数据不能实时显示,大概会有延迟(比如角色进行一次攻击动作)。

最后想说的是,不要看脚本小,多次运行也不会有多大影响,但是须知,积土成山,积水成渊,积善成德。

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...