本帖最后由 vegetto 于 2024-2-29 09:03 编辑
之前在此文章(关于场景物化item装备的具体用处 https://bbs.mountblade.com.cn/thread-2100580-1-1.html)讲了下spawned item生成后具备受大部分prop开头的op操作的能力,也就是spawned item本质近似prop ,但是又可以利用(scene_prop_set_prune_time, <scene_prop_id>, <value>),这操作进行彻底消失(删除),也就是比真正的prop类型物体拥有的控制生命周期的实力,为我们利用spawned item性质物体结合prop类型op操作来模拟粒子系统particle效果提供了较为完善系统的模拟基础。
一、对比原有particle粒子系统支持的参数及对应spawned item套用prop操作可以处理的类似效果 1、粒子模型和数量控制 对于原有particle粒子系统中创建粒子,首先我们要准备粒子模型导入brf,然后particle系统引用名称,填写数量。而对于prop化的spawned item,我们类似的,可以将我们准备好的一系列可以作为特效的模型,包括平面的、立体的、带顶点动画的模型预先导入brf,在module_items文件预先注册一定你认为后期足够不同特效种类数量使用的item模板, 比如 itm_tx1 ............略........... itm_tx2 .....略.......... itm_tx1000 等等
注意要连续预留模板,因为你刚开始做不一定会想到成百上千特效,也来不及准备这些特效模型,如果你两个特效itm之间夹杂了其他如纯武器类型itm装备,那么你后期特效配置充足后,想要批量多特效调用如下新特效系统,对于某些方面的集中处理就不得不采用枚举法。 预留完成后,通过下面类似触发参考,代码指定使用的粒子模型和数量控制: 初始化阶段触发 (agent_set_slot, ":玩家", slot_存粒子名, ":itm_特效"), #为通用化代码,故将具体itm物体抽象成为不定变量,用变量再展开写各种prop控制操作,这样改此段就可以通用。 执行阶段触发 (agent_get_slot, ":粒子名称", ":玩家", slot_存粒子名), (scene_spawned_item_get_num_instances, ":数量参数", ":粒子名称"), (neg|ge, ":数量参数", 最大数量值), (agent_get_position, pos30, ":玩家"), (set_spawn_position, pos30), (spawn_item, "itm_特效", 0, 默认生命周期), #生命周期填0则永久显示。 。。。。。。。。。。。。。。。。。。。。。。。。。。。 (scene_prop_set_slot, reg0, 301, 2810), #301到底是slot_什么功能自己定 (scene_prop_set_slot, reg0, 302, 4200), (scene_prop_set_slot, reg0, 303, 2810), (scene_prop_set_slot, reg0, 304, 6820), (scene_prop_set_slot, reg0, 305, 2810), (scene_prop_set_slot, reg0, 306, 6820), (scene_prop_set_slot, reg0, 307, 10), (scene_prop_set_slot, reg0, 308, 860), (scene_prop_set_slot, reg0, 309, 100000), (scene_prop_set_slot, reg0, 310, 100500), (scene_prop_set_slot, reg0, 311, 870), (scene_prop_set_slot, reg0, 312, 1110), (scene_prop_set_slot, reg0, 313, 100000), (scene_prop_set_slot, reg0, 314, 100500), (scene_prop_set_slot, reg0, 315, 1120), (scene_prop_set_slot, reg0, 316, 1630), (scene_prop_set_slot, reg0, 317, 1640), (scene_prop_set_slot, reg0, 318, 2130), (scene_prop_set_slot, reg0, 319, 100000), 一直set到自己需求够用的slot值,略 。。。。。。。。。。。。。。。。。 (scene_prop_set_visibility, reg0, 0), #隐身以免刷出来被你自己看到 (2612, reg0, 初帧时刻, 末帧时刻, 顶点动画播放速度), #如果有些特效你要用的时候直接就使用它的一段顶点动画并循环,并且效果无论从起点还是中间开始取消隐身显形播放都差不多,就可以加这句循环播放顶点动画 利用excel表的公式填充功能,将所有你认为下一步可能用到的对spawned item进行的prop类型可变操作的参数进行初始化存储。
2、生命周期控制和渐隐控制 原有particle粒子系统我们知道可以填参数指定刷出粒子后多长时间消失,以及填写alpha变化参数,控制粒子模型外表虚化程度。而对于用prop化的spawned item,类似的我们可以如下处理: 首先利用slot,最好是我第1点初始化的(prop slot_周期变化) 来进行0-特定值的数值变化,另外用一个(prop slot_周期上限 )初始化时限制这个特定值,这样,两个slot统一到这个上限值后,利用 (scene_prop_set_prune_time, <scene_prop_id>, <value>), 来强制消失, <value>为0为立即消失,但是你也可以这么考虑,<value>填大于0的数,延缓消失,然后再同时使用 (scene_prop_fade_in, <scene_prop_id>, <fade_in_time>),来先渐隐。这样即有渐隐不那么突兀的消失效果,又可以利用prune彻底删除以防堆积内存。 此外(scene_prop_fade_out, <scene_prop_id>, <fade_out_time>), (scene_prop_fade_in, <scene_prop_id>, <fade_in_time>),这两个渐出和渐隐的对立效果,如果不和生命周期联系,其实就相当于原有particle粒子系统的alpha参数控制效果。
3、颜色控制 原有particle粒子系统我们知道可以填RGB参数控制粒子模型的贴图颜色变化,依据原有贴图样式调色。 而对于用prop化的spawned item,实际上我们无法做到这一点,但是我们可以使用贴图更换系统,也就是我这个帖子写的动图(序列图)模拟系统 (关于革命性操作贴图变换模拟动图系统在骑砍里的综合应用 具体就不多说了,反正我这么说吧,现在很多游戏其实能做华丽特效的,都不是我们骑砍这种particle粒子爆发像分子布朗运动形式的,比如大型光球,就是靠带动画的粒子模型撑起整个特效模型的骨架,然后周边嵌入正方形片面模型播放序列图(也就是类似动图,比如像传奇合金弹头这些2d游戏,2d会动素材并不是动图,而是像我这样把动图分解成各帧,然后根据帧数切换),通过动图可以产生的不规则比如气体漫流火花等效果,缠绕在立体模型周边,营造这种边缘效果。 4、运动及动画控制 原有particle粒子系统可以通过调整一些参数控制运动,比如重力不就是向下(z)运动,初始速度方向xyz参数就是移动前的特效prop在场景的初始朝向调整,而速度参数就是xyz方向prop_instance_animate_to_position填写参数根据触发间隔的调整,震荡就是记录自己开始做震荡运动前的位置,然后move xyz 值根据触发时间频率来回正负值,进行“晃动”。 首先大量特效spawned item集中控制进行如下代码模板: (scene_spawned_item_get_num_instances, ":特效模型数量", "itm_特效模型"), (ge, ":特效模型数量", 指定刷出上限数量值), (try_for_range, ":同一特效模型序数", 0, ":特效模型数量"), (scene_spawned_item_get_instance, ":特定特效模型对象", "itm_特效模型", ":同一特效模型序数"), (scene_prop_slot_eq, ":特定特效模型对象", slot_允许进行操作, 特定值), (prop_instance_get_position, pos3, ":特定特效模型对象"), 。。。。。各种针对":特定特效模型对象"进行的prop类型op操作,略。。。。。。。。。。 (try_end),
比如下面简单写个prop运动参考一下 (prop_instance_get_position, pos2, ":特效模型对象"), (try_begin), (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_x旋转量), (position_rotate_x, pos2, ":旋转值"), (try_end), (try_begin), (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_y旋转量), (position_rotate_y, pos2, ":旋转值"), (try_end), (try_begin), (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_z旋转量), (position_rotate_z, pos2, ":旋转值"), (try_end), (try_begin), (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_x平移量), (position_move_x, pos2, ":平移值"), (try_end), (try_begin), (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_y平移量), (position_move_y, pos2, ":平移值"), (try_end), (try_begin), (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_z平移量), (position_move_z, pos2, ":平移值"), (try_end), (prop_instance_animate_to_position, ":特效模型对象", pos2, 运动完成总时间),
也就是说,我在刷spawned item特效物体时利用scene_prop_set_slot, reg0初始化了下运动的平移旋转六种运动分量参数,然后运行特效物体运动时取出来完成运动。 对于重力则对move z进行物理公式化处理参数,对于震荡,则slot构造计时器来指定一段时间进行往复xyz偏移运动。 从一定角度看,运动也是动画的一种, 但是但是但是但是但是但是!!! particle粒子系统无法操作除运动以外的如顶点动画之类的变形动画,而prop可以,那prop化的spawned item也可以操作顶点动画。比如这个帖子(树根缠绕顶点动画源文件下载和代码使用方法 https://bbs.mountblade.com.cn/thread-2104058-1-1.html),你用particle粒子系统就无法模拟树根缠绕的动画效果,具体顶点动画控制的理论方法可以看此贴(战团-顶点动画综合控制理论体系,独家研究
5、放大缩小
particle粒子系统可以对粒子模型进行放缩,而spawned item利用如下prop操作也可以做到:
(prop_instance_set_scale, 场景物的instance id, x, y, z), #对场景物品prop进行放大缩小。xyz填数字或变量,是浮点数,假如开头(set_fixed_point_multiplier, 1000), 那么x/1000就是模型x坐标方向拉长的倍数,同理yz,也就是你也可以不均匀放大场景物体,然后注意无论你后面如何反复使用这个op操作,参数的倍数都是按照你的初始倍数来的,比如你连续写了两次(prop_instance_set_scale, reg0, 2000, 2000, 2000), reg0代表的物体还是长宽高原来的两倍。
6、碰撞障碍物检测
这个是particle粒子系统光靠自身系统不便做到的,而spawned item利用prop操作后可以利用(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
(position_get_distance_to_terrain, <destination>, <position>), (position_get_distance_to_ground_level, <destination>, <position>), 这些操作来判断解决。
7、关于计时器 根据我上面几个系统的解释,实际上要做到运动和动画控制等等变化,离不开计时器的控制,可以参考此贴(关于通过顶点顶画构造场景内的计时器和延时触发的做法 我个人觉得,这种依靠场景物类型模型进行各种操作的东西,我们除了slot控制计时器,也可以利用顶点动画本身计时性质来做计时器。 ------------------------------------
所以综上,抛去未大量应用未知对系统的负担问题,spawned item利用prop操作后,相比于particle粒子系统,优势是spawned item基本可以做到particle粒子系统所有变化控制特性,并且可以做到particle粒子系统难以直接实现或不能实现的“生命周期自由控制、形变动画控制、贴图样式变化、更自由多变的轨迹控制和中途控制位移停滞、放大缩小等等随心所欲而不用根据时间周期指定朝一个方向改变”等等,缺陷就是需要提前想好各种系统模拟的触发器写法,并综合起来。实际上,对于运动以外的功能,我们利用slot初始化prop的各种特性预存起来调用,对于大部分特效制作是通用的,而对于运动来说,一次性刷出来的多个特效物体不一定都是朝一个位置、一个方向、一个速度发射并做一类运动,比如烟花,就是四面八方发射,所以我们做一个通用化的spawned item新粒子系统的脚本时,要多做几个常用的prop运动控制子脚本来选择。
|