基础位置和缩放同步

This commit is contained in:
宝爷
2021-09-08 22:55:21 +08:00
parent 9cac972a59
commit 7b5ac3ec56
2 changed files with 39 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
import { Component, Label, _decorator, view, director, Node, RichText, tween, Tween, math, randomRange, Vec3 } from "cc";
import { getReplicateObject, makeObjectReplicated } from "../sync/SyncUtil";
import { applyDiff, getReplicateObject, makeObjectReplicated } from "../sync/SyncUtil";
const { ccclass, property } = _decorator;
@@ -12,20 +12,20 @@ export default class SyncExample extends Component {
lastVersion = 0;
onLoad() {
let vec = new Vec3(Vec3.ZERO);
/*let vec = new Vec3(Vec3.ZERO);
makeObjectReplicated(vec);
vec.x = 123;
let diff = getReplicateObject(vec).genDiff(this.lastVersion, this.lastVersion + 1);
console.log(`vec diff ${diff}`);
//makeObjectReplicated(this.leftNode.scale);
//makeObjectReplicated(this.leftNode.position);
console.log(`vec diff ${diff}`);*/
makeObjectReplicated(this.leftNode.scale);
makeObjectReplicated(this.leftNode.position);
}
onSyncClick() {
let diff = getReplicateObject(this.leftNode.scale).genDiff(this.lastVersion, this.lastVersion + 1);
console.log(`scale diff ${diff}`);
diff = getReplicateObject(this.leftNode.scale).genDiff(this.lastVersion, this.lastVersion + 1);
console.log(`pos diff ${diff}`);
let diffScale = getReplicateObject(this.leftNode.scale).genDiff(this.lastVersion, this.lastVersion + 1);
let diffPos = getReplicateObject(this.leftNode.position).genDiff(this.lastVersion, this.lastVersion + 1);
let diff = {scale : diffScale, position: diffPos};
applyDiff(diff, this.rightNode);
}
onRotateClick() {

View File

@@ -49,6 +49,7 @@ export function makePropertyReplicated(target: any, propertyKey: string, descrip
}
if (descriptor) {
// 在不影响原来set方法的基础上自动跟踪属性变化
let oldValue = descriptor.value;
delete descriptor.value;
delete descriptor.writable;
let oldSet = descriptor.set;
@@ -65,11 +66,15 @@ export function makePropertyReplicated(target: any, propertyKey: string, descrip
if (!oldGet) {
descriptor.get = () => {
let repObj = getReplicateObject(target, true);
repObj.getProperty(propertyKey);
return repObj.getProperty(propertyKey);
}
}
console.warn(`${descriptor}`);
Object.defineProperty(target, propertyKey, descriptor);
// 设置默认值
if (oldValue !== undefined) {
target[propertyKey] = oldValue;
}
}
}
@@ -85,6 +90,28 @@ export function makeObjectReplicated(target: any, option?:ReplicatedOption) {
})
}
/**
* 应用变化
* @param diff
* @param target
*/
export function applyDiff(diff : any, target : any) {
for (let propertyName in diff) {
if(diff[propertyName] instanceof Object) {
if (target[propertyName] instanceof Object) {
let prop = target[propertyName];
applyDiff(diff[propertyName], prop);
target[propertyName] = prop;
} else {
console.warn(`apply diff error: ${propertyName},
target.propertyName is ${target[propertyName]} diff ${diff[propertyName]}`);
}
} else {
target[propertyName] = diff[propertyName];
}
}
}
/**
* 属性同步装饰器,只能用于修饰属性,不能用于修饰方法
* @param option 同步选项
@@ -229,17 +256,7 @@ class ReplicateObject {
* 应用差异数据,更新到最新状态
* @param diff
*/
public applyDiff(target: any, diff: any) {
for (let propertyName in diff) {
if(diff[propertyName] instanceof Object) {
if (target[propertyName] instanceof Object) {
this.applyDiff(target[propertyName], diff[propertyName]);
} else {
console.warn(`apply diff error: ${propertyName}, target.propertyName is ${target[propertyName]} diff ${diff[propertyName]}`);
}
} else {
target[propertyName] = diff[propertyName];
}
}
public applyDiff(diff: any) {
applyDiff(diff, this.outter);
}
}