类神界原罪2的摄像机控制——Unity随手记(2020.10.29)

好久没写博客了

事情的起因是我想要实现一种摄像机,要求摄像机能跟随锁定角色移动的同时还能绕角色旋转旋转。类似神界原罪2锁定角色后的摄像机。
先放上最后的实现代码

	// 要跟随的目标
	public Transform target;
	// 摄像机与目标的偏移
    public Vector3 offset = new Vector3(0, 5, 10);

    // 上一帧的目标位置
    public Vector3 targetPrePos = new Vector3();
    // 当前帧的目标位置
    public Vector3 targetCurrentPos = new Vector3();

    void Start()
    {
    
    
    	// 摄像机的初始位置 
        this.transform.position = target.position + offset;
        // 将上一帧目标位置设为初始值
        targetPrePos = target.position;
    }

    void Update()
    {
    
    
    	// 设置当前目标位置
        targetCurrentPos = target.position;
        // translate根据物体上一帧到当前帧的位移移动摄像机,而且基于世界坐标系
        this.transform.Translate(target.position - targetPrePos, Space.World);
        // 将当前帧的位置赋值给上一帧位置的变量,供下一帧使用
        targetPrePos = target.position;
    }

当初实现的时候,我想的跟随是这样的

    void Update()
    {
    
    
        this.transform.position = target.position + offset;
    }

然后遇到了什么问题呢,由于我还要能旋转摄像机,而直接在每一帧将位置粗暴的改为target.position + offset会导致摄像机被固定在target.position + offset这一个位置,无法旋转。所以不能直接修改transform.position,而是需要在transform.position的基础上加减Vector3。
我想到了translate函数,貌似就是干这个的。
但是很快我又遇到了问题,摄像机并不和我想得一样跟着目标走,而是乱跑。但是看似乱跑似乎又有点规律。
一开始我以为是target.position - targetPrePos顺序错了要反过来。但是反过来摄像机的运动也不对。
然后我才想到会不会是因为摄像机的运动是基于本地的,而他又要一直盯着目标看,所以本地坐标不行。世界坐标就是我们想要的。网上查了查translate是基于那种坐标运作的,发现translate可以用参数进行坐标轴设置。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37856544/article/details/109365666