Просмотр исходного кода

修复一个移动的小问题,客户端移动有可能晚于服务端结束,服务端移动完成发过来一个M2C_Stop,导致客户端移动协程结束返回了false。这里要根据错误码来决定客户端移动协程的返回值

tanghai 3 лет назад
Родитель
Сommit
138a82fe85

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Client/Demo/Move/M2C_StopHandler.cs

@@ -14,7 +14,7 @@ namespace ET.Client
 			}
 
 			MoveComponent moveComponent = unit.GetComponent<MoveComponent>();
-			moveComponent.Stop();
+			moveComponent.Stop(message.Error == 0);
 			unit.Position = message.Position;
 			unit.Rotation = message.Rotation;
 			unit.GetComponent<ObjectWait>()?.Notify(new Wait_UnitStop() {Error = message.Error});

+ 1 - 1
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Move/C2M_StopHandler.cs

@@ -5,7 +5,7 @@
 	{
 		protected override async ETTask Run(Unit unit, C2M_Stop message)
 		{
-			unit.Stop(0);
+			unit.Stop(1);
 			await ETTask.CompletedTask;
 		}
 	}

+ 4 - 3
Unity/Assets/Scripts/Codes/Hotfix/Server/Demo/Scenes/Map/Move/MoveHelper.cs

@@ -11,7 +11,7 @@ namespace ET.Server
             float speed = unit.GetComponent<NumericComponent>().GetAsFloat(NumericType.Speed);
             if (speed < 0.01)
             {
-                unit.SendStop(-1);
+                unit.SendStop(2);
                 return;
             }
 
@@ -21,7 +21,7 @@ namespace ET.Server
 
             if (list.Count < 2)
             {
-                unit.SendStop(0);
+                unit.SendStop(3);
                 return;
             }
                 
@@ -41,10 +41,11 @@ namespace ET.Server
 
         public static void Stop(this Unit unit, int error)
         {
-            unit.GetComponent<MoveComponent>().Stop();
+            unit.GetComponent<MoveComponent>().Stop(error == 0);
             unit.SendStop(error);
         }
 
+        // error: 0表示协程走完正常停止
         public static void SendStop(this Unit unit, int error)
         {
             MessageHelper.Broadcast(unit, new M2C_Stop()

+ 9 - 7
Unity/Assets/Scripts/Codes/Hotfix/Share/Module/Move/MoveComponentSystem.cs

@@ -14,7 +14,7 @@ namespace ET
             {
                 try
                 {
-                    self.MoveForward(false);
+                    self.MoveForward(true);
                 }
                 catch (Exception e)
                 {
@@ -70,7 +70,7 @@ namespace ET
 
             using ListComponent<float3> path = ListComponent<float3>.Create();
             
-            self.MoveForward(true);
+            self.MoveForward(false);
                 
             path.Add(unit.Position); // 第一个是Unit的pos
             for (int i = self.N; i < self.Targets.Count; ++i)
@@ -84,7 +84,7 @@ namespace ET
         // 该方法不需要用cancelToken的方式取消,因为即使不传入cancelToken,多次调用该方法也要取消之前的移动协程,上层可以stop取消
         public static async ETTask<bool> MoveToAsync(this MoveComponent self, List<float3> target, float speed, int turnTime = 100)
         {
-            self.Stop();
+            self.Stop(false);
 
             foreach (float3 v in target)
             {
@@ -109,7 +109,8 @@ namespace ET
             return moveRet;
         }
 
-        private static void MoveForward(this MoveComponent self, bool needCancel)
+        // ret: 停止的时候,移动协程的返回值
+        private static void MoveForward(this MoveComponent self, bool ret)
         {
             Unit unit = self.GetParent<Unit>();
             
@@ -174,7 +175,7 @@ namespace ET
                     var tcs = self.tcs;
                     self.tcs = null;
                     self.Clear();
-                    tcs?.SetResult(!needCancel);
+                    tcs?.SetResult(ret);
                     return;
                 }
 
@@ -260,11 +261,12 @@ namespace ET
             return true;
         }
 
-        public static void Stop(this MoveComponent self)
+        // ret: 停止的时候,移动协程的返回值
+        public static void Stop(this MoveComponent self, bool ret)
         {
             if (self.Targets.Count > 0)
             {
-                self.MoveForward(true);
+                self.MoveForward(ret);
             }
 
             self.Clear();