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
相关产品推荐
相关产品推荐

