Files
zeling_v2/Assets/_Game/Scripts/Enemies/FlyingEnemy.cs
Joywayer a1b4e629aa feat: Implement Room Streaming System
- Add RoomStreamingManager to manage room loading and unloading based on player proximity.
- Create StreamingBudgetConfigSO for memory and performance budgeting of the streaming system.
- Introduce TransitionDirector to handle seamless and atmospheric fade transitions between rooms.
- Develop WorldGraph to represent room connectivity and facilitate neighbor queries and distance calculations.
- Implement RoomNode and RoomEdge classes to structure room data and connections.
2026-05-23 19:10:29 +08:00

68 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using BaseGames.Combat;
namespace BaseGames.Enemies
{
/// <summary>
/// 飞行敌人基类。
///
/// 导航由 <see cref="Navigation.FlyingDirectNavigator"/> 实现IPathAgent
/// AI 行为逻辑由挂载的 Behavior Designer 树驱动。
/// 本类仅负责:
/// <list type="bullet">
/// <item>Rigidbody2D 无重力初始化</item>
/// <item>接触伤害OnTriggerStay2D</item>
/// <item>StopMovement / MoveInDirection 的 Rigidbody2D 快速移动重写</item>
/// </list>
/// </summary>
public class FlyingEnemy : EnemyBase
{
[Header("飞行移动(快速覆盖速度)")]
[SerializeField] private float _moveSpeed = 3f;
[Header("接触伤害")]
[SerializeField] private DamageSourceSO _contactDamageSource;
private Rigidbody2D _rb;
protected override void Awake()
{
base.Awake();
_rb = GetComponent<Rigidbody2D>();
if (_rb != null)
{
_rb.gravityScale = 0f;
_rb.constraints = RigidbodyConstraints2D.FreezeRotation;
}
}
public override void StopMovement()
{
if (_rb != null) _rb.velocity = Vector2.zero;
}
public override void MoveInDirection(float dir)
{
if (_rb != null) _rb.velocity = new Vector2(dir * _moveSpeed, 0f);
}
private void OnTriggerStay2D(Collider2D other)
{
if (_contactDamageSource == null) return;
if (CurrentState == EnemyStateType.Dead) return;
if (_rb == null) return;
var hurtBox = other.GetComponent<HurtBox>();
if (hurtBox == null) return;
Vector2 knockDir = ((Vector2)other.bounds.center - _rb.position).normalized;
var info = DamageInfo.From(
_contactDamageSource,
knockDir,
transform.position,
gameObject.layer);
hurtBox.ReceiveDamage(info);
}
}
}