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
相关产品推荐
相关产品推荐

