简书链接:原创使用InvokeRepeating差值器平滑抬高摄像头Camera角度
文章字数:508,阅读全文大约需要2分钟
判断角度差使用Quaternion.Angle(targetRotation, Camera.main.transform.rotation)
如果直接用 Camera.main.transform.rotation.x判断你会发现, 递减到0之后又到了360,显然是不行的。它永远是0到360的循环

Camera.main.transform.eulerAngles = Vector3.Lerp(Camera.main.transform.eulerAngles,new Vector3(-40, Camera.main.transform.eulerAngles.y, Camera.main.transform.eulerAngles.z), Time.deltaTime);

1
,不过 ```Lerp```和```Slerp```是有点不一样的。一个是球性差值器,一个是线性差值器
void CameraUp()
{



    Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.rotation.y, Camera.main.transform.rotation.z);// * Quaternion.identity;
    string str=(Quaternion.Angle(targetRotation, Camera.main.transform.rotation))+"差";
        print("angle x:" + Camera.main.transform.eulerAngles.x+",差多少:"+str);

    Camera.main.transform.rotation = Quaternion.Slerp(Camera.main.transform.rotation, targetRotation, Time.deltaTime * 2);//利用Slerp插值让物体进行旋转  2是旋转速度 越大旋转越快

        //Camera.main.transform.eulerAngles = Vector3.Lerp(Camera.main.transform.eulerAngles,new Vector3(-40, Camera.main.transform.eulerAngles.y, Camera.main.transform.eulerAngles.z), Time.deltaTime);

    if (Quaternion.Angle(targetRotation, Camera.main.transform.rotation) <1)
    {
        CancelInvoke("CameraUp");
        print("cancel");
        return;
    }
    else
    {
    }


    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

![image.png](https://upload-images.jianshu.io/upload_images/2815884-c2d52985979a0a1b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

网上的方法是用在```Update()``` 为了方便理解 这东西,以及用在特殊场景,隐藏我使用定时器实现了任意场景执行 摄像头平滑转动效果
另外, 不用四元素而是用欧拉角的方法转动 我也不知道咋判断距离差了,```Camera.main.transform.eulerAngles```同样可以达到效果,却不知道该如何停下




2022-7-15 11:32:49
经过```Miracle```大佬的指点,我想要的效果实现了


上面的两种方法都是有bug的,一种是 因为``` Euler```方法我传递的不是欧拉角的xyz导致y轴也发生了旋转,y轴的变化也就导致了左右的镜头晃动

而第二种方法虽然没有左右晃动的bug,但是判断逻辑是有问题的,
欧拉角修改角度 则用欧拉角的四元素转换后再进行判断
   if (Quaternion.Angle(targetRotation, Quaternion.Euler(Camera.main.transform.localEulerAngles.x, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z)) < 1)
1
2
3
和之前代码区别就是 这里 传递的是```Quaternion.Euler(```而不是直接的```rotation```
方法1
使用 ```Camera.main.transform.localEulerAngles```
    Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z);// * Quaternion.identity;
    string str = (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation)) + "差";
    print("angle x:" + Camera.main.transform.localEulerAngles.x + ",差多少:" + str);

    Camera.main.transform.localEulerAngles = Vector3.Lerp(Camera.main.transform.localEulerAngles, new Vector3(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z), Time.deltaTime);

    if (Quaternion.Angle(targetRotation, Quaternion.Euler(Camera.main.transform.localEulerAngles.x, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z)) < 1)
    {
        CancelInvoke("CameraUp");
        print("cancel");
        return;
    }
    else
    {
    }
1
2
3
4
5



方法2:
使用``` Camera.main.transform.localRotation ```
Quaternion targetRotation = Quaternion.Euler(-30, Camera.main.transform.localEulerAngles.y, Camera.main.transform.localEulerAngles.z);// * Quaternion.identity;
            string str = (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation)) + "差";
            print("angle x:" + Camera.main.transform.localEulerAngles.x + ",差多少:" + str);

            Camera.main.transform.localRotation = Quaternion.Slerp(Camera.main.transform.localRotation, targetRotation, Time.deltaTime * 2);//利用Slerp插值让物体进行旋转  2是旋转速度 越大旋转越快


            if (Quaternion.Angle(targetRotation, Camera.main.transform.localRotation) < 1)
            {
                CancelInvoke("CameraUp");
                print("cancel");
                return;
            }
            else
            {
            }