From 44bbc763b5060d7b7209772b2febea186e55b2ae Mon Sep 17 00:00:00 2001 From: ZYT <2300409876@qq.com> Date: Sat, 14 Mar 2026 14:47:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=98=E8=82=83=E5=AE=9A?= =?UTF-8?q?=E8=A5=BF=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DC/地形/定西市安定区万达广场 (新).prefab | 67 +++++ .../定西市安定区万达广场 (新).prefab.meta | 7 + Assets/DC/地形/定西市安定区万达广场.fbx | Bin 36160 -> 37984 bytes Assets/DC/地形/定西市安定区万达广场.prefab | 260 +++++++++++++----- ...ongqing_Yuzhong_Hongyadong_Xiakexing.unity | 124 ++++----- .../Gansu_Dingxi_Anding_WandaGuangchang.unity | 233 ++++++++++++---- Assets/_Zombie/Scripts/GameManager.cs | 23 +- .../_Zombie/Scripts/Net/MRNetworkManager.cs | 32 +++ Assets/_Zombie/Scripts/Player.cs | 14 +- 9 files changed, 566 insertions(+), 194 deletions(-) create mode 100644 Assets/DC/地形/定西市安定区万达广场 (新).prefab create mode 100644 Assets/DC/地形/定西市安定区万达广场 (新).prefab.meta diff --git a/Assets/DC/地形/定西市安定区万达广场 (新).prefab b/Assets/DC/地形/定西市安定区万达广场 (新).prefab new file mode 100644 index 00000000..5ad4d169 --- /dev/null +++ b/Assets/DC/地形/定西市安定区万达广场 (新).prefab @@ -0,0 +1,67 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7006527841038631881 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -3901992563441801604, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 2bb3eed0404231447a5670edef51ff1c, type: 2} + - target: {fileID: -3119236414387510727, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: fb8c6fc9a9a57a04aa81ead6f0796e95, type: 2} + - target: {fileID: 919132149155446097, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} + propertyPath: m_Name + value: "\u5B9A\u897F\u5E02\u5B89\u5B9A\u533A\u4E07\u8FBE\u5E7F\u573A (1)" + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 2dbe514b5bae671408e0e54be60abea8, type: 3} diff --git a/Assets/DC/地形/定西市安定区万达广场 (新).prefab.meta b/Assets/DC/地形/定西市安定区万达广场 (新).prefab.meta new file mode 100644 index 00000000..c857aeb9 --- /dev/null +++ b/Assets/DC/地形/定西市安定区万达广场 (新).prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: be5cd1f0d4f38884daaac5a9ceea805d +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/DC/地形/定西市安定区万达广场.fbx b/Assets/DC/地形/定西市安定区万达广场.fbx index 46b77f0b609299536a43d1d41d47f195ad26a05d..0a2c8ba1f9d9a40f4fa63cfce4ea18efda91ad2c 100644 GIT binary patch delta 5746 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 delta 4049 zcmaJ^3s93+7XEXTAgF*MU{oXmMv+&Dii!^cK?Qk;JVl<7gb)%!NI(JQsR)Wsj&4^g zqv-5vyK1dEZaZDKIMYt6ZXb@_(cRJ6cI{f-=~Q;NZnusOd+z;{U#qou=KS~GbIZ|Cc9W=n$N3mU)062uJX!EXZ?oYF(ov%?}UD!erq%Bny*|r8PgmL0KS<$i{;n zaNp>u=OduXBS@`@RnLvps5S9Q^}>X?@dZTjQ(NDC6QqD+%%HMd#IH(>&$sl=jC6=i4VLqu`TX99*_sepD3z z`vJdQb{o!R;nhT?+-@4s5N9}XO61xk3YVHp?1X67U`&D0(O|ALIt}5j6(x42PxlZ6 z`w1;xh5*dhs_;+XJu2kp`)tm8tv0|y>s({VF(hg>i}RQG;;KOUeDtFHOMI8ScF&Mo z9xJo~(N|LQ1i^HbJXgsPD2Hs z(qk0v(S7Lg<;cjxM8bmqFO2HFRd__Fm%WdJx}fKuUJM1y0z;E%;pazW0ft{v=cX#6 zJW|Dwq>x>MF|Lpc4N6gfc7>-?D)3TDwu{El9{gC2Bhq;~9_CJhx>TMdBXJL;;+(v2 zxRuHh1XI&6DK$w|xk|L=cIUo5kYDiZ-pJVX7=85M!FTbfZW@Ngtb$kBVEemF)_akZgP6!CX zwjyu1kU^SZkd=wDrXZ|XHx9;U;?gt?%+JL7v_$ylvxPS@(Y9_LTo)HQvLubfEL;;5 zh|1#0V9H`z*x{{#z_q*@s@vSvFzVcDik+JKJO{+7@T?lL3&z@B0pqnHqh3)A!`;P8 z6sBjh);n9AxNS%C;>0q|nvy?7&n%%oSDeJI&g2qog}F&NIAmYI*i=@g7{Kbc+ajR zLmz8uJe9JD-9oJJA1%w1ZsC7&B zN?@N{z`=g5K!R?40SEiR0uJ`9LTO=qAqV^XLcZ|zvxVb@64x+P&7Y9S@S{~(n+V-O&G8+cptnDw=K|~SGn6*UCvbm!O$IMPgd-x={U4-{bv(b{M zfS`5wUYQbBtiwBHE1;wl&sGMjhPs$xLC9sLz@BZ@+l(4PmRV;oT5}noGmXybkJd>Z z|6Rg8#uYP<&SJ^q7sZlCRSEM5yG!tLqXPFD=VFM)$7jf)O(Ao<{iOtxs@B7#Qi>;J zRGzMs2lTIU7La^+fbTT5d^&tkD*5dx=YC_#m|uIDS#El#|a4ve7!mr9_lf>J`}&J z4u-t-xQ~Xh<|G(gkGmEqu+OZ4d+YIRLnwY_o&l>X@evJGHOpb35^HNR;2)LT<`*^5 zFwcOaESb=0;F=bT20k*NR;j>uERo=6#Lpa|=xLn^twxNoTHu)y~2Rb*ZFdlN9d}~Q9(JEiBRputLz`=$WCOm_rNXGzbhxwun_J6a!AAURYZJW9It^}X zTLEEB_-UIRUTZ>ay90z~ywGlfnr1BTQK7CQ8Ll*A#10jn?pOfxTga*k$91N_i5AjQ zVN>TSn70W(=*|2#V1+B) + /// 移除玩家数据(当玩家断开连接时调用) + /// + [Server] + public void RemovePlayerData(int playerIndex) + { + string key = playerIndex.ToString(); + if (SettleInfos.ContainsKey(key)) + { + SettleInfos.Remove(key); + } + if (players.ContainsKey(playerIndex)) + { + players.Remove(playerIndex); + } } public string SerializeSettleInfos() diff --git a/Assets/_Zombie/Scripts/Net/MRNetworkManager.cs b/Assets/_Zombie/Scripts/Net/MRNetworkManager.cs index ca5d58dd..bace4051 100644 --- a/Assets/_Zombie/Scripts/Net/MRNetworkManager.cs +++ b/Assets/_Zombie/Scripts/Net/MRNetworkManager.cs @@ -140,4 +140,36 @@ public class MRNetworkManager : NetworkRoomManager return -1; } } + + /// + /// 当玩家断开连接时调用(仅在服务器端) + /// + public override void OnServerDisconnect(NetworkConnectionToClient conn) + { + // 获取断开连接的玩家索引 + if (conn.identity != null) + { + Player player = conn.identity.GetComponent(); + if (player != null) + { + Debug.Log($"玩家 {player.index} 断开连接,清理数据"); + // 移除玩家数据 + if (GameManager.Ins != null) + { + GameManager.Ins.RemovePlayerData(player.index); + } + } + } + + base.OnServerDisconnect(conn); + } + + /// + /// 当客户端断开连接时调用(仅在客户端) + /// + public override void OnClientDisconnect() + { + Debug.Log("从机断开连接"); + base.OnClientDisconnect(); + } } diff --git a/Assets/_Zombie/Scripts/Player.cs b/Assets/_Zombie/Scripts/Player.cs index 60d49da4..959da8fb 100644 --- a/Assets/_Zombie/Scripts/Player.cs +++ b/Assets/_Zombie/Scripts/Player.cs @@ -105,7 +105,11 @@ public class Player : NetworkRoomPlayer,IDamagable Collider.enabled = true; } currentHp = maxHp; - GameManager.Ins.players.Add(index,this); + // 添加空引用保护和重复添加检查 + if (GameManager.Ins != null && !GameManager.Ins.players.ContainsKey(index)) + { + GameManager.Ins.players.Add(index, this); + } IsAlive = true; } @@ -160,6 +164,14 @@ public class Player : NetworkRoomPlayer,IDamagable public void Update() { + // 添加空引用保护,防止从机因GameLocal未初始化而掉线 + if (GameLocal.Ins == null || GameLocal.Ins.MRCamera == null || + GameLocal.Ins.Aim == null || GameLocal.Ins.MRLeftControl == null || + GameLocal.Ins.MRRightControl == null) + { + return; + } + Transform mainCamera = GameLocal.Ins.MRCamera.transform; Transform aim = GameLocal.Ins.Aim.transform; Transform leftControl = GameLocal.Ins.MRLeftControl;