目录 换装协议⑧
不懂这是什么的小伙伴建议先看初始化流程①哦~
换装协议(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);
}
}
}
|