Unity C#摄像机高级跟随脚本

//声明变量,保存摄影机要跟随的目标
public Transform target;
//声明变量,保存移动速度,初始化为2
public float moveSpeed = 2;
//声明变量,保存位移
private Vector3 offset;
void Awake() {
//位移为摄像机位置与目标位置的距离
offset = transform.position - target.position;
//位移的x轴坐标锁定为0
offset = new Vector3(0, offset.y, offset.z);
}
void LateUpdate() {
//摄像机的预备开始点坐标为目标点坐标加上位移的坐标
Vector3 beginPos = target.position + offset;
//摄像机预备最终点坐标为目标点坐标的正上方(高度为位移的长度)
Vector3 endPos =target.position+offset.magnitude * Vector3.up;
//取预备开始点与预备最终点的1/5的点作为预备中间的第一个点
Vector3 pos1 = Vector3.Lerp(beginPos, endPos, 0.2f);
//取预备开始点与预备最终点的2/5的点作为预备中间的第二个点
Vector3 pos2 = Vector3.Lerp(beginPos, endPos, 0.4f);
//取预备开始点与预备最终点的3/5的点作为预备中间的第三个点
Vector3 pos3 = Vector3.Lerp(beginPos, endPos, 0.6f);
//取预备开始点与预备最终点的4/5的点作为预备中间的第四个点
Vector3 pos4 = Vector3.Lerp(beginPos, endPos, 0.8f);
//声明数组(位置排列),将以上6个预备位置放入数组
Vector3[] posArray = new Vector3[] { beginPos, pos1, pos2, pos3, pos4, endPos };
//初始化摄像机位置为第一个预备点
Vector3 cameraPos = posArray[0];
//遍历数组,找到摄像机不被遮挡的预备点
for (int i = 0; i < 6; i++) {
//声明一个射线投射碰撞的变量
RaycastHit hitInfo;
//从摄像机位置向目标位置创建一条射线,如果有碰撞体遮挡
if (Physics.Raycast(posArray[i], target.position - posArray[i], out hitInfo)) {
//如果发出射线遮挡的物体不是人物
if (hitInfo.collider.tag != Tags.playerTags) {
//继续移动摄像机
continue;
}
//直到发出射线遮挡的物体是人物
else {
//确定摄像机的最终位置
cameraPos = posArray[i];
//中断循环
break;
}
}
//从摄像机位置向目标位置创建一条射线,如果没有碰撞体遮挡
else {
//摄像机最终位置就是当前预备点位置
cameraPos = posArray[i];
//中断循环
break;
}
}
//摄像机的位置从当前的位置匀速的移向摄像机最终位置
transform.position = Vector3.Lerp(transform.position, cameraPos, Time.deltaTime * moveSpeed);
//摄像机镜头始终看向目标的位置
transform.LookAt(target.position);
}

猜你喜欢

转载自blog.csdn.net/douyewudiv5/article/details/89478753