refactor(nav): 敌人移动改为物理原生架构——根治 TBM 与 Dynamic 刚体冲突
根因: NavAgent.Position setter 直接写 transform.position, TBM 段移动每帧写它, 与敌人 Dynamic 刚体(重力/碰撞)冲突(旧代码靠"NavDriving清零velocity"缓解,但对Dynamic刚体直接 写transform.position本就不推荐,易卡墙/穿透/被物理覆盖)。 根本解: 寻路降为"顾问"(只给方向),移动执行归物理: - EnemyNavAgent.Awake 禁用 TBM.SegmentMovement(不再写 transform.position); - FixedUpdate 改物理原生桥: 朝 PathSubGoal 写 MoveDir+MoveSpeed 由 EnemyMovement 施加 velocity+重力执行, 到达子目标时 CompleteSegmentTraversal 推进段(原由TBM负责); - EnemyMovement 撤掉 NavDriving 的清零velocity/只朝向门, nav方向统一走velocity移动。 保留击退/击飞/落地等全部物理反馈。 附带修 PerceptionStateMachine: 追击维持改"追逐区 OR 视野区"任一(视野los可能被墙挡漏检, 仅靠视野会导致玩家在近身追逐区内却Chase↔Patrol抖动、nav被反复Stop不移动)。 PlayMode 验证: 敌人 nav 巡逻/追击均用velocity移动(FollowPath/onSeg=True)、追击稳定无抖动。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -52,7 +52,8 @@ namespace BaseGames.Enemies
|
||||
.To(c.Chase).When(x => x.Sensor.InChaseZone(), "InChaseZone")
|
||||
.To(c.Rest).When(x => !x.Sensor.InVisionZone(), "leftVision");
|
||||
|
||||
// 追击:委托能力实现移动/伤害;脱离视野 → R(永不回警觉);退出时中断追击能力
|
||||
// 追击:委托能力实现移动/伤害;脱离**全部感知**(追逐区 且 视野区都不在) → R(永不回警觉);退出时中断追击能力。
|
||||
// 维持用"追逐区 OR 视野区"任一:视野(los)可能被墙挡而漏检,仅靠视野会导致玩家在近身追逐区内却反复进出追击(抖动)。
|
||||
b.State(c.Chase)
|
||||
.OnEnter(x =>
|
||||
{
|
||||
@@ -60,7 +61,7 @@ namespace BaseGames.Enemies
|
||||
if (!string.IsNullOrEmpty(c.ChaseAbilityId)) x.Combat.UseAbility(c.ChaseAbilityId);
|
||||
})
|
||||
.OnExit(x => c.OnChaseExit?.Invoke(x))
|
||||
.To(c.Rest).When(x => !x.Sensor.InVisionZone(), "leftVision");
|
||||
.To(c.Rest).When(x => !x.Sensor.InChaseZone() && !x.Sensor.InVisionZone(), "leftAllZones");
|
||||
|
||||
b.State(c.Death).OnEnter(x => c.OnDeathEnter?.Invoke(x));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user