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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:45:19