3dui看向摄像头
有四种方法
public bool reverFace = false;
public bool rotate = false;
public bool confineXZ;//是否限制y轴
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (rotate)
{
//方法一
//transform.eulerAngles=new Vector3(Camera.main.transform.eulerAngles.x,Camera.main.transform.eulerAngles.y,0);
//方法二
//这里角色朝向和UI朝向是相反的,如果直接用LookAt()还需要把每个UI元素旋转过来。
// 它实际上是一个反向旋转,“负负得正”
//Vector3 dir = transform.position - Camera.main.transform.position;
//transform.rotation = Quaternion.LookRotation(dir);
//方法三
//Vector3 targetPos = transform.position + Camera.main.transform.rotation * (reverFace ? Vector3.back : Vector3.forward);
//Vector3 targetOrientation = Camera.main.transform.rotation * Vector3.up;
//transform.LookAt(targetPos, targetOrientation);
//方法四
//物体始终面向摄像机
//var rotation = Quaternion.LookRotation(Camera.main.transform.TransformVector(Vector3.forward),
// Camera.main.transform.TransformVector(Vector3.up));
//if (confineXZ)
//{
// rotation = new Quaternion(0, rotation.y, 0, rotation.w);
//}
//else
//{
// rotation = new Quaternion(rotation.x, rotation.y, rotation.z, rotation.w);
//}
//gameObject.transform.rotation = rotation;
//方法五
Plane plane = new Plane(Camera.main.transform.forward, Camera.main.transform.position);
float dis;
Vector3 tar = Camera.main.transform.position;
if (plane.Raycast(new Ray(transform.position, -Camera.main.transform.forward), out dis) == true)
{
tar = transform.position + (-Camera.main.transform.forward * dis);
}
transform.LookAt(tar, Vector3.up);
}
//Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * 100, Color.blue); //绘制正方体forward方向
//Debug.DrawRay(transform.position, Camera.main.transform.position- transform.position, Color.green); //绘制向量dir
//Debug.DrawRay(transform.position, transform.eulerAngles, Color.red); //即:绘制正方体的旋转轴
}
除了方法二,其他方法效果一样
方法二原理是面向摄像头所在的位置,实际上摄像头不动,单纯旋转,它自己不会动。这导致它和其他四种方法的实际效果会有差异。但大体也是面向摄像头的。可以看需求选择。
方法五的效果是反向的,需要设置canvas的旋转的y为180,再在其父类,放这个脚本。而且有点闪烁。