人物角色的指定插槽

[复制链接]
1496 |7
近我者甜 发表于 2023-5-15 17:12:46 | 显示全部楼层 |阅读模式
人物角色指定插槽,当插槽已经拥有物体,再次向插槽中增加物体,前面已经拥有的物体如何移除??
回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-5-15 17:15:37 | 显示全部楼层
如果是在脚本层面的话 可以这样试试
服务器维护一个map<string,GamePlay.Mesh>
每次要新增物体的时候 去map里拿 玩家id-槽位  如果能拿到Mesh,就把这个Mesh给destory掉就好
并把新的物体set进这个map
回复

使用道具 举报

喵喵哭唧唧 发表于 2023-5-15 17:17:43 | 显示全部楼层
目前当你给这个角色某个插槽加了物体后,是需要自己去维护它们的,比如你可以使用一个数组存储它们,当需要移除时,你找到自己维护的这些对象 去detach就好了
回复

使用道具 举报

近我者甜楼主 发表于 2023-5-15 17:38:57 | 显示全部楼层
喵喵哭唧唧 发表于 2023-5-15 17:17
目前当你给这个角色某个插槽加了物体后,是需要自己去维护它们的,比如你可以使用一个数组存储它们,当需要 ...

可以给个例子吗?
回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-5-15 19:38:25 | 显示全部楼层

这是我MyClearAct动效编辑器里https://forum.ark.online/forum.p ... &extra=#pid4079
对类似情况的处理
需要注意的是let equipId = "Peqp_" + pid + SlotType.toString();  这里就是维护 角色-插槽 的标签,通过这个标签去找charEquipMents这个维护对应关系的map,然后每次加之前都会先删除一下旧的,然后把新的往这个map里存
this.charEquipMents.get(equipId)
/**角色_插槽:装备静态模型 */
    public charEquipMents: Map<string, Gameplay.StaticMesh> = new Map();



   /**装备/去除装备
     * @param Attacker 需要执行装备操作的玩家
     * @param guid 装备的静态模型guid,<0则视为要清除该插槽的装备
     * @param location 装备的相对位置
     * @param scale 装备的相对缩放
     * @param rotate 装备的相对选装
     * @param SlotType 装备需要装在角色的哪个插槽,常用15左手|16右手|12背部,已有的话会清除旧的装新的,如果guid<0且SlotType<0即清除身上所有装备
     */
    @Core.Function(Core.Server)
    public serverEquipMe(Attacker: Gameplay.Player, guid: string, location: Vector, scale: Vector, rotate: Rotation, SlotType: number) {
        location = new Vector(location.x, location.y, location.z);
        scale = new Vector(scale.x, scale.y, scale.z);
        rotate = new Rotation(rotate.x, rotate.y, rotate.z);

        let pid = Attacker.getUserSystemId();
        let equipId = "Peqp_" + pid + SlotType.toString();

        if (Number(guid) <= 0) {
            if (SlotType > 0) {
                if (this.charEquipMents.get(equipId)) {
                    this.charEquipMents.get(equipId).destroy();
                    this.charEquipMents.delete(equipId);
                }

            }
            else {
                this.serverDetachAllEquip(Attacker);
            }
        } else {
            if (!AssetUtil.assetLoaded(guid)) {
                AssetUtil.asyncDownloadAsset(guid).then(() => {

                    if (this.charEquipMents.get(equipId)) {
                        this.charEquipMents.get(equipId).destroy();
                    }
                    Core.GameObject.asyncSpawn({ guid: guid, transform: new Transform(new Vector(0, 0, -1000), rotate, scale) }).then((equipItem: Gameplay.GameObject) => {
                        if (equipItem instanceof Gameplay.StaticMesh) {
                            equipItem.setCollision(2);
                            this.charEquipMents.set(equipId, equipItem);
                            Attacker.character.attach(equipItem, SlotType);
                            equipItem.relativeLocation = location;
                        }
                    })
                })
            } else {
                if (this.charEquipMents.get(equipId)) {
                    this.charEquipMents.get(equipId).destroy();
                }
                Core.GameObject.asyncSpawn({ guid: guid, transform: new Transform(new Vector(0, 0, -1000), rotate, scale) }).then((equipItem: Gameplay.GameObject) => {
                    if (equipItem instanceof Gameplay.StaticMesh) {
                        equipItem.setCollision(2);
                        this.charEquipMents.set(equipId, equipItem);
                        Attacker.character.attach(equipItem, SlotType);
                        equipItem.relativeLocation = location;
                    }
                })
            }
        }
    }


回复

使用道具 举报

近我者甜楼主 发表于 2023-5-15 20:48:04 | 显示全部楼层
叽里咕噜小胡桃 发表于 2023-5-15 17:15
如果是在脚本层面的话 可以这样试试
服务器维护一个map
每次要新增物体的时候 去map里拿 玩家id-槽位  如果 ...

不太会,可以给个简单Demo吗
回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-5-16 09:40:59 | 显示全部楼层
近我者甜 发表于 2023-5-15 20:48
不太会,可以给个简单Demo吗

这个就是demo,新建个工程新建个脚本丢进去直接调就可以用的
回复

使用道具 举报

叽里咕噜小胡桃 发表于 2023-5-16 09:47:14 | 显示全部楼层
近我者甜 发表于 2023-5-15 20:48
不太会,可以给个简单Demo吗

20230516094551_rec_.gif

可以多探索探索嘛,不用等着喂饭
上面那个就是封装好的模块,你直接调就行了
试一试就出来了,按U\I\O\P给手上换不同的模型
@Core.Class
export default class NewScript extends Core.Script {
    /**角色_插槽:装备静态模型 */
    public charEquipMents: Map<string, Gameplay.StaticMesh> = new Map();


    /**装备/去除装备
      * @param Attacker 需要执行装备操作的玩家
      * @param guid 装备的静态模型guid,<0则视为要清除该插槽的装备
      * @param location 装备的相对位置
      * @param scale 装备的相对缩放
      * @param rotate 装备的相对选装
      * @param SlotType 装备需要装在角色的哪个插槽,常用15左手|16右手|12背部,已有的话会清除旧的装新的,如果guid<0且SlotType<0即清除身上所有装备
      */

    @Core.Function(Core.Server)
    public serverEquipMe(Attacker: Gameplay.Player, guid: string, location: Vector, scale: Vector, rotate: Rotation, SlotType: number) {
        location = new Vector(location.x, location.y, location.z);
        scale = new Vector(scale.x, scale.y, scale.z);
        rotate = new Rotation(rotate.x, rotate.y, rotate.z);

        let pid = Attacker.getUserSystemId();
        let equipId = "Peqp_" + pid + SlotType.toString();

        if (Number(guid) <= 0) {
            if (SlotType > 0) {
                if (this.charEquipMents.get(equipId)) {
                    this.charEquipMents.get(equipId).destroy();
                    this.charEquipMents.delete(equipId);
                }
            }
            else {
                //  this.serverDetachAllEquip(Attacker);
            }
        } else {
            if (!AssetUtil.assetLoaded(guid)) {
                AssetUtil.asyncDownloadAsset(guid).then(() => {
                    if (this.charEquipMents.get(equipId)) {
                        this.charEquipMents.get(equipId).destroy();
                    }
                    Core.GameObject.asyncSpawn({ guid: guid, transform: new Transform(new Vector(0, 0, -1000), rotate, scale) }).then((equipItem: Gameplay.GameObject) => {
                        if (equipItem instanceof Gameplay.StaticMesh) {
                            equipItem.setCollision(2);
                            this.charEquipMents.set(equipId, equipItem);
                            Attacker.character.attach(equipItem, SlotType);
                            equipItem.relativeLocation = location;
                        }
                    })
                })
            } else {
                if (this.charEquipMents.get(equipId)) {
                    this.charEquipMents.get(equipId).destroy();
                }
                Core.GameObject.asyncSpawn({ guid: guid, transform: new Transform(new Vector(0, 0, -1000), rotate, scale) }).then((equipItem: Gameplay.GameObject) => {
                    if (equipItem instanceof Gameplay.StaticMesh) {
                        equipItem.setCollision(2);
                        this.charEquipMents.set(equipId, equipItem);
                        Attacker.character.attach(equipItem, SlotType);
                        equipItem.relativeLocation = location;
                    }
                })
            }
        }
    }
    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        if (SystemUtil.isClient()) {
            let Attacker = Gameplay.getCurrentPlayer();
            InputUtil.onKeyDown(Keys.U, () => {
                this.serverEquipMe(Attacker, "7669", Vector.zero, Vector.one, Rotation.zero, 16);
            })
            InputUtil.onKeyDown(Keys.I, () => {
                this.serverEquipMe(Attacker, "7681", Vector.zero, Vector.one, Rotation.zero, 16);
            })
            InputUtil.onKeyDown(Keys.O, () => {
                this.serverEquipMe(Attacker, "7701", Vector.zero, Vector.one, Rotation.zero, 16);
            })
            InputUtil.onKeyDown(Keys.P, () => {
                this.serverEquipMe(Attacker, "-1", Vector.zero, Vector.one, Rotation.zero, 16);
            })
        }
    }

    /**
     * 周期函数 每帧执行
     * 此函数执行需要将this.useUpdate赋值为true
     * @param dt 当前帧与上一帧的延迟 / 秒
     */
    protected onUpdate(dt: number): void {

    }

    /** 脚本被销毁时最后一帧执行完调用此函数 */
    protected onDestroy(): void {

    }
}

回复

使用道具 举报

72小时热榜
热门版块
快速回复 返回顶部 返回列表