public static void AddToTimeline(LockstepInputs inputs) { if (inputs.TickId < 0) { Index = 0; lockstepInputs.Clear(); OnRestart?.Invoke(); } if (inputs.TickId != lockstepInputs.Count) { return; } lockstepInputs.Add(inputs); inputTrackDict.Add(inputs.TickId, new List <Dictionary <int, Dictionary <Type, List <IInput> > > >()); if (inputs.UserInputs != null && inputs.UserInputs.Length > 0) { for (int i = 0; i < inputs.UserInputs.Length; i++) { var dict = new Dictionary <int, Dictionary <Type, List <IInput> > >(); for (int j = 0; j < inputs.UserInputs[i].Length; j++) { var userInputs = inputs.UserInputs[i][j]; dict.Add(userInputs.UserId, new Dictionary <Type, List <IInput> >()); if (userInputs.InputData != null) { for (int k = 0; k < userInputs.InputData.Length; k++) { var input = MessagePackUtility.Deserialize <IInput>(userInputs.InputData[k]); var type = input.GetType(); if (!dict[userInputs.UserId].ContainsKey(type)) { dict[userInputs.UserId].Add(type, new List <IInput>()); } dict[userInputs.UserId][type].Add(input); } } } inputTrackDict[inputs.TickId].Add(dict); } } }
public override void OnEnable() { base.OnEnable(); NetworkSystem.Receive(RequestCode.Input).Subscribe(data => { if (data.Mode == SessionMode.Offline) { UserInputs userInputs = MessagePackUtility.Deserialize <UserInputs>(data.Value); userInputs.UserId = 0; LockstepInputs lockstepInputs = LockstepUtility.CreateLockstepInputs(userInputs); NetworkSystem.Publish(RequestCode.Lockstep, MessagePackUtility.Serialize(lockstepInputs)); } }).AddTo(this.Disposer); NetworkSystem.Receive(RequestCode.Lockstep).Subscribe(data => { LockstepInputs lockstepInputs = MessagePackUtility.Deserialize <LockstepInputs>(data.Value); LockstepUtility.AddToTimeline(lockstepInputs); }).AddTo(this.Disposer); }