骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 159|回复: 1

[功能与代码] item作prop利用化案例:御剑术——万剑归宗技能

[复制链接]

215

主题

1040

回帖

1052

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
发表于 前天 21:56 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2025-10-16 22:06 编辑

之间讲过spawned item 可以成为无碰撞体的prop性质,受各种prop抬头的op操作并且还能受prop prune time的作用永久删除id,这样可以解放过去部分批量操作sceneprop无法删除而不得不复用id的困难,使得可以放开手刷场景类物体操作,也因此因为可以操作生命周期且可以继承prop的放缩、移动、顶点动画、材质设定等操作和item的列表化配置(比如可以后期借助item的overlay去表示prop化spawned item的预览图),利用spawned item 甚至可以更好的模拟动态技能、特效等等。

本次说一下御剑术——万剑归宗技能。






(0.000000, 0.000000, 0.000000, 添加MT如下



(try_begin),
        (set_fixed_point_multiplier, 1000),
        (get_player_agent_no, ":var_0"),
        (agent_get_position, pos11, ":var_0"),
        (copy_position, pos12, pos11),
        (troop_set_slot, "trp_player", 317, "itm_swordskill0"),                   #简化了条件,设置飞剑的item id,实际可以调控一下,采取什么本命飞剑
        (troop_get_slot, ":var_1", "trp_player", 317),                               #获取控制的飞剑item id
        (scene_spawned_item_get_num_instances, ":var_2", ":var_1"),     #获取spawned item 飞剑的物体数量,以便下方以循环的方式操作这一类物体进行prop类型的控制操作
        (try_begin),
            (key_is_down, key_left_mouse_button),                        #按住鼠标左键时,点击一下V键,使得周边以20度旋转一圈分别在240和480以玩家中心距离处各设置18把飞剑,共36把
            (key_clicked, key_v),
            (eq, ":var_2", 0),
            (try_for_range, ":var_3", 0, 18),
                (store_mul, ":var_4", ":var_3", 20),
                (agent_get_position, pos12, ":var_0"),
                (position_rotate_z, pos12, ":var_4"),
                (position_move_y, pos12, -240),
                (try_begin),
                    (neg|agent_slot_eq, ":var_0", 301, 1),
                    (position_move_z, pos12, 800),
                    (position_set_z_to_ground_level, pos12),
                (else_try),
                    (position_move_z, pos12, 0),
                (try_end),
                (set_spawn_position, pos12),
                (spawn_item, ":var_1", 0, 10),           #生成所要御剑的飞剑,设置生命周期10s(生命周期随意,覆盖御剑技能施展周期即可,因为后面prune还要再强制缩小生命周期)            
            (try_end),
            (try_for_range, ":var_3", 0, 18),                  #脑子偷懒,不数学计算了,两圈剑的生成复制了写的
                (store_mul, ":var_4", ":var_3", 20),
                (agent_get_position, pos12, ":var_0"),
                (position_rotate_z, pos12, ":var_4"),
                (position_move_y, pos12, -480),
                (try_begin),
                    (neg|agent_slot_eq, ":var_0", 301, 1),
                    (position_move_z, pos12, 800),
                    (position_set_z_to_ground_level, pos12),      #agentslot301是判断人物是否处于飞行状态,飞行则剑从地面处刷出,飞行则从脚底高度刷出
                (else_try),
                    (position_move_z, pos12, 0),
                (try_end),
                (set_spawn_position, pos12),
                (spawn_item, ":var_1", 0, 10),
            (try_end),
        (try_end),                                                       #生成飞剑段结束
        (try_begin),
            (neg|key_is_down, key_w),
            (neg|key_is_down, key_a),
            (neg|key_is_down, key_s),
            (neg|key_is_down, key_d),
            (key_is_down, key_left_mouse_button),
            (ge, ":var_2", 1),                                                      #没有按移动键时如果已经生成飞剑(即按了鼠标左键又点过V键),此时鼠标左键还按着不松手,开始执行御剑的运动周期环节
            (try_for_range, ":var_5", 0, ":var_2"),
                (scene_spawned_item_get_instance, ":var_6", ":var_1", ":var_5"),      #循环spawned item物品去当prop控制的核心,get num数量后循环instance,类比过去正常prop的循环控制。
                (prop_instance_get_position, pos13, ":var_6"),
                (scene_prop_get_slot, ":var_7", ":var_6", 400),
                (try_begin),
                    (is_between, ":var_7", 0, 300),
                    (store_add, ":var_8", ":var_7", 1),
                    (scene_prop_set_slot, ":var_6", 400, ":var_8"),
                (try_end),                                                               #slot400以0-300为事件的执行周期
                (scene_prop_slot_ge, ":var_6", 401, 0),
                (try_begin),
                    (is_between, ":var_7", 0, 40),
                    (copy_position, pos14, pos13),
                    (store_mod, ":var_9", ":var_7", 2),
                    (eq, ":var_9", 0),
                    (position_move_z, pos14, 10),
                    (prop_instance_set_position, ":var_6", pos14),       #slot400从0-40周期,剑从地面升起,剑身保持刷出时的角度,即平行水平面
                (else_try),
                    (is_between, ":var_7", 40, 130),
                    (copy_position, pos14, pos13),
                    (store_mod, ":var_9", ":var_7", 1),
                    (eq, ":var_9", 0),
                    (position_rotate_x, pos14, -1),
                    (prop_instance_set_position, ":var_6", pos14),    #slot400从40-130周期,剑旋转使得垂直于地面,剑朝下,即与人体平行。
                (else_try),
                    (is_between, ":var_7", 130, 160),
                    (copy_position, pos14, pos13),
                    (store_mod, ":var_9", ":var_7", 1),
                    (eq, ":var_9", 0),
                    (position_rotate_y, pos14, 12),
                    (prop_instance_set_position, ":var_6", pos14),      #slot400从130-160周期,各剑以自身为中心旋转
                (else_try),
                    (is_between, ":var_7", 160, 210),
                    (copy_position, pos14, pos13),
                    (agent_get_look_position, pos15, ":var_0"),
                    (position_copy_rotation, pos14, pos15),
                    (prop_instance_animate_to_position, ":var_6", 14, 10),  #slot400从160-210周期,各剑移动到与玩家御剑者的视角平行,但是平缓运动,因为目前剑与视角角度相差较多,避免突兀
                (else_try),
                    (is_between, ":var_7", 210, 240),
                    (copy_position, pos14, pos13),
                    (store_mod, ":var_9", ":var_7", 1),
                    (eq, ":var_9", 0),
                    (position_rotate_x, pos14, 0),
                    (prop_instance_set_position, ":var_6", pos14),  #slot400从210-240周期,本来是要再自身旋转下的,取消了参数没有转
                (else_try),
                    (is_between, ":var_7", 240, 270),
                    (copy_position, pos14, pos13),
                    (agent_get_look_position, pos15, ":var_0"),
                    (position_copy_rotation, pos14, pos15),
                    (prop_instance_animate_to_position, ":var_6", 14, 10),  #slot400从240-270周期,各剑移动到与玩家御剑者的视角平行,但是快速跟随运动,因为前阶段已经足够剑运动到玩家视角平行,现在是寻找目标阶段
                (else_try),
                    (eq, ":var_7", 270),
                    (copy_position, pos14, pos13),
                    (agent_get_look_position, pos15, ":var_0"),
                    (position_copy_rotation, pos14, pos15),
                    (scene_prop_set_visibility, ":var_6", 0),                #因为prune time 为0不是立即消失而是永生,所以隐身set_visibility是为了精细控制消失时机,prune是为了彻底抹除存在减少内存占用
                    (scene_prop_set_prune_time, ":var_6", 2),           #slot400到270节点值,释放自身一样模型的missile,然后设置原有剑item prune生命周期为2s后消失。
                    (add_missile, ":var_0", 14, 60000, 0, 0, ":var_1", 0),
                    (scene_prop_set_slot, ":var_6", 401, -1),                     
                (try_end),
            (try_end),
        (else_try),
            (this_or_next|key_is_down, key_w),
            (this_or_next|key_is_down, key_a),
            (this_or_next|key_is_down, key_s),
            (this_or_next|key_is_down, key_d),
            (neg|key_is_down, key_left_mouse_button),
            (ge, ":var_2", 1),                 #与上一套运行事件相悖,如果玩家任意方向移动或者松手了鼠标左键,则御飞的剑纷纷掉落,并且不能再启用导致技能CD,等生命周期都消失才可重新生成操作
            (try_for_range, ":var_5", 0, ":var_2"),
                (scene_spawned_item_get_instance, ":var_6", ":var_1", ":var_5"),
                (prop_instance_get_position, pos13, ":var_6"),
                (scene_prop_get_slot, ":var_7", ":var_6", 400),
                (try_begin),
                    (is_between, ":var_7", 0, 400),
                    (store_add, ":var_8", ":var_7", 1),
                    (scene_prop_set_slot, ":var_6", 400, ":var_8"),
                (try_end),
                (try_begin),
                    (scene_prop_slot_ge, ":var_6", 401, 0),
                    (scene_prop_set_slot, ":var_6", 401, -1),
                (try_end),
                (scene_prop_slot_eq, ":var_6", 401, -1),
                (try_begin),
                    (is_between, ":var_7", 0, 400),
                    (copy_position, pos14, pos13),
                    (position_copy_rotation, pos14, pos11),
                    (position_move_z, pos14, -10),
                    (position_get_distance_to_ground_level, ":var_10", pos14),
                    (ge, ":var_10", 10),
                    (prop_instance_set_position, ":var_6", pos14),              #为了剑落地不陷下去
                    (try_begin),
                        (is_between, ":var_7", 0, 300),
                        (scene_prop_set_visibility, ":var_6", 1),
                    (try_end),
                (else_try),
                    (ge, ":var_7", 400),
                    (scene_prop_set_visibility, ":var_6", 0),
                    (scene_prop_set_prune_time, ":var_6", 2),
                    (scene_prop_set_slot, ":var_6", 401, -2),
                (try_end),
            (try_end),
        (try_end),
    (try_end),


#########此外,技能是有cd的,cd即取决于所有剑的生命周期是否到头消失,只有场景内剑数量彻底为0,才可以继续这一套技能。


###########这样各种御剑术类似,控制item物体来各种运动,比如变成防御御剑,多把剑聚成剑环,或者挥舞剑时万剑伴随一起从内向外扩展一起旋转等等,并且不用考虑id复用问题,就像粒子系统一样刷了控制用完就消失


#############你甚至可以像李逍遥一样,御剑到面前,竖着飞到你面前,还能显示拾取物体的性质,又拿到手上,或者丢剑后,又控制到剑的物体id去prop般御剑飞行,等等,成为自由的剑仙。



215

主题

1040

回帖

1052

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
 楼主| 发表于 前天 22:11 | 显示全部楼层
本帖最后由 vegetto 于 2025-10-16 22:16 编辑

本演示视频里还有另外一个用法,prop化的item切换材质播放2D动画,来制作动态攻击及技能特效(有时甚至还可以使用顶点动画去做动态技能),弥补战团原有粒子系统制作特效的部分短板,代码后面再补充
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-10-18 14:40 , Processed in 0.061780 second(s), 18 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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