feat: Add HurtBoxOwnerGuard to prevent multiple damage registrations from the same HitBox activation
- Implemented HurtBoxOwnerGuard to ensure that multiple HurtBoxes on the same character do not register damage multiple times during a single HitBox activation. - Added custom editor for HitBox to facilitate the creation of shape colliders with HitBoxColliderProxy. - Introduced PhysicsPerceptionSystem for enemy perception, supporting multiple detection modes including RangeCircle, BatchLOS, FanCast, and BoxCast. - Created EnemyPatrolZone to define patrol and chase areas for enemies, allowing for shared zones among multiple enemies. - Added BD_IsOutsideZone conditional task for Behavior Designer to check if an enemy or player is outside a defined patrol zone.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using BaseGames.Enemies;
|
||||
|
||||
namespace BaseGames.Enemies.Navigation
|
||||
{
|
||||
@@ -48,10 +49,11 @@ namespace BaseGames.Enemies.Navigation
|
||||
public event Action OnGoalReached;
|
||||
|
||||
// ── 状态 ───────────────────────────────────────────────────────
|
||||
private Rigidbody2D _rb;
|
||||
private Vector2? _destination;
|
||||
private bool _isMoving;
|
||||
private bool _goalFired;
|
||||
private Rigidbody2D _rb;
|
||||
private EnemyMovement _movement;
|
||||
private Vector2? _destination;
|
||||
private bool _isMoving;
|
||||
private bool _goalFired;
|
||||
|
||||
private float _hoverTimer;
|
||||
private float _hoverFlipTimer;
|
||||
@@ -67,7 +69,8 @@ namespace BaseGames.Enemies.Navigation
|
||||
// ── Unity 生命周期 ─────────────────────────────────────────────
|
||||
private void Awake()
|
||||
{
|
||||
_rb = GetComponent<Rigidbody2D>();
|
||||
_rb = GetComponent<Rigidbody2D>();
|
||||
_movement = GetComponent<EnemyMovement>();
|
||||
_rb.gravityScale = 0f;
|
||||
_rb.constraints = RigidbodyConstraints2D.FreezeRotation;
|
||||
}
|
||||
@@ -139,13 +142,23 @@ namespace BaseGames.Enemies.Navigation
|
||||
Vector2 newPos = Vector2.MoveTowards(myPos, target, _moveSpeed * Time.fixedDeltaTime);
|
||||
_rb.MovePosition(newPos);
|
||||
|
||||
// 面向移动方向
|
||||
// 面向移动方向(通过 EnemyMovement 输入信号,保持 _facingDir 与动画系统同步)
|
||||
float dx = target.x - myPos.x;
|
||||
if (Mathf.Abs(dx) > 0.05f)
|
||||
{
|
||||
var s = transform.localScale;
|
||||
s.x = Mathf.Abs(s.x) * Mathf.Sign(dx);
|
||||
transform.localScale = s;
|
||||
int dir = dx > 0f ? 1 : -1;
|
||||
if (_movement != null)
|
||||
{
|
||||
_movement.PendingInput.WantFace = true;
|
||||
_movement.PendingInput.FaceDir = dir;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 降级:没有 EnemyMovement 时直接翻转(独立飞行单位)
|
||||
var s = transform.localScale;
|
||||
s.x = Mathf.Abs(s.x) * dir;
|
||||
transform.localScale = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user