4.2 KiB
4.2 KiB
灵灯技能实现计划
现有系统分析
- 光照系统:
LightSource组件注册到LightMaskSystem,由DarknessOverlayshader 在遮罩层挖洞实现光照效果 - 伤害系统:
HealthSystem.Damage(int)通用扣血,敌人碰到的标准伤害接口 - 技能参考:
EchoSystem(E键摇铃) 是现有最接近的技能模板,有冷却、按键触发的成熟模式 - 命名空间: 新脚本放在
IndianOceanAssets.Engine2_5D命名空间,与现有 2.5D 引擎脚本一致
Task 1: 创建 SpiritLanternSystem.cs(玩家技能管理组件)
文件: Assets/eco/SpiritLanternSystem.cs
挂载到玩家物体上,负责:
- 管理灵灯数量(初始 5 个,
[SerializeField] private int maxLanterns = 5) - 按键 U 触发放置(
[SerializeField] private KeyCode lanternKey = KeyCode.U) - 冷却时间控制(
[SerializeField] private float cooldown = 3f) - 放置时实例化灵灯 Prefab 到玩家当前位置
- 跟踪所有已放置的灵灯,回收时增加可用数量
- 提供
public int RemainingLanterns属性供 UI 使用
核心逻辑:
// 按 U 且 CD 就绪 且 还有灵灯 → 放置
if (Input.GetKeyDown(lanternKey) && remainingLanterns > 0 && Time.time > lastPlaceTime + cooldown)
{
PlaceLantern();
}
放置时:
- 实例化
lanternPrefab在玩家位置 remainingLanterns--,记录lastPlaceTime- 订阅灵灯的
OnLanternRecalled事件(回收时remainingLanterns++)
Task 2: 创建 SpiritLantern.cs(灵灯行为组件)
文件: Assets/eco/SpiritLantern.cs
挂在灵灯 Prefab 上,负责单个灵灯的行为:
- 存在时间:
[SerializeField] private float lifetime = 10f,倒计时结束触发回收 - 碰撞检测: 使用
CircleCollider2D(trigger) 检测怪物接触OnTriggerEnter2D→ 调用HealthSystem.Damage(1)扣怪物 1 血 → 灵灯消失 → 通知SpiritLanternSystem回收
- 光照: 挂载
LightSource组件(复用现有光照系统,与主角遮罩效果一致) - 回收事件:
public event Action OnLanternRecalled,供SpiritLanternSystem订阅 - Layer: 灵灯 Prefab 需放在
whatIsEnemy能检测到的层,或使用独立的碰撞检测方式
碰撞逻辑:
private void OnTriggerEnter2D(Collider2D other)
{
var health = other.GetComponent<HealthSystem>();
if (health != null && !other.isPlayer) // 排除玩家
{
health.Damage(1);
Recalled(); // 灵灯消失 + 通知回收
}
}
超时回收:
private void Update()
{
lifetime -= Time.deltaTime;
if (lifetime <= 0)
Recalled();
}
Task 3: 创建灵灯 Prefab
文件: Assets/eco/Prefabs/SpiritLantern.prefab
Prefab 组成:
- 空 GameObject(或灯笼 Sprite)
SpriteRenderer— 灯笼外观(需要美术资源,可先用临时 Sprite)LightSource组件 — 配置光照半径和强度(复用现有光照系统)SpiritLantern脚本 — 管理生命周期和碰撞CircleCollider2D(isTrigger = true) — 检测怪物接触Rigidbody2D(isKinematic = true) — Collider 需要 Rigidbody 才能触发
Task 4: 配置与集成
- 在
PlayerController的[RequireComponent]中添加SpiritLanternSystem(可选,也可以手动挂载) - 在 Inspector 中配置:
SpiritLanternSystem的lanternPrefab引用LightSource的光照半径/强度- 冷却时间、灵灯数量、存在时间等参数
- 确保灵灯 Prefab 的 Layer 不与玩家/敌人碰撞冲突
数据流总结
按 U 键
→ SpiritLanternSystem.PlaceLantern()
→ 实例化 SpiritLantern Prefab(带 LightSource)
→ LightSource 自动注册到 LightMaskSystem → 遮罩挖洞(照亮区域)
→ 怪物碰触 → HealthSystem.Damage(1) → 灵灯 Recalled() → remainingLanterns++
→ 超时 → Recalled() → Destroy → remainingLanterns++
可配置参数汇总
| 参数 | 默认值 | 所在脚本 |
|---|---|---|
| maxLanterns | 5 | SpiritLanternSystem |
| cooldown | 3s | SpiritLanternSystem |
| lanternKey | U | SpiritLanternSystem |
| lifetime | 10s | SpiritLantern |
| lightRadius | 4f | LightSource (Prefab上) |
| lightIntensity | 1f | LightSource (Prefab上) |