方法1
:将相机拖到人物的游戏对象上,也就是让相机成为角色的子物体,这样相机就会跟随角色移动
但是这样会存在问题,1.相机会随着人物的翻转而翻转,2.相机跟随人物没有缓冲效果,移动比较僵硬
方法2
:代码方式控制相机跟随人物移动
思路一:控制角色和相机的距离,使相机每一帧都和角色保持相等的距离,这样人物移动时,相机也就移动了(代码放在了控制人物的脚本中)
不常用!!!
仅作了解
public GameObject Camera;//镜头移动
private Vector3 Distance;//玩家和摄影机的固定距离
void Start()
{
//这是在start中获取到初始时人物和相机的距离,之后要一直保持这个距离
Distance = this.gameObject.transform.position - Camera.transform.position;
}
void Update()
{
CameraMove();//镜头移动函数
}
void CameraMove()//这里只列举了x轴
{
float currentx;//相机的x坐标
// Distance.x=this.gameObject.transform.position.x-currentx由这个公式推导出下面
currentx = this.gameObject.transform.position.x - Distance.x;
Vector3 temp = new Vector3(currentx, 0, -10);
Camera.transform.position = temp;//改变相机的位置
}
改方法虽然能够使相机跟随,但是还是存在相机移动太僵硬,不够平滑的问题
思路二:利用Lerp函数控制相机(Lerp函数在人物的几种移动方式中有讲)
常用!!!
public Transform playerTarget;//相机靠近的目标(一般是角色)
public float moveTime;//相机移动时间
private void LateUpdate()//注意这里一定要写在LateUpdate函数中,因为LateUpdate在Update之后执行,人物移动是在upadte中,因此是先人物移动再相机移动
{
if (playerTarget!=null)//角色不为空
{
if (playerTarget.position!=transform.position)//相机和角色位置不相等的时候
{
transform.position = Vector3.Lerp(transform.position, playerTarget.position, moveTime*Time.deltaTime);
}
}
}
一般是新建一个控制相机的空对象,把相机挂变成该对象的子对象,然后该对象挂载上面的代码脚本
方法一和方法三都还有个缺陷,那就是没有将相机设置在特定的移动范围内(也可以用代码完成)
方法3
:利用cinemachine插件控制相机(可以快速设定相机跟随目标,并且将相机设定在特定范围内)
在使用cinemachine插件之前需要在包管理器中搜索Cinemachine插件,并安装
安装后由于unity版本不同,2020.3的版本的cinemachine会显示在窗口旁边(有些版本的需要在层级窗口中点击鼠标右键才可以创建cinamachine)
由于cinemahcine的功能过于繁杂,目前只要求会使用它到达相机跟随的目的,点击Create 2D Camera
这时就会出现CM vcam1对象,该对象上就挂载了虚拟相机的组件(参数过于复杂,Follow就是虚拟相机跟随的目标)
同时主相机Main Camera会自动添加CinamachineBrain组件(用来控制显示哪一个虚拟相机)
概念性的东西以后再深入研究,目前就掌握如何使用达到效果即可,1.在创建好CM vcam1对象后,将虚拟相机的Follow参数选择为想要跟随的对象,就可以实现
相机跟随人物
(注意,在设置好后有时会出现人相机跟随运动的角色导致角色画面模糊的情况,这个时候把CinamachineBrain的更新方法改为FixedUpadte即可)这时相机跟随已经完成了,接下来就是做相机的运动范围,
1.先在Cinema chineVirtualCamera组件中点击Add Extension
为相机添加一个边界
2.创建一个空游戏对象(最好取名CameraConfiner)为该游戏对象添加一个2D的碰撞体(这里的2D碰撞体需要是多边形碰撞器才可以),设置号边界范围后就可以给上方的Cooider 2D赋值,设置好之后测试会发现人物等其它碰撞体被挤出地图范围(这是因为人物等其它碰撞体和刚才设置的边界碰撞体相互作用导致的结果,将相机碰撞体单独设置一个图层,随后在游戏设置里面将相机层和其它图层取消碰撞效果即可)