Animator覆盖控制器导致Sprite Renderer代码修改失效问题
敌人Animator覆盖控制器导致精灵残留问题
场景设定
- 项目中有一个名为Enemy的Animator Controller:
- 死亡动画片段:播放4帧后禁用Sprite Renderer
- EnemyDamaged动画片段:仅在几帧内修改敌人的位置与旋转
- 绿色史莱姆使用Override Controller,替换了上述动画片段中的精灵资源;蓝色、红色史莱姆使用默认的Enemy控制器,仅控制Sprite Renderer的启停,不修改精灵本身。
初始化逻辑
Enemy.cs脚本的Initialize方法负责生成新怪物,代码如下:
public void Initialize(Monster monster) { animator.ResetTrigger("Dead"); animator.ResetTrigger("Damaged"); health = monster.health; maxHealth = monster.health; attack = monster.attack; defense = monster.defense; this.monster = monster; enemyNameText.text = monster.name; spriteRenderer.sprite = monster.sprite; currentHealthTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, maxHealthTransform.rect.width * (float)health / maxHealth); animator.runtimeAnimatorController = monster.animatorController ? monster.animatorController : defaultAnimatorController; animator.SetTrigger("Spawned"); }
问题现象
绿色史莱姆(唯一使用覆盖控制器的敌人)死亡后,后续生成的所有敌人都会固定显示绿色基底精灵;但红蓝史莱姆死亡后,后续生成的敌人精灵能正常更新。
若修改代码强制使用默认控制器:
public void Initialize(Monster monster) { animator.ResetTrigger("Dead"); animator.ResetTrigger("Damaged"); health = monster.health; maxHealth = monster.health; attack = monster.attack; defense = monster.defense; this.monster = monster; enemyNameText.text = monster.name; spriteRenderer.sprite = monster.sprite; currentHealthTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, maxHealthTransform.rect.width * (float)health / maxHealth); animator.runtimeAnimatorController = defaultAnimatorController; animator.SetTrigger("Spawned"); }
问题会消失,但无法再使用覆盖控制器替换动画资源。
补充信息
- 可通过GitHub仓库(Clicker-Knight-PublicClone)复现该问题
- 问题直观表现:绿色史莱姆死亡后,后续生成的红色、蓝色史莱姆错误显示绿色精灵
内容的提问来源于stack exchange,提问作者Erik Overflow
相关产品推荐
相关产品推荐

