UGUI随着鼠标旋转
1,先上效果图。
2,思路0x01:让image 看向一个点,让这个看向点跟随鼠标。
点跟随鼠标代码,如下图:
Vector2 MouseOnUIPos(Vector2 _inputPos)
{
Vector2 _pos = Vector2.zero;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(UseCanves.transform as RectTransform, _inputPos, UseCanves.worldCamera,out _pos))
{
}
return _pos;
}
然后就是看向了,看向的话注意,默认是z轴看向,找了半天,找个一个方法让Y轴看向,先看向然后翻转轴:
//鼠标跟随
LookAtPoint.GetComponent<RectTransform>().anchoredPosition3D= MouseOnUIPos(Input.mousePosition);
//看向
TargetTrf.transform.LookAt(LookAtPoint.transform);
//Y轴看向
TargetTrf.transform.rotation *= Quaternion.Euler(0, -90, -90);
然后就发现有个问题,在过某个零界点的时候,图片会左右翻转!若不是一个对称的图形的话,看出明显的问题!(不建议用,建议在3d物体时用LOOKAT实现一些物体的旋转)
思路0x02(建议使用)
image平面上的旋转最终就是在改变Z值。计算看向点和vector3.Up的角度,然后赋值就行。唯一需要考虑的就是,Vector3.Angle返回值是0-180,赋值的时候根据左右判断正负。
LookAtPoint.GetComponent<RectTransform>().anchoredPosition3D = MouseOnUIPos(Input.mousePosition);
Vector3 _dis = LookAtPoint.GetComponent<RectTransform>().anchoredPosition3D -
TargetTrf.GetComponent<RectTransform>().anchoredPosition3D;
float rightfloat = Vector3.Angle(_dis, Vector3.right);
float upfloat= Vector3.Angle(_dis, Vector3.up);
if (rightfloat<90)
{
TargetTrf.transform.localEulerAngles = new Vector3(0, 0, -upfloat);
}
else
{
TargetTrf.transform.localEulerAngles = new Vector3(0, 0, upfloat);
}
最后,本身听起来一个很简单的东西,但是实现起来确实费了一些时间。。。还得加强基础啊