Unity俯视角2D游戏:如何让小球速度为0时停止动画?
解决方案
核心思路
要实现速度低于阈值时停止动画,需要实时检测小球的Rigidbody2D速度,并通过Animator参数控制状态切换,而非仅在碰撞时触发动画播放。
步骤1:配置Animator状态机
在Animator窗口中:
- 添加布尔类型参数,命名为
IsMoving - 设置idle到moving的过渡条件:
IsMoving为true时触发 - 设置moving到idle的过渡条件:
IsMoving为false时触发 - 关闭过渡的
Has Exit Time,确保状态切换更灵敏
步骤2:修改BallMove脚本
替换原脚本为以下代码:
public class BallMove : MonoBehaviour { public Rigidbody2D rb; public Animator animator; // 速度阈值,可根据游戏手感调整 public float speedThreshold = 0.1f; void Update() { // 获取小球当前合速度的大小 float currentSpeed = rb.velocity.magnitude; // 根据速度控制Animator状态切换 animator.SetBool("IsMoving", currentSpeed > speedThreshold); } void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.CompareTag("Player") || other.gameObject.CompareTag("Collider")) { // 若需要碰撞时给小球加力,可在这里添加逻辑 // 示例:rb.AddForce(other.contacts[0].normal * 5f, ForceMode2D.Impulse); } } }
关键细节说明
rb.velocity.magnitude:直接获取2D刚体的合速度大小,无需单独检测x/y轴速度- 用Animator参数控制状态:相比直接调用
animator.Play(),状态机过渡更灵活,可通过动画曲线或过渡混合时长实现减速效果 - 阈值可调:
speedThreshold设为0.1,可避免微小速度导致动画反复切换,提升游戏手感
内容的提问来源于stack exchange,提问作者Tanix
相关产品推荐
相关产品推荐

