摄像机跟随物体的实现方式很多,也都是现成的代码可以直接拿过来用,但是项目中难免围绕这个功能做扩充,所以简单了解下实现原理还是有必要的, 这边简要介绍两种实现方式:以第一人称视角跟随角色。
第一种方式,比较简单:
void cameraFollowFunc_1(){
//先改变坐标
//先设置目标坐标
Vector3 targetPosition = player.position + Vector3.up*_cameraDefaultHeight - player.forward*_cameraDistance;
_camera.position = Vector3.Lerp(_camera.position,targetPosition,Time.deltaTime*4.0f);
//改变方向
//始终观察角色
_camera.LookAt(player);
}
注意:player.forward默认角色z轴为摄像机前方,否则调整这个参数
第二种方式,稍微麻烦:
void cameraFollowFunc_2(){
//摄像机距离差值
float cameraDistance = Mathf.Lerp(30,35,Time.deltaTime*1.5f);
//设置摄像机的方向
//角色y轴偏移为摄像机偏移
float cameraDir = Mathf.Lerp(0,plyer.localEulerAngles.y,Time.deltaTime4.0f);
//设置摄像机偏移
camera.localEulerAngles = new Vector3(0,cameraDir,0);
//开始计算坐标
//以角色为起点,计算角色背后坐标偏移量(y轴不变)
Vector3 direction = rotateAlongY(new Vector3(0,0,-1),player.localEulerAngles.y);
//设置坐标
camera.position = new Vector3(player.position.x + direction.x*cameraDistance,
Mathf.Lerp(camera.position.y,player.position.y+20,Time.deltaTime*70),
Mathf.Lerp(camera.position.z,player.position.z+direction.z*cameraDistance,Time.deltaTime*50)
);
}
/// <summary>
/// 计算相对于角色的坐标偏移向量
/// </summary>
/// <param name="v3">V3.</param>
/// <param name="rotationDeg">Rotation deg.</param>
void rotateAlongY(Vector3 v3,float rotationDeg){
//生成零向量
Vector3 finalVector = Vector3.zero;
//转化成弧度
float Red = rotationDag * Mathf.Deg2Rad;
finalVector.z = Mathf.Cos(-rad)*v3.z;
finalVector.x = Mathf.Sin(-rad)*v3.z;
return finalVector;
}