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

