Unity3D双物体顺序旋转控制实现问题求助
Unity双物体顺序旋转实现方案
问题修正点
原代码存在输入逻辑不完整、欧拉角范围错误、缺少切换判断等问题,以下是完整的实现代码:
using UnityEngine; public class RotacionPalaYobjeto : MonoBehaviour { public Transform object1; // 第一个旋转物体 public Transform object2; // 第二个旋转物体 public float rotationSpeed = 10f; // 旋转速度 public float minRotation = -45f; // 最小旋转角度(X轴) public float maxRotation = 45f; // 最大旋转角度(X轴) private Transform activeObject; // 当前可控制的物体 void Start() { // 初始控制第一个物体 activeObject = object1; // 初始化物体角度到最小值,避免初始状态异常 SetObjectRotation(object1, minRotation); SetObjectRotation(object2, minRotation); } void Update() { float rotationInput = Input.GetAxis("Horizontal"); if (rotationInput == 0) return; // 获取当前物体的X轴旋转角度(转换为-180~180范围) float currentAngle = GetNormalizedAngle(activeObject.localEulerAngles.x); float targetAngle = currentAngle + rotationInput * rotationSpeed * Time.deltaTime; // 限制角度在范围内 targetAngle = Mathf.Clamp(targetAngle, minRotation, maxRotation); SetObjectRotation(activeObject, targetAngle); // 处理物体切换逻辑 CheckRotationBoundary(currentAngle, targetAngle, rotationInput); } // 将欧拉角转换为-180~180的标准化角度 private float GetNormalizedAngle(float angle) { if (angle > 180f) return angle - 360f; return angle; } // 设置物体X轴旋转角度 private void SetObjectRotation(Transform obj, float xAngle) { obj.localRotation = Quaternion.Euler(xAngle, obj.localEulerAngles.y, obj.localEulerAngles.z); } // 检查旋转边界并切换控制物体 private void CheckRotationBoundary(float currentAngle, float targetAngle, float inputDir) { // 控制第一个物体时,转到最大角度则切换到第二个物体 if (activeObject == object1 && targetAngle >= maxRotation) { activeObject = object2; } // 控制第二个物体时 else if (activeObject == object2) { // 转到最大角度时保持静止(忽略输入) if (targetAngle >= maxRotation) { return; } // 转到最小角度时切换回第一个物体 if (targetAngle <= minRotation) { activeObject = object1; } } } }
关键逻辑说明
- 标准化角度处理:解决Unity欧拉角0~360范围导致的负数角度判断错误问题,确保
minRotation和maxRotation的限制生效。 - 双向输入支持:同时处理左右方向键的旋转输入,覆盖完整操作场景。
- 边界切换逻辑:
- 当
object1旋转至最大角度时,自动切换控制object2 object2旋转至最大角度时保持静止,旋转至最小角度时切回object1
- 当
- 角度设置封装:通过
SetObjectRotation方法统一控制物体旋转,避免重复代码。
内容的提问来源于stack exchange,提问作者Ricardo Mendoza
相关产品推荐
相关产品推荐

