如何根据物体的rotation旋转状态调整其transform组件的scale缩放参数
实现思路与代码示例
注意:你现有代码里直接判断
hand.transform.rotation.z == 30f是错误用法。transform.rotation是四元数,其z分量不是直观的欧拉角角度值,正确的角度获取应该用hand.transform.eulerAngles.z,同时浮点数计算存在精度误差,不要直接用==做相等判断,要预留合理的误差阈值。
场景1:分段触发式调整(和你原有逻辑对齐)
适合达到指定旋转角度时切换到固定scale值,代码示例:
// 角度误差阈值,单位度 float angleThreshold = 2f; float handRotZ = hand.transform.eulerAngles.z; // 欧拉角返回值范围是0~360,-30度对应330度,需要做兼容判断 bool isRot30 = Mathf.Abs(handRotZ - 30f) < angleThreshold; bool isRotNeg30 = Mathf.Abs(handRotZ - 330f) < angleThreshold; if (isRot30) { // 自定义对应旋转状态下的scale值 transform.localScale = new Vector3(2f, 2f, 2f); } else if (isRotNeg30) { transform.localScale = new Vector3(0.5f, 0.5f, 0.5f); } else { // 其他状态下的默认scale,按需调整 transform.localScale = Vector3.one; }
场景2:平滑动态映射(scale随旋转连续变化)
如果需要scale随旋转角度线性变化,不需要触发判断,可以直接用角度值做映射,示例:
float handRotZ = hand.transform.eulerAngles.z; // 把0~360的欧拉角转回-180~180的范围方便计算 if (handRotZ > 180) handRotZ -= 360; // 限定角度计算范围,比如只在-30度~30度区间内调整scale float clampedRotZ = Mathf.Clamp(handRotZ, -30f, 30f); // 把角度值映射到scale范围,比如-30度对应scale 0.5,30度对应scale 2 float targetScale = Mathf.Lerp(0.5f, 2f, (clampedRotZ + 30f) / 60f); transform.localScale = new Vector3(targetScale, targetScale, targetScale);
内容的提问来源于stack exchange,提问作者Cottontail
相关产品推荐
相关产品推荐

