如何修改Unity代码实现物体沿X/Y/Z轴平滑旋转(滑块控制)
实现物体X/Y/Z轴旋转的代码修改方案
核心修改思路
要支持三个轴的独立旋转,需要为每个轴分配单独的Slider组件,并维护各自的旋转状态,避免不同轴的旋转逻辑互相干扰。
具体修改步骤
添加三个Slider组件引用
替换原脚本中单个slider变量,改为三个分别对应X、Y、Z轴的Slider引用:public Slider xSlider; public Slider ySlider; public Slider zSlider;为每个轴维护独立的状态变量
替换原有的单个previousValue,为三个轴分别定义状态变量:private float xPrevValue; private float yPrevValue; private float zPrevValue; private float startValue = 0.5f;初始化所有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; }实现各轴的独立旋转逻辑
为每个轴编写专属回调方法,处理对应轴的旋转(加入空引用判断避免报错):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; }更新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; } }
使用说明
- 在Unity编辑器中,为脚本所在对象添加三个Slider组件,分别拖入
xSlider、ySlider、zSlider字段。 - 将每个Slider的最小值设为0,最大值设为1,初始值设为0.5(与
startValue对应)。 - 运行后,选中目标物体即可通过三个Slider分别控制X、Y、Z轴的旋转。
内容的提问来源于stack exchange,提问作者ibrahim 46
相关产品推荐
相关产品推荐

