Bladeren bron

增加变速播放replay的功能

tanghai 2 jaren geleden
bovenliggende
commit
efaa75ec8f

+ 225 - 4
Unity/Assets/Bundles/UI/LockStep/UILSRoom.prefab

@@ -109,6 +109,8 @@ MonoBehaviour:
     gameObject: {fileID: 5523617649012132494}
   - key: predict
     gameObject: {fileID: 2600689584668777061}
+  - key: speed
+    gameObject: {fileID: 1630304769000624977}
 --- !u!1 &443161762425607488
 GameObject:
   m_ObjectHideFlags: 0
@@ -349,6 +351,144 @@ MonoBehaviour:
     m_VerticalOverflow: 0
     m_LineSpacing: 1
   m_Text: Enter text...
+--- !u!1 &1630304769000624977
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2857335348415552923}
+  - component: {fileID: 6359955381904780091}
+  - component: {fileID: 3505199587917922046}
+  - component: {fileID: 8142270086186194903}
+  - component: {fileID: 6500313010546115810}
+  m_Layer: 5
+  m_Name: speed
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2857335348415552923
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1630304769000624977}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 6750276122540731475}
+  m_Father: {fileID: 1594851067972007820}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 274, y: -20}
+  m_SizeDelta: {x: 94.0619, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6359955381904780091
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1630304769000624977}
+  m_CullTransparentMesh: 1
+--- !u!114 &3505199587917922046
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1630304769000624977}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &8142270086186194903
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1630304769000624977}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 3505199587917922046}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &6500313010546115810
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1630304769000624977}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 502d8cafd6a5a0447ab1db9a24cdcb10, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  data:
+  - key: Text
+    gameObject: {fileID: 8042012724120990325}
 --- !u!1 &2520555391245056746
 GameObject:
   m_ObjectHideFlags: 0
@@ -971,13 +1111,14 @@ RectTransform:
   m_Children:
   - {fileID: 1929971304662293886}
   - {fileID: 2420295471407332701}
+  - {fileID: 2857335348415552923}
   m_Father: {fileID: 4771239781044397799}
   m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 152.56421, y: -128.3}
-  m_SizeDelta: {x: 247.2521, y: 40}
+  m_AnchoredPosition: {x: 432, y: -35}
+  m_SizeDelta: {x: 334.0975, y: 40}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &105324571726425836
 CanvasRenderer:
@@ -1236,7 +1377,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 1
+  m_IsActive: 0
 --- !u!224 &8664983122881471485
 RectTransform:
   m_ObjectHideFlags: 0
@@ -1256,7 +1397,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 153.79, y: -86.4}
+  m_AnchoredPosition: {x: 390, y: -35}
   m_SizeDelta: {x: 244.81, y: 40}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &3632380933066769871
@@ -1604,3 +1745,83 @@ MonoBehaviour:
     m_VerticalOverflow: 0
     m_LineSpacing: 1
   m_Text: Save Replay
+--- !u!1 &8042012724120990325
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6750276122540731475}
+  - component: {fileID: 5425149354599216926}
+  - component: {fileID: 1526580319439999924}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6750276122540731475
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8042012724120990325}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2857335348415552923}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5425149354599216926
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8042012724120990325}
+  m_CullTransparentMesh: 1
+--- !u!114 &1526580319439999924
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8042012724120990325}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 20
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 0
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: X1

+ 17 - 0
Unity/Assets/Scripts/Hotfix/Client/LockStep/LSReplayUpdaterSystem.cs

@@ -46,5 +46,22 @@ namespace ET.Client
                 }
             }
         }
+
+        public static void ChangeReplaySpeed(this LSReplayUpdater self)
+        {
+            Room room = self.Room();
+            LSReplayUpdater lsReplayUpdater = room.GetComponent<LSReplayUpdater>();
+            if (lsReplayUpdater.ReplaySpeed == 8)
+            {
+                lsReplayUpdater.ReplaySpeed = 1;
+            }
+            else
+            {
+                lsReplayUpdater.ReplaySpeed *= 2;
+            }
+            
+            int updateInterval = LSConstValue.UpdateInterval / lsReplayUpdater.ReplaySpeed;
+            room.FixedTimeCounter.ChangeInterval(updateInterval, room.AuthorityFrame);
+        }
     }
 }

+ 15 - 3
Unity/Assets/Scripts/HotfixView/Client/LockStep/UI/UILSRoom/UILSRoomComponentSystem.cs

@@ -25,6 +25,8 @@ namespace ET.Client
                     self.jumpToField = rc.Get<GameObject>("jumpToCount").GetComponent<InputField>();
                     self.jump = rc.Get<GameObject>("jump").GetComponent<Button>();
                     self.jump.onClick.AddListener(self.JumpReplay);
+                    self.replaySpeed = rc.Get<GameObject>("speed").GetComponent<Button>();
+                    self.replaySpeed.onClick.AddListener(self.OnReplaySpeedClicked);
                     
                     self.totalFrame.text = self.Room().Replay.FrameInputs.Count.ToString();
                 }
@@ -51,10 +53,13 @@ namespace ET.Client
                     self.frameText.text = room.AuthorityFrame.ToString();
                 }
 
-                if (self.predictFrame != room.PredictionFrame)
+                if (!room.IsReplay)
                 {
-                    self.predictFrame = room.PredictionFrame;
-                    self.predictFrameText.text = room.PredictionFrame.ToString();
+                    if (self.predictFrame != room.PredictionFrame)
+                    {
+                        self.predictFrame = room.PredictionFrame;
+                        self.predictFrameText.text = room.PredictionFrame.ToString();
+                    }
                 }
             }
         }
@@ -71,5 +76,12 @@ namespace ET.Client
             int toFrame = int.Parse(self.jumpToField.text);
             LSHelper.JumpReplay(self.Room(), toFrame);
         }
+        
+        private static void OnReplaySpeedClicked(this UILSRoomComponent self)
+        {
+            LSReplayUpdater lsReplayUpdater = self.Room().GetComponent<LSReplayUpdater>();
+            lsReplayUpdater.ChangeReplaySpeed();
+            self.replaySpeed.gameObject.Get<GameObject>("Text").GetComponent<Text>().text = $"X{lsReplayUpdater.ReplaySpeed}";
+        }
     }
 }

+ 1 - 0
Unity/Assets/Scripts/Model/Client/LockStep/LSReplayUpdater.cs

@@ -3,5 +3,6 @@ namespace ET.Client
     [ComponentOf(typeof(Room))]
     public class LSReplayUpdater: Entity, IAwake, IUpdate
     {
+        public int ReplaySpeed { get; set; } = 1;
     }
 }

+ 0 - 5
Unity/Assets/Scripts/Model/Share/LockStep/LSWorld.cs

@@ -57,11 +57,6 @@ namespace ET
         
         public int Frame { get; set; }
 
-        public long TimeNow()
-        {
-            return LSConstValue.UpdateInterval * this.Frame;
-        }
-
         public void AddToUpdater(LSEntity lsEntity)
         {
             this.updater.Add(lsEntity);

+ 1 - 0
Unity/Assets/Scripts/ModelView/Client/LockStep/UI/UILSRoom/UILSRoomComponent.cs

@@ -12,6 +12,7 @@ namespace ET.Client
         public Text predictFrameText;
         public InputField jumpToField;
         public Button jump;
+        public Button replaySpeed;
         public int frame;
         public int predictFrame;
     }