Add WeaponFeedback component and AddressableManagerWindow meta file

- Implemented WeaponFeedback class for handling weapon-related feedbacks such as hit effects and attack sounds.
- Added meta file for AddressableManagerWindow to manage addressable assets.
- Included a new jump.data file for profiler data.
This commit is contained in:
2026-05-22 22:03:32 +08:00
parent 3e1f234ddc
commit b7baf7ad6a
44 changed files with 1783 additions and 1927 deletions

View File

@@ -46,8 +46,12 @@ namespace BaseGames.Player
private bool _facingLocked; // 为 true 时 UpdateFacing() 不覆盖朝向
private bool _cancelWindowOpen;
private SurfaceType _currentSurface = SurfaceType.Ground;
private readonly Collider2D[] _groundBuffer = new Collider2D[4];
private int _groundHitCount;
private bool _wasGrounded;
// 跳跃/二段跳期间禁用斜坡吸附,防止把起跳判定成斜坡而立即下压
private bool _slopeSnapDisabled;
private readonly Collider2D[] _groundBuffer = new Collider2D[4];
private int _groundHitCount;
private readonly ContactPoint2D[] _slopeContactBuffer = new ContactPoint2D[8];
#if UNITY_EDITOR
// ── 运行时调试Inspector 中可见)───────────────────────────────
@@ -118,17 +122,20 @@ namespace BaseGames.Player
_wallCoyoteTimer = Mathf.Max(0f, _wallCoyoteTimer - Time.fixedDeltaTime);
#if UNITY_EDITOR
_dbg_VelocityX = _rb.velocity.x;
_dbg_VelocityY = _rb.velocity.y;
_dbg_IsGrounded = _isGrounded;
_dbg_OnOneWayPlatform = _onOneWayPlatform;
_dbg_HasCoyoteTime = _coyoteTimer > 0f;
_dbg_HasWallCoyoteTime = _wallCoyoteTimer > 0f;
_dbg_IsWallLeft = _isWallLeft;
_dbg_IsWallRight = _isWallRight;
_dbg_CancelWindowOpen = _cancelWindowOpen;
_dbg_FacingDirection = _facingDirection;
_dbg_Position = $"({transform.position.x:F1}, {transform.position.y:F1})";
// 值类型字段每帧同步(无分配)
_dbg_VelocityX = _rb.velocity.x;
_dbg_VelocityY = _rb.velocity.y;
_dbg_IsGrounded = _isGrounded;
_dbg_OnOneWayPlatform = _onOneWayPlatform;
_dbg_HasCoyoteTime = _coyoteTimer > 0f;
_dbg_HasWallCoyoteTime = _wallCoyoteTimer > 0f;
_dbg_IsWallLeft = _isWallLeft;
_dbg_IsWallRight = _isWallRight;
_dbg_CancelWindowOpen = _cancelWindowOpen;
_dbg_FacingDirection = _facingDirection;
// 字符串格式化限速到 ~10 Hz避免每帧分配
if (Time.frameCount % 6 == 0)
_dbg_Position = $"({transform.position.x:F1}, {transform.position.y:F1})";
#endif
}
@@ -175,6 +182,7 @@ namespace BaseGames.Player
{
_rb.velocity = new Vector2(_rb.velocity.x, _config.JumpForce);
_coyoteTimer = 0f;
_slopeSnapDisabled = true;
}
public void CutJump()
@@ -191,6 +199,7 @@ namespace BaseGames.Player
{
_rb.velocity = new Vector2(_rb.velocity.x, _config.DoubleJumpForce);
_coyoteTimer = 0f;
_slopeSnapDisabled = true;
}
// ── 重力 ──────────────────────────────────────────────────────────────
@@ -379,10 +388,38 @@ namespace BaseGames.Player
{
if (_groundCheck == null) return;
_wasGrounded = _isGrounded;
_groundHitCount = Physics2D.OverlapBoxNonAlloc(
_groundCheck.position, _groundCheckSize, 0f, _groundBuffer, _groundLayer);
_isGrounded = _groundHitCount > 0;
// 斜坡吸附禁用标记:仅在重新落地(从空中→地面)时重置,
// 而非每帧在地面时都重置。
// 这样 Jump() 设置的 _slopeSnapDisabled = true 可以存活到玩家真正离开地面,
// 防止起跳后的首个 FixedUpdate 仍检测到地面时把标记清零,
// 导致紧接着的斜坡吸附把垂直速度归零(即"一直按方向键起跳立即落地"bug
if (_isGrounded && !_wasGrounded)
_slopeSnapDisabled = false;
// 斜坡吸附OverlapBox 是水平矩形,在平地→斜坡转折处可能短暂离地。
// 读取 Rigidbody2D 已有的物理接触点(零额外物理查询开销),
// 接触法线 Y > 0.5 即视为地面接触,保持 IsGrounded 为 true。
if (!_isGrounded && _wasGrounded && !_slopeSnapDisabled
&& Mathf.Abs(_rb.velocity.x) > 0.1f)
{
int contactCount = _rb.GetContacts(_slopeContactBuffer);
for (int i = 0; i < contactCount; i++)
{
if (_slopeContactBuffer[i].normal.y > 0.5f)
{
_isGrounded = true;
_rb.velocity = new Vector2(_rb.velocity.x, 0f);
break;
}
}
}
// 检测是否站在单向平台(含 IDropThrough 组件的碰撞体)
_onOneWayPlatform = false;
for (int i = 0; i < _groundHitCount; i++)