You need to enable JavaScript to run this app. Unity 2D C#如何实现类似几何冲刺的对象按空格旋转90度效果
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D C#如何实现类似几何冲刺的对象按空格旋转90度效果

初版代码问题

你最开始的实现无法生效的核心原因有两个:

  • Quaternion.Lerp只在松开空格的单帧执行一次,没有持续的过渡计算,无法完成完整的平滑旋转
  • 固定写死目标欧拉角为(0,0,90),多次按下空格后角度不会累加,会锁死在固定角度

调整后代码的优化方案

你参考建议改写的协程版本已经覆盖了基础的平滑旋转逻辑,只需要做几个小调整就能适配你的需求:

  1. 先删除重复定义的变量,你代码里同时声明了GroundCheck和groundCheck两个地面检测点变量,会导致Inspector赋值冲突,保留一个即可。
  2. 根据你的需求调整旋转触发逻辑:
    • 如果你需要每次按下空格就转满90度,不被松空格打断,直接删除Input.GetKeyUp(KeyCode.Space)中停止协程的代码即可
    • 如果你需要旋转和跳跃动作同步触发,把启动协程的代码从Input.GetKeyDown的判断块中,移动到Input.GetKeyUp调用DoJump的代码块中
  3. 避免直接修改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;
}
  1. 最后在Inspector面板给degreesToRotateBy赋值90、timeToRotate赋值0.2~0.3左右的数值即可得到流畅的旋转效果,角度方向不对就把degreesToRotateBy改成-90。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:24:04