/// <summary> /// 解码参考编码 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List <SyncedData> Decode(byte[] data) { List <SyncedData> pool = SyncedData.poolList.GetNew(); pool.Clear(); int i = 0; int tick = BitConverter.ToInt32(data, i); i += 4; byte ownerID = data[i++]; byte dropFromPlayerId = data[i++]; bool dropPlayer = data[i++] == 1; //int num2 = tick; while (i < data.Length) { SyncedData syncedData = SyncedData.pool.GetNew(); syncedData.Init(ownerID, tick--);//这里不理解为啥要tick-- syncedData.inputData.Deserialize(data, ref i); pool.Add(syncedData); } if (pool.Count > 0) { pool[0].dropPlayer = dropPlayer; pool[0].dropFromPlayerId = dropFromPlayerId; } return(pool); }
public static List <SyncedData> Decode(byte[] data) { List <SyncedData> @new = poolList.GetNew(); @new.Clear(); int i = 0; int num = BitConverter.ToInt32(data, i); i += 4; byte ownerID = data[i++]; byte b = data[i++]; bool flag = data[i++] == 1; int num2 = num; while (i < data.Length) { SyncedData new2 = SyncedData.pool.GetNew(); new2.Init(ownerID, num2--); new2.inputData.Deserialize(data, ref i); @new.Add(new2); } bool flag2 = @new.Count > 0; if (flag2) { @new[0].dropPlayer = flag; @new[0].dropFromPlayerId = b; } return(@new); }
private SyncedData UpdateData() { bool flag = this.replayMode == ReplayMode.LOAD_REPLAY; SyncedData result; if (flag) // 加载回放模式 { result = null; } else // 非加载回放模式 { SyncedData @new = SyncedData.pool.GetNew(); // 从池中获取 @new.Init(this.localPlayer.ID, this.ticks); this.GetLocalData(@new.inputData); // 把玩家操作数据放入SyncedData实例中 this.localPlayer.AddData(@new); // 把SyncedData实例放入本地玩家的操作数据字典中 bool flag2 = this.communicator != null; if (flag2) // 有通信器 { this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData); // 把最新的操作数据放入_syncedDataCacheUpdateData中 this.communicator.OpRaiseEvent(199, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds); // 发送操作数据 } result = @new; } return(result); }
// 如果不是录像模式;获取本地玩家的输入操作,添加到本地玩家的当前帧同步数据;发送本地玩家操作给其他玩家 private SyncedData UpdateData() { bool flag = this.replayMode == ReplayMode.LOAD_REPLAY; SyncedData result; if (flag) { result = null; } else { // 获取本地玩家的输入操作,添加到本地玩家的当前帧同步数据 SyncedData @new = SyncedData.pool.GetNew(); @new.Init(this.localPlayer.ID, this.ticks); this.GetLocalData(@new.inputData); this.localPlayer.AddData(@new); bool flag2 = this.communicator != null; if (flag2) { // 发送本地玩家操作给其他玩家 this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData); // 199 this.communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds); } result = @new; } return(result); }
/// <summary> /// 收集本地玩家的输入,并通过服务器发送给其他玩家 OnSyncInput在这调用 /// </summary> /// <returns></returns> private SyncedData UpdateData() { SyncedData result; if (this.replayMode == ReplayMode.LOAD_REPLAY) { result = null; } else { SyncedData syncedData = SyncedData.pool.GetNew(); syncedData.Init(this.localPlayer.ID, this.ticks); //本地玩家ID来构造一个空数据包,等待输入数据填充 this.GetLocalData(syncedData.inputData); //TrueSyncManager.GetLocalData, 调用OnSyncedInput();获取本地玩家输入 this.localPlayer.AddData(syncedData); //本地数据直接塞给本地玩家(controls key:ticks value:syncedData 存储玩家每个tick的数据),下面还需要把本地数据发送给远端 if (this.communicator != null) { //因为_syncedDataCacheUpdateData只有一个,所以只获取了一个SyncedData this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData);//从TSplayer的controls里取数据 //把本地玩家的输入数据发给远端玩家 this.communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds); } result = syncedData; } return(result); }
public SyncedData clone() { SyncedData @new = SyncedData.pool.GetNew(); @new.Init(this.inputData.ownerID, this.tick); @new.inputData.CopyFrom(this.inputData); return(@new); }
/// <summary> /// 收集本地输入,通过服务器发送给其他玩家 /// </summary> /// <returns></returns> private SyncedData UpdateData() { Debug.Log("UpdateData"); SyncedData result; if (replayMode == ReplayMode.LOAD_REPLAY) { result = null; } else { SyncedData @new = SyncedData.pool.GetNew(); @new.Init(localPlayer.ID, ticks); GetLocalData(@new.inputData); //调用OnSyncedInput();输入数据给到@new.inputData里面 localPlayer.AddData(@new); //数据塞给TSPlayer的controls if (communicator != null) { localPlayer.GetSendData(ticks, _syncedDataCacheUpdateData); //从TSplayer的controls里取数据 communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(_syncedDataCacheUpdateData), true, auxActivePlayersIds); //将自己的输入数据发给其他玩家 } result = @new; } return(result); }