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

如何修改Unity代码实现物体沿X/Y/Z轴平滑旋转(滑块控制)

实现物体X/Y/Z轴旋转的代码修改方案

核心修改思路

要支持三个轴的独立旋转,需要为每个轴分配单独的Slider组件,并维护各自的旋转状态,避免不同轴的旋转逻辑互相干扰。

具体修改步骤

  1. 添加三个Slider组件引用
    替换原脚本中单个slider变量,改为三个分别对应X、Y、Z轴的Slider引用:

    public Slider xSlider;
    public Slider ySlider;
    public Slider zSlider;
    
  2. 为每个轴维护独立的状态变量
    替换原有的单个previousValue,为三个轴分别定义状态变量:

    private float xPrevValue;
    private float yPrevValue;
    private float zPrevValue;
    private float startValue = 0.5f;
    
  3. 初始化所有Slider的回调与状态
    修改Awake方法,为每个Slider绑定对应的旋转回调,并初始化初始值:

    void Awake ()
    {
        xSlider.onValueChanged.AddListener(OnXSliderChanged);
        ySlider.onValueChanged.AddListener(OnYSliderChanged);
        zSlider.onValueChanged.AddListener(OnZSliderChanged);
    
        xPrevValue = xSlider.value;
        yPrevValue = ySlider.value;
        zPrevValue = zSlider.value;
    }
    
  4. 实现各轴的独立旋转逻辑
    为每个轴编写专属回调方法,处理对应轴的旋转(加入空引用判断避免报错):

    void OnXSliderChanged(float value)
    {
        float delta = value - xPrevValue;
        objectToRotate?.transform.Rotate(Vector3.right * delta * 360);
        xPrevValue = value;
    }
    
    void OnYSliderChanged(float value)
    {
        float delta = value - yPrevValue;
        objectToRotate?.transform.Rotate(Vector3.up * delta * 360);
        yPrevValue = value;
    }
    
    void OnZSliderChanged(float value)
    {
        float delta = value - zPrevValue;
        objectToRotate?.transform.Rotate(Vector3.forward * delta * 360);
        zPrevValue = value;
    }
    
  5. 更新Deselect方法重置所有Slider
    修改Deselect方法,将三个Slider的值都重置为初始值:

    public void Deselect()
    {
        objectToRotate?.GetComponent<Recolour>().SetOriginalMaterial();
        objectToRotate = null;
        xSlider.value = startValue;
        ySlider.value = startValue;
        zSlider.value = startValue;
    }
    

修改后的完整代码

using UnityEngine;
using UnityEngine.UI;

public class RotateObject : MonoBehaviour
{
    private GameObject objectToRotate;
    public Slider xSlider;
    public Slider ySlider;
    public Slider zSlider;

    private float xPrevValue;
    private float yPrevValue;
    private float zPrevValue;
    private float startValue = 0.5f;

    void Awake ()
    {
        xSlider.onValueChanged.AddListener(OnXSliderChanged);
        ySlider.onValueChanged.AddListener(OnYSliderChanged);
        zSlider.onValueChanged.AddListener(OnZSliderChanged);

        xPrevValue = xSlider.value;
        yPrevValue = ySlider.value;
        zPrevValue = zSlider.value;
    }

    void OnXSliderChanged(float value)
    {
        float delta = value - xPrevValue;
        objectToRotate?.transform.Rotate(Vector3.right * delta * 360);
        xPrevValue = value;
    }

    void OnYSliderChanged(float value)
    {
        float delta = value - yPrevValue;
        objectToRotate?.transform.Rotate(Vector3.up * delta * 360);
        yPrevValue = value;
    }

    void OnZSliderChanged(float value)
    {
        float delta = value - zPrevValue;
        objectToRotate?.transform.Rotate(Vector3.forward * delta * 360);
        zPrevValue = value;
    }

    void Update()
    {
        if (Input.touchCount <= 0) return;
        Touch touch = Input.GetTouch(0);
        if (touch.phase == TouchPhase.Began)
        {
            Ray ray = Camera.current.ScreenPointToRay(touch.position);
            if (Physics.Raycast(ray, out RaycastHit hitObject))
            {
                objectToRotate = hitObject.transform.parent.transform.parent.gameObject;
                objectToRotate.GetComponent<Recolour>().SetSelected();
            }
        }       
    }

    public void Deselect()
    {
        objectToRotate?.GetComponent<Recolour>().SetOriginalMaterial();
        objectToRotate = null;
        xSlider.value = startValue;
        ySlider.value = startValue;
        zSlider.value = startValue;
    }
}

使用说明

  1. 在Unity编辑器中,为脚本所在对象添加三个Slider组件,分别拖入xSlider、ySlider、zSlider字段。
  2. 将每个Slider的最小值设为0,最大值设为1,初始值设为0.5(与startValue对应)。
  3. 运行后,选中目标物体即可通过三个Slider分别控制X、Y、Z轴的旋转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:03:51