3dui看向摄像头

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,再在其父类,放这个脚本。而且有点闪烁。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱岗酸豆角吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值