在Unity中摄像机跟随游戏对象移动一般有下列几种方式:
①.把摄像机设成player的子物体; 一般不推荐这种用法;
②.通过脚本获取玩家的位置,然后让摄像头跟随移动;
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 public class CameraMoveScript:MonoBehaviour{ 5 6 public float distanceX; //X轴 7 public float distanceY; //Y轴 8 public float speed; //速度 9 10 private Vector3 targetPosition; // 摄像头要移动的位置; 11 private Vector3 offset; //用于接受向量; 12 13 Transform player; // 玩家,被跟随者; 14 15 void Start(){ 16 player=GameObject.FindWithTag("Player").transfrom; // 通过被标签找到被跟随者; 17 // 得到当前场景中摄像头需要跟随物体的偏移量(向量); 18 offset=transform.position-player.position; // 摄像头位置-玩家位置,得到向量; 19 20 } 21 // 摄像头跟随的代码必须写在LateUpdate中,防止空帧; 因为要先player先动,等player动了以后,摄像头跟随移动; 22 void LateUpdate(){ 23 // 因为摄像头是在player背后,所以用减法得到摄像头的位置; 24 transformPosition=player.position+Vector3.up*distanceY-Vector3.forward*distanceX; 25 26 // 利用Lerp线性插值来实现缓动; 27 transform.position=Vector3.Lerp(transform.position,targetPosition,Time.deltaTime*speed); 28 // 让摄像头一直盯着玩家; 29 transform.LookAt(player); 30 // 玩家位置+偏移量; 31 transform.position=player.position+offset; 32 } 33 }
可以将上述代码进行合并这样代码显得跟加的简洁:
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 public class CameraMoveScript:MonoBehaviour{ 5 6 public float distanceX; //X轴 7 public float distanceY; //Y轴 8 public float speed; //速度 9 10 private Vector3 targetPosition; // 摄像头要移动的位置; 11 private Vector3 offset; //用于接受向量; 12 13 Transform player; // 玩家,被跟随者; 14 15 void Start(){ 16 player=GameObject.FindWithTag("Player").transfrom; // 通过被标签找到被跟随者; 17 // 得到当前场景中摄像头需要跟随物体的偏移量(向量); 18 offset=transform.position-player.position; // 摄像头位置-玩家位置,得到向量; 19 20 } 21 // 摄像头跟随的代码必须写在LateUpdate中,防止空帧; 因为要先player先动,等player动了以后,摄像头跟随移动; 22 23 void LateUpdate(){ 24 // 通过Lerp线性插值来设置摄像头的缓动; 25 transform.position=Vector3.Lerp(transform.position,player.position+offset,Time.deltaTime*speed); // 可以不用speed来设置速度,直接跟定死; 26 transform.LooAt(player); 27 } 28 } 29