You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity协程中角色模型旋转未即时生效异常问题求助

问题分析与解决方案

核心原因

你手动执行的body.transform.Rotate(-90, 0, 0)被其他系统(最常见的是Animator动画控制器或其他控制角色姿态的脚本)覆盖了。动画系统会每帧更新角色的transform,你的单次旋转操作刚执行就被动画的默认姿态冲掉了,直到协程结束执行反向旋转时,可能动画逻辑有变化(比如切换到无动画状态),才会看到旋转效果。

具体解决办法

1. 临时禁用动画控制器

如果角色挂载了Animator,直接禁用它就能避免动画覆盖旋转:

IEnumerator SkateBoardTime()
{
    Animator anim = body.GetComponent<Animator>();
    bool wasAnimEnabled = anim.enabled;
    anim.enabled = false; // 关掉动画,防止覆盖旋转

    body.transform.Rotate(-90, 0, 0);
    script.groundDrag = skateboardDrag;
    script.moveSpeed = skateboardSpeed;
    
    script.readyForMovement = false;
    script.grounded = false;
    yield return new WaitForSeconds(skateboardDuration);

    body.transform.Rotate(90, 0, 0);
    script.groundDrag = 5;
    script.moveSpeed = 7;
    script.grounded = true;
    anim.enabled = wasAnimEnabled; // 恢复动画

    yield return new WaitForSeconds(skateboardCooldown);
    script.readyForMovement = true;
}

要是想更专业,直接在Animator里加个IsSkating布尔参数,做个背骑滑板的动画片段,激活滑板时设anim.SetBool("IsSkating", true),结束时设为false,用动画维持姿态比手动旋转靠谱。

2. 排查其他旋转控制脚本

检查你的玩家移动脚本(就是代码里的script类),看有没有在Update/FixedUpdate里强制重置角色旋转的代码,比如body.transform.rotation = Quaternion.Euler(0, ..., 0)。有的话加个判断,滑板激活时跳过这段逻辑:

// 玩家移动脚本的Update示例
void Update()
{
    if (!script.isSkating) // 新增isSkating标记,滑板激活时设为true
    {
        body.transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0);
    }
    // 其他移动逻辑
}

然后在滑板协程里,开始时设script.isSkating = true,结束时设false。

3. 改用本地旋转

如果body是角色的子物体(比如骨骼节点),试试用本地旋转代替全局旋转:

// 激活滑板时
body.transform.localRotation = Quaternion.Euler(-90, 0, 0);
// 结束时恢复
body.transform.localRotation = Quaternion.Euler(0, 0, 0);

全局旋转可能受父物体变换影响,本地旋转更直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:22:48