[开发者心得] 坤坤出品|PrefabEvent二次开发教程——属性协议②

[复制链接]
1027 |0
森林鹿 发表于 2023-3-3 17:38:05 | 显示全部楼层 |阅读模式
本帖最后由 森林鹿 于 2023-3-14 11:39 编辑

目录
属性协议②


不懂这是什么的小伙伴建议先看初始化流程①哦~

属性协议(PrefabEvtAttr)
        这个协议可以用于修改玩家属性,协议中定义的属性(PrefabEvent.AttrType)有最大血量、最大蓝量、攻击力、魔法力、防御力、魔法防御力、速度、跳跃力、攻击速度 、攻击距离,这部分属性主要用于定义玩家可以操控的角色的表现情况,其中玩家的部分属性(速度、跳跃力)已由玩家系统预制体进行管理,如果在场景内存在玩家系统预制体,可以通过addAttrVa这个接口去改变玩家的跳跃高度,移动速度属性。
       如果需要使用这个协议来改变玩家的其他属性,可以在其他的预制体中去通过onAddAttrVal注册一个监听事件来监听这个属性改变来改变预制件的属性。这个协议具体可以应用到BUFF系统、加速块、减速块中。

示例-制作一个加速块:
       可以在服务器端去检测进入到一个触发器内的角色,当然也可以在客户端判断是否是自己控制的角色后再执行下面的代码,使用addAttrVal接口去提高玩家的速度,然后一段时间后将这部分提高的速度减去。同时也需要使用onAttrVal协议去监听这个信息。


import { PrefabEvent } from "./PrefabEvent";

@Core.Class
export default class NewScript extends Core.Script {

    /** 当脚本被实例化后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        
        // 如果当前是客户端,直接返回
        if (SystemUtil.isClient()) {
            return;
        }
        
        // 获取当前实例化的游戏对象并在对象准备就绪后执行回调
        this.gameObject.ready().then(go => {
            
            // 将当前游戏对象转换为 "Gameplay.Trigger" 类型
            let trigger = go as Gameplay.Trigger;
            
            // 当有角色进入触发器时,执行回调
            trigger.onEnter.add((chara: Gameplay.Character) => {
               
                // 判断进入触发器的游戏对象是否为 "Gameplay.Character" 类型
                if (chara instanceof Gameplay.Character) {
                    
                    // 改变进入触发器的角色移动速度
                    PrefabEvent.PrefabEvtAttr.addAttrVal(this.gameObject.guid, chara.guid, 200, PrefabEvent.AttrType.Speed);
                    
                    // 1 秒后恢复角色移动速度
                    setTimeout(() => {
                        PrefabEvent.PrefabEvtAttr.addAttrVal(this.gameObject.guid, chara.guid, -200, PrefabEvent.AttrType.Speed);
                    }, 1000);
                }
            })
        })
    }

}


        在使用监听协议onAttrVal的时候,我们一般情况下不需要在意sender发送者是谁,只需要关心targetGuid也就是发送者,还有val改变的值和AttrType改变的属性,下面例子属于玩家系统中的代码,其中判断了targetGuid是否与这个预制体本身指向的guid相同,然后通过判断传进来的属性枚举类型改变了玩家的属性。这样就可以实现一个加速块的功能。

// 当 "PrefabEvent" 模块中的 "PrefabEvtAttr" 添加属性值时,执行回调函数
PrefabEvent.PrefabEvtAttr.onAddAttrVal(async (senderGuid: string, targetGuid: string, val: number, attrType: PrefabEvent.AttrType) => {
    // 判断目标游戏对象的 guid 是否等于当前实例化的对象的 guid
    if (targetGuid != this.selfGuid) {
        return;
    }

    // 异步查找目标游戏对象
    let go = await Core.GameObject.asyncFind(targetGuid);

    // 判断目标游戏对象是否为 "Gameplay.Character" 类型
    if (go instanceof Gameplay.Character) {
        
        // 将目标游戏对象转换为 "Gameplay.Character" 类型
        let char = go as Gameplay.Character;

        // 根据属性类型进行不同的处理
        switch (attrType) {
            case PrefabEvent.AttrType.Speed:
                // 增加速度属性值
                this.speed += val;
                // 更新角色最大行走速度
                char.maxWalkSpeed = this.speed;
                break;
            case PrefabEvent.AttrType.Jump:
                // 增加跳跃属性值
                this.jump += val;
                // 更新角色最大跳跃高度
                char.maxJumpHeight = this.jump;
                break;
            default:
                console.error("未处理属性类型 : " + attrType);
        }
    }
})






回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表