要实现的效果:从侧面 跟随player,并且每一时刻能看见player
1.跟随效果:在 Awake()里面 获取当前和player的距离,并设置x为0
offset = transform.position - player.position;
offset = new Vector3(0, offset.y, offset.z);
update(): Vector3 beginPos = player.position + offset;
1.1.时刻都保持player在相机视线内:有时候player走到墙内,摄像机会出现看不到player的情况
需进行射线的检测和碰撞,设置一个向量:从当前相机置到player头顶上方的位置的向量,将这个向量均匀分成几等分,从每个位置 依次发射射线进行检测,若未检测到player,则camera位置向后移
得到相机初始位置:Vector3 beginPos = player.position + offset;
得到 相机末位置,也就是player头顶上 的位置,长度为offset.magnitude,
Vector3 endPos = player.position + offset.magnitude * Vector3.up;
均匀等分从beginPos到EndPos,并进行射线的检测,targetPos存储相机的目标位置:
Vector3 pos1 = Vector3.Lerp(beginPos, endPos, 0.25f);
Vector3 pos2 = Vector3.Lerp(beginPos, endPos, 0.5f);
Vector3 pos3 = Vector3.Lerp(beginPos, endPos, 0.75f);
Vector3[] posArray = new Vector3[] { beginPos, pos1, pos2, pos3, endPos };
Vector3 targetPos = posArray[0];
for (int i = 0; i < 5; i++)
{
RaycastHit hitinfo;
if (Physics.Raycast(posArray[i], player.position - posArray[i], out hitinfo))
{
if (hitinfo.collider.tag != Tags.player)
{
continue;
}
else
{
targetPos = posArray[i];
break;
}
}
else
{
targetPos = posArray[i];
break;
}
}
1.2相机跟随
this.transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime * moveSpeed);
2.相机旋转
这里提供两种方式:
2.1
Quaternion nowRoatation = transform.rotation;
transform.LookAt(player.position);//更新了相机的方向
transform.rotation = Quaternion.Lerp(nowRoatation, transform.rotation, Time.deltaTime * rotateSpeed);
2.2
Vector3 relplayerPos = player.position-transform.position;
Quaternion lookAtRotation = Quaternion.LookRotation(relplayerPos, Vector3.up);
transform.rotation = Quaternion.Lerp(transform.rotation, lookAtRotation, smooth * Time.deltaTime);