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

Unity开发中如何准确判断物体是否已倾倒

问题根源

你当前代码的核心错误是直接读取了Transform.rotation的x、z分量做判断:Transform.rotation返回的是四元数结构,它的四个分量(x/y/z/w)和直观的旋转角度没有线性对应关系,完全不符合你想判断「绕X/Z轴倾斜角度」的逻辑,所以会出现大量误判。

正确解决方案

推荐用物体向上向量与世界竖直向上向量的点积做判断,这个方法不会出现万向锁问题,判断逻辑更稳定:
两个单位向量的点积值等于它们夹角的余弦值,点积越小说明物体倾斜角度越大,当点积低于你设定的阈值时即可判定为倾倒。

修改后代码示例

// 阈值可调:范围0~1,值越大判定倾倒的标准越严格
// 例如0.5对应倾斜角度超过60度判定为倾倒,0.7对应倾斜超过45度判定为倾倒
private const float FallThreshold = 0.5f;

bool CheckFallenDown(Transform transform) {
    // 计算物体自身向上方向和世界竖直向上方向的点积
    float dotResult = Vector3.Dot(transform.up, Vector3.up);
    return dotResult < FallThreshold;
}

额外适配说明

如果你的pin对象初始摆放时的向上方向不是世界Y轴,可以在初始化时记录它的初始向上向量,后续用初始向量代替Vector3.up做判断即可,适配任意初始朝向的pin对象:

private Vector3 _initialUp;

void Start() {
    _initialUp = transform.up;
}

bool CheckFallenDown(Transform transform) {
    float dotResult = Vector3.Dot(transform.up, _initialUp);
    return dotResult < FallThreshold;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:09:03