摄像机跟随
1:实现摄像机跟随 实现思想:计算出摄像机和游戏物体的相对坐标,在Update中让摄像机的坐标等于相对坐标加上物体的坐标,这样摄像机会随着物体的移动而移动。 start offect=camera.transform.position-player.transform.position update camera.transform.position=offect+player.transform.position private Vector3 offect; private Transform PlayerPosition; void Awake() { PlayerPosition = GameObject.Find(Managetags.player).GetComponent<Transform>(); } void Start () { offect = gameObject.transform.position- PlayerPosition.position; } void Update () { FollowPlayerMe(); gameobject.transform.position=offect+PlayerPosition.position; } 这样摄像机放的太高会被一些物体挡住,拍摄不到物体,所以这个方法不太实用 ? 2:摄像机在跟随时会被一些物体挡住,解决这个问题(摄像机离物体太远时,中间可能会有障碍物) 摄像机的第一个位置就是用上面的方法计算出的位置,最后一个位置是在物体的正上方,摄像机的高度是不会变化的(只是对这种处理方法而言) 在这个向量之间多取几个位置,用射线来检测二者之间是否有障碍物,选一个没有障碍物的位置放摄像机。 ? 在向量中取五个点,依此检验五个点中谁能符合要求,就把摄像机放在那个点上。 offect=camera.transform.position-player.transform.position ? 第一个位置: BeginPos1=player.transform.position+offect 第五个位置: Endpos5=New Vector3(player.transform.position.x,player.transform.position.y+BeginPos1.y,player.transform.position.z) 不过有的人的第五个位置用向量的长度求出的,只是高度更高一点。 Endpos5=BeginPos1.Mangitude*vector3.Up+player.transform.position Vector3.Mangitude是得到向量的长度。 第二个位置 Pos2=vector3.lerp(BeginPos1,EndPos5,0.25f) 第三个位置 pos3=vector3.lerp(Beginpos1,0.5f) 第四个位置 pos4=vector3.lerp(beginPos1,Endpos5,0.75) 把五个位置存放在数组中 Vector3[]? PosArray=new Vector3[]{BeginPos1,Pos2,Pos3,Pos4,EndPos5} 初始化摄像机的位置 vector3 target=BeginPos1 检测五个位置那个更合适for(int i=0;i<=4;i++) { RayCastHit? rayhit//存储射线的碰撞信息 if(Physics.RayCast(posArray[i],playerposition.transform.position-BeginPos1,out rayhit))//bool ? Physics.RayCast(射线发射点,射线发射方向,射线的碰撞信息,(射线的长度)) {//射线碰撞到物体时 ? if(rayhit.collider.tag=="player")//射线碰到玩家时,就是最佳的位置 { ? target=PosArray[i]; ? break; } //碰到其他物体,表明该位置不行,换下一个位置检测 else{ continue; } else{//射线未碰撞到物体,因为我们更改摄像机的位置时并为改摄像机的朝向 target=PosArray[i]//射线未碰撞到物体,我们暂时把他设为理想的位置 } } gameobject.transform.position=target; void FollowPlayerMe() { //计算出摄像机的五个位置 BeginPos1 = offect + PlayerPosition.position;//第一个位置 EndPos1 = new Vector3(PlayerPosition.transform.position.x,PlayerPosition.transform.position.y + BeginPos1.y,PlayerPosition.transform.position.z); // EndPos1 = offect.magnitude * Vector3.up + PlayerPosition.position;//得到摄像机的第五个位置 Vector3 target = BeginPos1;//默认第一个位置为摄像机的位置 VecPos1 = Vector3.Lerp(BeginPos1,EndPos1,0.25f);//摄像机的第二个位置 VecPos2 = Vector3.Lerp(BeginPos1,0.5f);//摄像机的第三个位置 Vecpos3 = Vector3.Lerp(BeginPos1,0.75f);//摄像机的第四个位置 Vector3[] PosArray = new Vector3[] { BeginPos1,VecPos1,VecPos2,Vecpos3,EndPos1};//将所有的位置放在数组中,逐个检测 for (int i = 0; i <= 4; i++) { RaycastHit rayHit;//存储射线的碰撞信息 if (Physics.Raycast(PosArray[i],PlayerPosition.transform.position - PosArray[i],out rayHit))//射线碰撞到物体 { if(rayHit.collider.tag!=Managetags.player)//碰撞到的是其他物体,就检测在一个位置 { continue; } else { target = PosArray[i];//碰撞到的是玩家,把该位置设为摄像机的位置,并终止检测 break; } } else//射线未碰撞到物体时,把该位置暂时设为摄像机的位置 { target = PosArray[i]; } } this.transform.position = Vector3.Lerp(gameObject.transform.position,target,Time.deltaTime*FollowSpeed); ? ? ? ? 3:实现摄像机跟随时,摄像机移动太急,导致镜头太抖 ? ?? 最终调整位置时用插值运算(插值运算一般要放在不断更新的函数中) ? ?? gameobject.transform.position=vector3.lerp(gameobject.transform.position,Time.deltatime*speed) ? ? gameobject.transform.LookAt(player.transform.position) Quaternion nowRotation = transform.rotation; this.transform.position = Vector3.Lerp(gameObject.transform.position,Time.deltaTime*FollowSpeed); transform.LookAt(PlayerPosition.position); Quaternion.Lerp(nowRotation,transform.rotation,Time.deltaTime * FollowSpeed); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |