本帖最后由 剑寂万古 于 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> |