虽然百度上有很多相关教程,B站上也有很多大佬发过视频教程。 但是我在云中看到了很多。 有时我想增加更多的功能,我不会改变它们。 碰壁了一个多星期,我明白了。 在这里记录下我的学习记录。
一、基础篇
这里是重点,如果不了解基础知识,就无从下手。
(1) 什么是向量? 一个向量就是:一个有大小(magnitude)和方向的量是一个向量。
通俗地说:坐标系上有两点,即A点和B点,A点到B点的向量表示A点到B点的方向,其大小就是A点到B点的距离.
(2)向量的坐标:由一对数组成,表示为向量沿坐标轴(基本向量)移动的单位距离。
(3)向量的加法:就是对向量进行位移运算。
(4)向量乘法:表示是对原向量的缩放(方向不变,大小改变)
从原点(0, 0)到(1, 2)的向量,乘以2,变成(2, 4),向量的方向不变,大小变成原来的两倍
二、要求
现在有必要明确一下,需要达到什么样的效果?
(1) 当玩家按下“↑”键时,玩家角色会向前移动,窗口的视野应该面向前方。
(2) 视野应始终跟随玩家角色,即摄像机与角色之间的距离是固定的。
(3)当视野被遮挡时,自动调整视野位置到可以看到人物的地方。
(4) 滚动鼠标滚轮时,可以调整相机与角色的距离(向上滚动是放大,向下滚动是缩小)。
(5) 按住鼠标右键向左拖动时,视野向左转; 向右拖动时,视野会向右转; 抬头转身。
3.实现
(1) 由于要求是视野的正面方向与角色的正面方向一致,也就是说摄像机和角色的方向一致unity摄像机旋转,可以调整两者的距离.
① 重新设置角色坐标(0, 0, 0)
② 重置相机坐标(0, 0, 0)
③由于坐标系的z轴代表正面,我想让相机看到角色的背面,所以向后拖一点距离。
这里以距离5为例。 重新设置为5,即相机坐标修改为(0, 0, -5)。
(2) 摄像机始终跟随角色,也就是说摄像机与角色的距离是固定的
以上面的例子为例游戏策划,距离5就是始终保持的相机和角色之间的距离。
因为角色可以移动,所以需要实时计算摄像机的距离位置。 具体方法如下:
① 计算相机和角色之间的偏移量。
相机与角色的偏移量(向量Offset)=相机坐标-角色坐标。
由于向量的定义,可知向量Offset描述的是相机坐标到角色坐标的方向和距离。
② 相机坐标=当前角色坐标+偏移量。
既然相机是跟着角色走的,那么就必须保证相机的方向和角色的方向要始终保持一致,距离也要保持一致。
示例:当角色向上和向右移动时 (1, 0, 2),相机也必须移动 (1, 0, 2)
(3) 简单实现
(1)在场景中,首先调整摄像机和角色的位置和角度。
(2) 实现代码
Vector3.Lerp(起点,终点,t)
函数说明:在起点坐标到终点坐标确定的直线上,这两点之间任意一点的坐标,参数t表示百分比,0表示起点坐标,大于等于1时,表示终点坐标。 如果为0.5,则表示两点之间形成的线段的中心位置的坐标。
所以使用这个参数的目的是为了让相机能够顺畅跟随。 如果不使用该参数,当角色使用位移技能瞬移一定距离时,相机也会瞬移,通常相机会抖动。
好了,一个简单的相机跟随就完成了。
(4) 摄像机围绕玩家旋转,但距离保持不变
在PRG游戏中,一般可以通过鼠标或摇杆操作来改变视角。
分析
当我们改变视角时,相机和角色之间的距离是不变的。 也就是说,当以角色的位置为原点,以角色到相机的距离为半径时,就会形成一个圆。 因此unity摄像机旋转,镜头移动的轨迹一直是以角色所在位置为原点形成的圆圈。
①当向量从某一点开始旋转360度,会形成一个圆,那个点就是圆心,向量终点的坐标就是圆的边。
② 因此,当要让对象A绕对象B旋转时,只需要旋转向量,然后加上(减去)对象B的坐标即可。
完成
(1) 摄像机围绕角色旋转
升高相机位置
跑步看到的效果是摄像机一直围绕着角色旋转。
(2) 鼠标操作调整摄像机角度
(3)处理摄像头穿墙问题
原因:当摄像头和播放器之间有障碍物时,摄像头会被障碍物挡住,导致显示器穿墙或直接被障碍物挡住。
解决方法:出现这种情况时,只需将相机移动到没有障碍物的位置即可。
想法:
从玩家角色的位置开始3D动画,向相机的方向发射一条射线。
当光线碰撞到物体时,判断物体是否是相机,如果不是,则将碰撞点的位置设置为相机的新位置。
PS:当玩家离障碍物很近的时候,还是会出现穿墙的情况。 这个时候只要设置障碍物的碰撞体比显示的模型大即可。
计算相机的新位置
转移
完整代码: