先说一下功能:
要求点击按钮,控制物体在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);
}
}