diff --git a/Runtime/GameKcpClient.cs b/Runtime/GameKcpClient.cs
index 904eaef..8d8d622 100644
--- a/Runtime/GameKcpClient.cs
+++ b/Runtime/GameKcpClient.cs
@@ -98,6 +98,11 @@ namespace DofLibrary
                 //Debug.Log("[ProcessMessage]GameFinish");
                 _receiver.OnGameFinish(serverMessage.GameFinish);
             }
+            else if (serverMessage.Heartbeat != null)
+            {
+                //Debug.Log("[ProcessMessage]Heartbeat");
+                _receiver.OnHeartbeat(serverMessage.Heartbeat);
+            }
         }
 
         /// 
diff --git a/Runtime/IMessageReceiver.cs b/Runtime/IMessageReceiver.cs
index ad195ae..77af518 100644
--- a/Runtime/IMessageReceiver.cs
+++ b/Runtime/IMessageReceiver.cs
@@ -41,5 +41,10 @@ namespace DofLibrary
         /// 
         /// 两个玩家的得分
         void OnGameFinish(GameFinish gameFinish);
+
+        /// 
+        /// 心跳包
+        /// 
+        void OnHeartbeat(Heartbeat heartbeat);
     }
 }
\ No newline at end of file
diff --git a/Runtime/NetworkGen/Messages.cs b/Runtime/NetworkGen/Messages.cs
index 3f7c664..001e061 100644
--- a/Runtime/NetworkGen/Messages.cs
+++ b/Runtime/NetworkGen/Messages.cs
@@ -137,6 +137,15 @@ namespace Dof
         public bool ShouldSerializeGameFinish() => __pbn__actual.Is(5);
         public void ResetGameFinish() => global::ProtoBuf.DiscriminatedUnionObject.Reset(ref __pbn__actual, 5);
 
+        [global::ProtoBuf.ProtoMember(21, Name = @"heartbeat")]
+        public Heartbeat Heartbeat
+        {
+            get => __pbn__actual.Is(21) ? ((Heartbeat)__pbn__actual.Object) : default;
+            set => __pbn__actual = new global::ProtoBuf.DiscriminatedUnionObject(21, value);
+        }
+        public bool ShouldSerializeHeartbeat() => __pbn__actual.Is(21);
+        public void ResetHeartbeat() => global::ProtoBuf.DiscriminatedUnionObject.Reset(ref __pbn__actual, 21);
+
     }
 
     [global::ProtoBuf.ProtoContract()]
@@ -191,6 +200,9 @@ namespace Dof
         [global::System.ComponentModel.DefaultValue("")]
         public string IosGeneration { get; set; } = "";
 
+        [global::ProtoBuf.ProtoMember(4, Name = @"diff_count")]
+        public int DiffCount { get; set; }
+
     }
 
     [global::ProtoBuf.ProtoContract()]
diff --git a/Runtime/ServerProto/messages.proto b/Runtime/ServerProto/messages.proto
index 658de79..f1643f5 100644
--- a/Runtime/ServerProto/messages.proto
+++ b/Runtime/ServerProto/messages.proto
@@ -24,6 +24,8 @@ message ServerMessage {
     LevelStart level_start = 3;
     PointFound point_found = 4;
     GameFinish game_finish = 5;
+
+    Heartbeat heartbeat = 21;
   }
 }
 
@@ -41,6 +43,7 @@ message LevelResource {
   string level_id = 1;
   string android_generation = 2;
   string ios_generation = 3;
+  int32 diff_count = 4;
 }
 
 // PlayerEntered 服务端接收到 PlayerEnter 消息后发还给客户端的回执