本帖最后由 俊记牛腩面 于 2023-10-31 14:32 编辑
一. 数组元素属性同步中(027已经修复)
服务器更改数组的操作:Array[0] = 0;Array = [0,1,2,3];Array.push(0)均可以同步给客户端
服务器删除数组的操作:
Array.shift()可以同步给客户端
Array.splice()完全不会客户端同步
Array.pop()会通知客户端,但不会同步数组数据
二. 021属性同步有优化带宽,从Json改成了C++里定义好的基础类型,自定义类型可以传Null, Number String Bool Vector等基础类型不能传Null(027也可以穿Null)
样例:
@Component
export default class Replicate extends Script {
@mw.Property({ replicated: true, onChanged: "onHomeChanged" })
homeId: number = 0
@mw.Property({ replicated: true, onChanged: "onVecChanged" })
vec: number[] = [1]
protected onStart(): void {
if (SystemUtil.isClient()) return
this.homeId = null
}
protected onUpdate(dt: number): void {
}
protected onDestroy(): void {
}
onVecChanged() {
}
onHomeChanged() {
console.log("home", this.homeId)
}
}
三. 对于带有mw.Property()标记的引用类型,不要直接用一个变量去多次接受这种变量类型,由于使用的CPU逐渐增加,会导致越来越卡顿。
样例:
@Component
export default class Replicate extends Script {
@mw.Property({ displayName: "移动点1" })
point: Vector = Vector.zero
@mw.Property({ displayName: "移动点2" })
point2: Vector = Vector.zero
private _startPos: Vector
protected onStart(): void {
this.useUpdate = true
}
protected onUpdate(dt: number): void {
this._startPos = this.point;
this._startPos = this.point2;
}
protected onDestroy(): void {
}
}
解决方案:
使用clone(),set()来设置
this._startPos = this.points.clone();
this._startPos = this.points2.clone();
this._startPos.set(this.points);
this._startPos.set(this.points2);
四.自定义属性mw.Type使用方法
/**宠物技能类 */
@Serializable
export class PetSkill {
@mw.Property({ displayName: "技能id" })
skill: number[] = [0]
}
/**玩家宠物类 */
@Serializable
export class Pet {
@mw.Property({ displayName: "宠物名称" })
petName: string = ''
@mw.Property({ displayName: "宠物技能" })
vec: PetSkill[] = [new PetSkill()]
}
@Component
export default class Replicate extends Script {
@mw.Property({ displayName: "角色宠物" })
pets: Pet[] = [new Pet()]
private _startPos: Vector
protected onStart(): void {
this.useUpdate = true
}
protected onUpdate(dt: number): void {
}
protected onDestroy(): void {
}
}
|