[开发者心得] 坤坤出品|PrefabEvent二次开发教程——换装协议⑧

[复制链接]
1444 |0
森林鹿 发表于 2023-3-6 14:55:03 | 显示全部楼层 |阅读模式
目录
换装协议⑧


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


换装协议(PrefabEvtCloth)


这个协议用于换装,可以用于更换角色的整体服装、角色体型、服装部件的通知,可以用于不同换装预制件之间的换装冲突处理,这个协议类似于攻击协议中的武器装备,是为了达到一个人只能穿一套衣服或者一套装饰物的目的。

示例-换装代码:
导入上面的工具类附件,此示例依赖工具类代码来实现

下面这组代码在换装后使用换装协议对外界进行了通知处理。示例中监听了换装协议的插槽换装事件,在装备了其他插槽的时候去卸载掉自己的插槽装饰物。


import { PrefabEvent } from "../../../../PrefabEvent";;
import { MapEx } from "../Tools/MapEx";

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

    @Core.Property({ replicated: false, displayName: "预加载" })
    preloadAssets: string = "";
    @Core.Property({ replicated: false, displayName: "装备信息(keep则不变)", group: "换装配置" })
    role: string = "keep";

    private _trigger: Gameplay.Trigger;

    private cacheGo: MapEx.MapExClass<Core.GameObject[]> = {};

    protected onStart(): void {

        if (Util.SystemUtil.isClient()) {
            //获取触发器
            this._trigger = this.gameObject as Gameplay.Trigger;
            //监听触发器进入事件
            this._trigger.onEnter.add((gameobject: Core.GameObject) => {
                //判断是否是角色进入了触发器
                if (gameobject instanceof Gameplay.Character) {

                    let char = gameobject as Gameplay.Character;

                    if (char) {
                        //开始加载服装数据
                        this.loadCloth(char);
                        
                    }
                    
                }

            })
            //监听服装加载事件
            PrefabEvent.PrefabEvtCloth.onLoadSlot((senderGuid: string, targetGuid: string, slotResGuid: string) => {
                //检测是否有对应targetGuid的缓存slot数据
                if (MapEx.has(this.cacheGo, targetGuid)) {
                    //获取并销毁对应插件的数据
                    let listCahce = MapEx.get(this.cacheGo, targetGuid);
                    listCahce.forEach(e => {
                        e.detachFromGameObject();
                        e.destroy();
                    })
                    MapEx.del(this.cacheGo, targetGuid);
                }

            })
        }

    }

    /**
     * 改变服装
     * @param char
     */
    private loadCloth(char: Gameplay.Character) {
        if (this.role == "keep") return;
        let res = [];
        //获取所有的服装数据
        res.push(this.role);
        if (res.length > 0) {
            //获取v2形象实例
            let v2 = char.setAppearance(Gameplay.HumanoidV2);
            if (res.length > 0) {
            
                //加载所有的服装数据
                v2.setAppearanceData(res, () => {
                    v2.appearanceSync();
                })
            }
            //发出服装加载的事件
            PrefabEvent.PrefabEvtCloth.loadCloth(this.gameObject.guid, char.guid, res);
        }

    }

}








Tools.zip

7.98 KB, 下载次数: 46

回复

使用道具 举报

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