如何仅检测transform的y轴旋转是否发生变化
实现方案
核心实现逻辑是缓存上一帧的Y轴旋转值,每一帧和当前值做差值对比,仅当差值超过阈值时触发自定义操作,同时兼容浮点运算误差场景。
完整代码示例
using UnityEngine; public class RotationYMonitor : MonoBehaviour { // 存储上一帧的Y轴旋转值 private float _prevRotationY; // 旋转变化检测阈值,可根据需求调整,Mathf.Epsilon为Unity默认极小浮点阈值 private const float ROTATION_CHECK_THRESHOLD = Mathf.Epsilon; private void Start() { // 初始化缓存值为物体初始Y轴旋转值 _prevRotationY = transform.eulerAngles.y; } private void Update() { float currentRotationY = transform.eulerAngles.y; // 对比当前帧与上一帧的Y轴旋转差值 if (Mathf.Abs(currentRotationY - _prevRotationY) > ROTATION_CHECK_THRESHOLD) { // 此处执行你的自定义逻辑 OnRotationYChanged(currentRotationY); // 更新缓存值为当前帧旋转值,供下一帧对比使用 _prevRotationY = currentRotationY; } } /// <summary> /// Y轴旋转变化触发的自定义方法 /// </summary> /// <param name="newRotationY">变化后的Y轴旋转值</param> private void OnRotationYChanged(float newRotationY) { // 示例逻辑,可替换为你自己的业务代码 Debug.Log($"Y轴旋转已变化,当前值:{newRotationY}"); } }
注意事项
- 若需要检测本地坐标系下的Y轴旋转而非世界坐标系,将
transform.eulerAngles.y替换为transform.localEulerAngles.y即可 - 不要直接使用transform.rotation.y做对比,四元数的y分量和欧拉角的Y轴旋转定义完全不同,直接对比会出现逻辑错误
- 若需要过滤微小的旋转抖动,可以将
ROTATION_CHECK_THRESHOLD阈值调大,比如设置为0.1f,只有旋转变化超过0.1度才会触发操作
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

