先说一下功能:
要求点击按钮,控制物体在X轴,Y轴,Z轴缓动旋转指定的角度(世界轴);
网上关于物体旋转的方法非常多,但大都是单一轴旋转,或指定的角度旋转比如:(Vector3.up 或(0,90,0));
由于旋转的坑太多,会发现将代码套用在我们的需求下后产生一种问题,即在单一轴旋转时其他两个轴的旋转角度为0时则旋转无误,如果有一个轴的旋转角度不为0时,旋转很容易出现问题。
请教了一个大佬有一下代码奉上,亲测可用;
public Transform target;public Button xPositive;public Button xNegative;public Button yPositive;public Button yNegative;public Button zPositive;public Button zNegative;public float speed;private Vector3 _axis;private int _angle;private float _percent; // [0,1]private void Start(){xPositive.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.right; _angle = 90; } });xNegative.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.right; _angle = -90; } });yPositive.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.up; _angle = 90; } });yNegative.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.up; _angle = -90; } });zPositive.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.forward; _angle = 90; } });zNegative.onClick.AddListener(() => { if (_percent >= 1f) { _percent = 0f; _axis = Vector3.forward; _angle = -90; } });}private void Update(){if (_percent < 1f){float delta = speed * Time.deltaTime;_percent += delta;float tmp = _percent - 1f;if (tmp > 0){delta -= tmp;}target.Rotate(_axis, _angle * delta,Space.World);}}