Unity 2D C#如何实现类似几何冲刺的对象按空格旋转90度效果
初版代码问题
你最开始的实现无法生效的核心原因有两个:
Quaternion.Lerp只在松开空格的单帧执行一次,没有持续的过渡计算,无法完成完整的平滑旋转- 固定写死目标欧拉角为
(0,0,90),多次按下空格后角度不会累加,会锁死在固定角度
调整后代码的优化方案
你参考建议改写的协程版本已经覆盖了基础的平滑旋转逻辑,只需要做几个小调整就能适配你的需求:
- 先删除重复定义的变量,你代码里同时声明了
GroundCheck和groundCheck两个地面检测点变量,会导致Inspector赋值冲突,保留一个即可。 - 根据你的需求调整旋转触发逻辑:
- 如果你需要每次按下空格就转满90度,不被松空格打断,直接删除
Input.GetKeyUp(KeyCode.Space)中停止协程的代码即可 - 如果你需要旋转和跳跃动作同步触发,把启动协程的代码从
Input.GetKeyDown的判断块中,移动到Input.GetKeyUp调用DoJump的代码块中
- 如果你需要每次按下空格就转满90度,不被松空格打断,直接删除
- 避免直接修改transform.rotation和2D物理系统冲突,把旋转逻辑改为调用Rigidbody2D的接口实现,优化后的协程代码如下:
/// <summary> /// 2D物体绕Z轴旋转指定角度 /// </summary> /// <param name="angleToRotateBy">要旋转的角度值,顺时针传90,逆时针传-90</param> /// <param name="timeToRotate">旋转动画总时长</param> /// <returns></returns> private IEnumerator RotateAxisByDegrees(float angleToRotateBy, float timeToRotate) { float currentTimeElapsed = 0.0f; float startRot = rb2D.rotation; float endRot = startRot + angleToRotateBy; while (currentTimeElapsed < timeToRotate) { rb2D.MoveRotation(Mathf.Lerp(startRot, endRot, currentTimeElapsed / timeToRotate)); currentTimeElapsed += Time.deltaTime; yield return null; } rb2D.MoveRotation(endRot); RotationCoroutine = null; }
- 最后在Inspector面板给
degreesToRotateBy赋值90、timeToRotate赋值0.2~0.3左右的数值即可得到流畅的旋转效果,角度方向不对就把degreesToRotateBy改成-90。
内容的提问来源于stack exchange,提问作者infamora
相关产品推荐
相关产品推荐

