You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何让定时切换的加热平台对角色造成伤害?

问题修复方案

你的代码核心问题在于伤害触发的判断逻辑错误,且缺少对当前平台状态的跟踪,以下是具体修复步骤:

1. 新增状态变量跟踪平台当前状态

在类中添加变量记录当前显示的Sprite索引,以此判断平台是否处于伤害状态:

public List<Sprite> spritesToSwap; // 存储要切换的Sprite
public float Speed = 0f;
private int currentSpriteIndex = 0; // 跟踪当前显示的Sprite索引
private SpriteRenderer spriteRenderer; // 缓存SpriteRenderer组件,避免重复调用GetComponent

2. 修正协程中的索引更新逻辑

在SwapSprites协程里同步更新当前索引,确保状态判断准确:

IEnumerator SwapSprites()
{
    while (true)
    {
        spriteRenderer.sprite = spritesToSwap[currentSpriteIndex];
        // 更新索引并循环
        currentSpriteIndex++;
        if (currentSpriteIndex >= spritesToSwap.Count) currentSpriteIndex = 0;
        
        yield return new WaitForSeconds(Speed);
    }
}

3. 修复碰撞伤害触发逻辑

将原本错误的判断条件替换为当前索引判断,同时改用OnCollisionStay2D实现持续伤害(若只需单次伤害可换回OnCollisionEnter2D),并添加冷却避免掉血过快:

public float damageCooldown = 1f; // 伤害间隔,单位:秒
private float lastDamageTime;

void Start()
{
    spriteRenderer = GetComponent<SpriteRenderer>();
    StartCoroutine(SwapSprites());
}

void OnCollisionStay2D(Collision2D other)
{
    PlayerCharacter player = other.gameObject.GetComponent<PlayerCharacter>();
    if (player == null) return;

    // 假设第二个Sprite(索引1)为伤害状态,同时满足冷却条件
    if (currentSpriteIndex == 1 && Time.time >= lastDamageTime + damageCooldown)
    {
        player.ChangeHealth(-1);
        lastDamageTime = Time.time;
    }
}

额外说明

  • 确保玩家的PlayerCharacter脚本中存在ChangeHealth方法,且能正确处理负数参数(扣血逻辑)
  • 平台的Collider2D需勾选Is Trigger以外的选项,保证玩家能站在上面

内容的提问来源于stack exchange,提问作者DemonWolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:53:12