diff --git a/Assets/_DefendNJ/Prefabs/AI/Enemy/EnemyAi.asset b/Assets/_DefendNJ/Prefabs/AI/Enemy/EnemyAi.asset index c248fa99..fe9891b0 100644 --- a/Assets/_DefendNJ/Prefabs/AI/Enemy/EnemyAi.asset +++ b/Assets/_DefendNJ/Prefabs/AI/Enemy/EnemyAi.asset @@ -32,8 +32,8 @@ MonoBehaviour: Get Target","Instant":true,"SharedVector3targetPos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"targetPos","IsShared":true,"Vector3mValue":"(0,0,0)"},"SinglemissOffset":3},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(-339.512115,190)"},"ID":18,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"Actions+EnemyAttack","NodeData":{"Offset":"(-204.535477,190.956482)"},"ID":19,"Name":"Enemy Attack","Instant":true,"SharedVector3targetPos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"targetPos","IsShared":true,"Vector3mValue":"(0,0,0)"},"SharedGameObjecttarget":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"target","IsShared":true}},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(-72.50268,190.075531)"},"ID":20,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":2},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"Actions+EnemyStopAttack","NodeData":{"Offset":"(89.7573853,190.49791)"},"ID":21,"Name":"Enemy Stop Attack","Instant":true},{"Type":"Actions+SetEnemyState","NodeData":{"Offset":"(286.0865,194.369)"},"ID":22,"Name":"Set - Enemy State","Instant":true,"SharedIntstate":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":2}}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(842.262451,104.385406)"},"ID":23,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Conditionals+CheckEnemyState","NodeData":{"Offset":"(-191.632858,244.534729)"},"ID":24,"Name":"Check - Enemy State","Instant":true,"SharedIntstate":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":4}},{"Type":"Actions+EnemyMoveTarget","NodeData":{"Offset":"(-28.2369118,249.678986)"},"ID":25,"Name":"Enemy + Enemy State","Instant":true,"SharedIntstate":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":2}}]}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(842.262451,104.385406)"},"ID":23,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"Conditionals+CheckEnemyState","NodeData":{"Offset":"(-221.632858,214.534729)"},"ID":24,"Name":"Check + Enemy State","Instant":true,"SharedIntstate":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":4}},{"Type":"Actions+EnemyMoveTarget","NodeData":{"Offset":"(-8.236912,269.679)"},"ID":25,"Name":"Enemy Move Target","Instant":true,"SharedGameObjectTargetObj":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"target","IsShared":true},"SharedVector3TargetPos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":null,"Vector3mValue":"(0,0,0)"}},{"Type":"Actions+EnemyMeleeAttack","NodeData":{"Offset":"(182.048218,254.952332)"},"ID":26,"Name":"Enemy Melee Attack","Instant":true,"SharedGameObjecttarget":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"target","IsShared":true},"SharedVector3targetPos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"targetPos","IsShared":true,"Vector3mValue":"(0,0,0)"}},{"Type":"Actions+SetEnemyState","NodeData":{"Offset":"(391.4281,250.9524)"},"ID":27,"Name":"Set Enemy State","Instant":true,"SharedIntstate":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":5}}]}]},"DetachedTasks":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(2965.1272,1720.00122)","Comment":"\u8fb9\u8d70\u8fb9\u5c04"},"ID":28,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Inverter","NodeData":{"Offset":"(-333.165771,176.051178)"},"ID":29,"Name":"Inverter","Instant":true,"Children":[{"Type":"Conditionals+EnemyInMinAtkArea","NodeData":{"Offset":"(148.571472,0)"},"ID":30,"Name":"Enemy diff --git a/Assets/_DefendNJ/Scenes/Hebei_Hengshui_Xinji_WandaGuangchang.unity b/Assets/_DefendNJ/Scenes/Hebei_Hengshui_Xinji_WandaGuangchang.unity index 4f283fdd..34f8b5e0 100644 --- a/Assets/_DefendNJ/Scenes/Hebei_Hengshui_Xinji_WandaGuangchang.unity +++ b/Assets/_DefendNJ/Scenes/Hebei_Hengshui_Xinji_WandaGuangchang.unity @@ -9455,7 +9455,7 @@ MonoBehaviour: IncludeChildColliders: 0 RuntimeFollower: {fileID: 0} colliderMaxDistance: 100 - lastTimeMaxDistanceCalced: 639015067460997471 + lastTimeMaxDistanceCalced: 639016516227598569 --- !u!82 &675942809 AudioSource: m_ObjectHideFlags: 0 @@ -37569,7 +37569,7 @@ Transform: m_GameObject: {fileID: 1055368663627100180} serializedVersion: 2 m_LocalRotation: {x: -0.20215413, y: -0.67759407, z: -0.20215413, w: 0.67759407} - m_LocalPosition: {x: -4.5, y: -0.96795833, z: 1.16} + m_LocalPosition: {x: -4.5, y: -1.05, z: 1.16} m_LocalScale: {x: 0.2205899, y: 0.22058992, z: 0.22058992} m_ConstrainProportionsScale: 0 m_Children: [] @@ -47239,48 +47239,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 2147483647 m_IsActive: 1 ---- !u!23 &710482620910447176 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359199085140839325} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 5ba23599d58f976469517270c9fe312f, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!4 &718613164925462691 Transform: m_ObjectHideFlags: 0 @@ -80397,24 +80355,6 @@ ParticleSystem: m_PostInfinity: 2 m_RotationOrder: 4 vectorLabel1_3: W ---- !u!1 &1359199085140839325 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1843952404725977383} - - component: {fileID: 3330644350964358786} - - component: {fileID: 710482620910447176} - m_Layer: 3 - m_Name: "\u6C99\u5305" - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 2147483647 - m_IsActive: 1 --- !u!4 &1394062483372866110 Transform: m_ObjectHideFlags: 0 @@ -99838,21 +99778,6 @@ ParticleSystem: m_PostInfinity: 2 m_RotationOrder: 4 vectorLabel1_3: W ---- !u!4 &1843952404725977383 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359199085140839325} - serializedVersion: 2 - m_LocalRotation: {x: 0.08206135, y: 0.21299867, z: 0.032589767, w: 0.9730547} - m_LocalPosition: {x: -8.916, y: -0.18395829, z: -2.7474573} - m_LocalScale: {x: 43.054195, y: 43.0542, z: 43.0542} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5223202118933388925} - m_LocalEulerAnglesHint: {x: 8.385, y: 25.113, z: 5.707} --- !u!1 &1861744935794495146 GameObject: m_ObjectHideFlags: 0 @@ -115325,14 +115250,6 @@ ParticleSystemRenderer: m_MeshWeighting2: 1 m_MeshWeighting3: 1 m_MaskInteraction: 0 ---- !u!33 &3330644350964358786 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359199085140839325} - m_Mesh: {fileID: 2112626415416172861, guid: 0e36f6927aa66514a954a64dc2039107, type: 3} --- !u!1 &3346820370595432553 GameObject: m_ObjectHideFlags: 0 @@ -154670,7 +154587,6 @@ Transform: - {fileID: 427486382716496558} - {fileID: 5728897609628210735} - {fileID: 2494451346798751775} - - {fileID: 1843952404725977383} - {fileID: 2380126651628561463} - {fileID: 2538874313939834683} - {fileID: 500581087} @@ -178708,7 +178624,7 @@ Transform: m_GameObject: {fileID: 4957041149598043285} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0.7071068, z: -0, w: 0.7071068} - m_LocalPosition: {x: 486.4, y: 2.02605, z: -206.65} + m_LocalPosition: {x: 486.4, y: 1.8, z: -206.65} m_LocalScale: {x: 0.59342, y: 0.59342, z: 0.59342} m_ConstrainProportionsScale: 0 m_Children: diff --git a/Assets/_DefendNJ/Scripts/Behaviors/Conditionals.cs b/Assets/_DefendNJ/Scripts/Behaviors/Conditionals.cs index 0f55fe14..50a942cd 100644 --- a/Assets/_DefendNJ/Scripts/Behaviors/Conditionals.cs +++ b/Assets/_DefendNJ/Scripts/Behaviors/Conditionals.cs @@ -215,6 +215,15 @@ public class Conditionals public override TaskStatus OnUpdate() { return GameManager.Ins.gameState== GameState.EndEvent ? TaskStatus.Success : TaskStatus.Failure; + + } + } + public class IsGamePKEvent :Conditional + { + public override TaskStatus OnUpdate() + { + return GameManager.Ins.gameState== GameState.PKEvent ? TaskStatus.Success : TaskStatus.Failure; + } } @@ -225,4 +234,5 @@ public class Conditionals return GameManager.Ins.EnemyList.Count<=0 ? TaskStatus.Success : TaskStatus.Failure; } } + } diff --git a/Assets/_DefendNJ/Scripts/Enemys/Enemy/Enemy.cs b/Assets/_DefendNJ/Scripts/Enemys/Enemy/Enemy.cs index 6def81b6..b5a73b12 100644 --- a/Assets/_DefendNJ/Scripts/Enemys/Enemy/Enemy.cs +++ b/Assets/_DefendNJ/Scripts/Enemys/Enemy/Enemy.cs @@ -33,6 +33,7 @@ public enum EnemyState public class Enemy : Agent { private BehaviorTree _behaviorTree; + public bool isEndEventEnemy = false; public BehaviorTree behaviorTree { get @@ -161,7 +162,7 @@ public class Enemy : Agent if (isServer) { state = EnemyState.Borning; - if (GameManager.Ins.gameState == GameState.EndEvent) + if (GameManager.Ins.gameState == GameState.EndEvent|| GameManager.Ins.gameState == GameState.PKEvent) state = EnemyState.Atk; if (aiPath != null) aiPath.enabled = true; if (rvoController != null) rvoController.enabled = true; @@ -234,20 +235,49 @@ public class Enemy : Agent { if (behaviorTree != null) { - target=(GameObject)behaviorTree.GetVariable("target").GetValue(); - + // 检查是否为PK事件 + if (GameManager.Ins != null && GameManager.Ins.isPkEvent) + { + // PK事件中,目标改为玩家(Player) + GameObject player = GameManager.Ins.GetPlayer(transform); + if (player != null) + { + target = player; + // 同时更新行为树中的目标变量 + var sharedTarget = behaviorTree.GetVariable("target") as SharedGameObject; + if (sharedTarget != null) + { + sharedTarget.Value = target; + } + } + } + else + { + // 非PK事件,按原有逻辑获取目标 + var sharedTarget = behaviorTree.GetVariable("target") as SharedGameObject; + if (sharedTarget != null) + { + target = sharedTarget.Value; + } + } } - + if (target != null) { - transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(target.transform.position.ReflectVectorXOZ() - transform.position), Time.deltaTime * 10f); + transform.rotation = Quaternion.Lerp(transform.rotation, + Quaternion.LookRotation(target.transform.position.ReflectVectorXOZ() - transform.position), + Time.deltaTime * 10f); } else { - Vector3 targetPos = (Vector3)behaviorTree.GetVariable("targetPos").GetValue(); - if (targetPos != Vector3.zero) + // 获取目标位置变量 + var targetPosVar = behaviorTree.GetVariable("targetPos") as SharedVector3; + if (targetPosVar != null && targetPosVar.Value != Vector3.zero) { - transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(new Vector3(targetPos.x,transform.position.y,targetPos.z) - transform.position), Time.deltaTime * 10f); + Vector3 targetPos = targetPosVar.Value; + transform.rotation = Quaternion.Lerp(transform.rotation, + Quaternion.LookRotation(new Vector3(targetPos.x, transform.position.y, targetPos.z) - transform.position), + Time.deltaTime * 10f); } } } @@ -420,25 +450,45 @@ public class Enemy : Agent /// 发起一次攻击(播放攻击动画,Server 上触发伤害判定/事件) /// - BehaviorTree 在 host 上执行时应调用 DoAttack(),并在动画的事件帧调用真正的伤害函数(或在 DoAttackCoroutine 中等待到事件再次调用) /// - public virtual void DoAttack(Vector3 target) + public virtual void DoAttack(Vector3 attackTarget) { - if (!isServer) return; // 攻击判定/伤害应由 Server 执行(Host 权威) - if (GameManager.Ins.gameState == GameState.EndEvent) + if (!isServer) return; + + // PK事件中,如果当前目标不是玩家,则重新获取玩家作为目标 + if (GameManager.Ins != null && GameManager.Ins.isPkEvent) { - AnimatorComponent.SetInteger("state",5); + GameObject playerTarget = GameManager.Ins.GetPlayer(transform); + if (playerTarget != null) + { + target = playerTarget; + // 更新行为树中的目标 + if (behaviorTree != null) + { + var sharedTarget = behaviorTree.GetVariable("target") as SharedGameObject; + if (sharedTarget != null) + { + sharedTarget.Value = target; + } + } + } + } + + if (GameManager.Ins.gameState == GameState.EndEvent || GameManager.Ins.gameState == GameState.PKEvent) + { + AnimatorComponent.SetInteger("state", 5); if (!isWaitDie) { int dieTime = Random.Range(30, 61); CoroutineTaskManager.Instance.WaitSecondTodo(() => { - if(!isDead) - Die(null,transform); + if (!isDead) + Die(null, transform); }, dieTime); isWaitDie = true; } return; } - AnimatorComponent.SetInteger("state",1); + AnimatorComponent.SetInteger("state", 1); } public virtual void CreateItem() diff --git a/Assets/_DefendNJ/Scripts/GameLocal.cs b/Assets/_DefendNJ/Scripts/GameLocal.cs index 373c22e6..cc7a3fb6 100644 --- a/Assets/_DefendNJ/Scripts/GameLocal.cs +++ b/Assets/_DefendNJ/Scripts/GameLocal.cs @@ -69,6 +69,7 @@ public enum Place Chengdu_Shuangliu_ShengfeiXuexiao =43, Hebei_Hengshui_Xinji_WandaGuangchang = 44, Ningxia_Yinchuan_Jinfeng_XinhualianGuangchang = 45, + Hunan_Zhuzhou_Wanda_Shennongcheng_Chaowanshe=46, } public class GameLocal : MonoBehaviour diff --git a/Assets/_DefendNJ/Scripts/Manager/GameManager.cs b/Assets/_DefendNJ/Scripts/Manager/GameManager.cs index 3f8357e8..5389d98b 100644 --- a/Assets/_DefendNJ/Scripts/Manager/GameManager.cs +++ b/Assets/_DefendNJ/Scripts/Manager/GameManager.cs @@ -1,3 +1,4 @@ +using BehaviorDesigner.Runtime; using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Engines; using Common; using DarkTonic.MasterAudio; @@ -172,7 +173,7 @@ public class GameManager : NetworkBehaviour [SyncVar] public long vistEnd = 0; // 总游玩时长 - private int vistAllTime = (int)(60*12);//开启最后拼刺刀模式 + private int vistAllTime = (int)(60*2);//开启最后拼刺刀模式 [SyncVar] public string settleData = ""; @@ -446,6 +447,12 @@ public class GameManager : NetworkBehaviour PlaySound2DRPC("1.61"); OpenDoor(); } + else + { + // 如果是PK事件,设置游戏状态 + gameState = GameState.PKEvent; + isPkEvent = true; + } GivePistol(GunType.MeleeWeapon); foreach (var item in PlayerAiList.Values) { @@ -589,7 +596,27 @@ public class GameManager : NetworkBehaviour PlayerAiList.Add(i + 2, playerAI); } } - + // 对于现有的敌人,更新它们的目标 + foreach (var enemy in EnemyList.Values) + { + if (enemy.behaviorTree != null) + { + // 如果isPkEvent为true,更新敌人的目标为玩家 + if (isPkEvent) + { + GameObject player = GetPlayer(enemy.transform); + if (player != null) + { + enemy.target = player; + var sharedTarget = enemy.behaviorTree.GetVariable("target") as SharedGameObject; + if (sharedTarget != null) + { + sharedTarget.Value = player; + } + } + } + } + } curRoundEnemyCount = EnemyList.Count; // 可选:在指定场地时添加调试可视化 @@ -649,7 +676,16 @@ public class GameManager : NetworkBehaviour if(!isStart|| gameState== GameState.EndEvent) return; GetRoundEnemy(); - SetGameState(GameState.Playing); + if(isPkEvent ==true ) + { + SetGameState(GameState.PKEvent ); + } + else + { + SetGameState(GameState.Playing ); + + } + }, roundWaveTime); } @@ -802,7 +838,8 @@ public class GameManager : NetworkBehaviour if (isPk) { isPkEvent = true; - PlayEndEvent(false); + gameState = GameState.PKEvent; + PlayEndEvent(false); } else { @@ -1132,17 +1169,24 @@ public class GameManager : NetworkBehaviour ChangePlayerAiCountdownTime(); if (curRoundEnemyCount<=0) { + // 如果是PK事件结束,重置PK事件标志 + if (gameState == GameState.PKEvent) + { + isPkEvent = false; + gameState = GameState.Playing; + + // 创建下一波敌人 CreateNextRound(); - //if (gameState == GameState.PKEvent ) - //{ - // gameState = GameState.Playing; - // CreateNextRound(); - //} - if (gameState == GameState.EndEvent) - { - gameState = GameState.Victory; - GameOver(); - } + } + else if (gameState == GameState.EndEvent) + { + gameState = GameState.Victory; + GameOver(); + } + else + { + CreateNextRound(); + } } } @@ -1881,5 +1925,6 @@ public class GameManager : NetworkBehaviour } #endregion + }