[设计心得] 小游戏-球球大作战(1)-食物模块

[复制链接]
527 |2
剑寂万古 发表于 2023-11-22 09:54:40 | 显示全部楼层 |阅读模式

本帖最后由 剑寂万古 于 2023-11-22 09:54 编辑

简介

这篇文章讲类似球球大作战的食物模块如何在口袋方舟中复刻为3d版本,并且拥有一个偏低的性能消耗

食物模块

生成思路

如果我们想要尽可能的降低消耗,我们最好不要使用双端物体,因为这样会涉及到一些双端的生成以及销毁的同步,我这里选择在服务器统一生成食物的信息,然后发送到客户端通过预制体各自生成单端对象

/**
 * 食物类型
 */
export enum EmFoodType {
    Normal = 0,
}
/**
 * 食物信息,用于双端同步
 */
export class FoodInfo {
    /**
     * 独立id 用于确保食物的唯一性
     */
    uuid: string;
    /**
     * 生成位置
     */
    loc: Vector;
    /**
     * 吃掉之后获得的分数
     */
    score: number;
    /**
     * 食物类型
     */
    type: EmFoodType;
}
/**
 * 食物在客户端的表现类
 */
export class Food extends FoodInfo {
    /**
     * 食物在客户端的对象,每个客户端独立存在
     */
    obj: GameObject;
}

检查逻辑

食物数量会很多,不能在每个食物中都判断检查逻辑,所以这里在球上加装触发器,通过一个event分发触碰到的物体guid来检测是否碰到的是食物

/**
     * 开始模块,可以进行模块间的调用
     */
    override onStart(): void {
        super.onStart();
        // 本地监听球碰到物体事件
        Event.addLocalListener(GlobalConst.C2CEvent_CheckObject, this.checkEatFood.bind(this))
    }

    /**
     * 检查是否吃到食物
     * @param guid 食物guid
     * @param checkerUUID 检查者的信息
     */
    checkEatFood(guid: string, checkerUUID: string) {
        const food = this.foods.find((food) => food.obj.getChildren()[0].gameObjectId == guid);
        if (food) {
            console.log("吃到食物", food.uuid);
            this.server.net_eatFood(food.uuid, checkerUUID);
        }
    }

实际效果演示

<video controls src="https://cdn.233xyx.com/online/s1fYHeut3vZC1700618668858.mp4"></video>

回复

使用道具 举报

汽汽汽汽水 发表于 2023-11-22 14:28:05 | 显示全部楼层
这种检测也可以直接用 静态模型得 onTouch 事件,就不用挂触发器了
回复

使用道具 举报

剑寂万古楼主 发表于 2023-11-22 15:31:55 | 显示全部楼层
汽汽汽汽水 发表于 2023-11-22 14:28
这种检测也可以直接用 静态模型得 onTouch 事件,就不用挂触发器了

get,有空试一下
回复

使用道具 举报

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