Unity3D中摄像机跟随方法

您所在的位置:网站首页 unity缓慢转向目标 Unity3D中摄像机跟随方法

Unity3D中摄像机跟随方法

2023-03-25 09:04| 来源: 网络整理| 查看: 265

1.第一种方法 摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下: /  挂载对象:主相机 // 功能:相机跟随人物 // 注意:相机只能跟随人物移动,但是如果人物转向或者做某些动作,摄像机并不跟随 using UnityEngine; using System.Collections; public class CameraShareScript : MonoBehaviour {         //摄像机于要跟随物体的距离          Vector3 Dir; //要跟随的物体 public  GameObject m_Player; // Use this for initialization void Start ()        { //获取到摄像机于要跟随物体之间的距离 Dir = m_Player.transform.position - transform.position; } // Update is called once per frame void LateUpdate () { //摄像机的位置 transform.position = m_Player.transform.position - Dir;         } }

优点:代码简单,但是不能跟随人物旋转,运动。

2.第二种方法: 这种方法是上种方法的优化,可以实现跟随人物移动,跟随人物旋转等基本功能,但是缺点是如果添加刚体组件,摄像机无法穿墙跟随人物,其代码如下: //  挂载对象:主相机 // 功能:把要跟随的人物Tag修改为Player // 注意: using UnityEngine; using System.Collections;

public class CameraFindPlayerScript : MonoBehaviour { //相机距离人物高度 float m_Height = 5f; //相机距离人物距离 float m_Distance = 5f; //相机跟随速度 float m_Speed = 4f; //目标位置 Vector3 m_TargetPosition; //要跟随的人物 Transform follow; // Use this for initialization void Start () { // 通过Tag得到这个要跟随的人物 follow = GameObject.FindWithTag ("Player").transform; } // Update is called once per frame //相机平滑的跟随人物移动 void LateUpdate () { //得到这个目标位置 m_TargetPosition = follow.position + Vector3.up * m_Height - follow.forward * m_Distance; //相机位置 transform.position = Vector3.Lerp (transform.position, m_TargetPosition, m_Speed * Time.deltaTime); //相机时刻看着人物 transform.LookAt (follow);

} }

基本实现相机时刻跟随人物移动,方便快捷。 本博客为作者亲力手敲,持续更新,如有雷同,纯属巧合 3.第三种方法 第三种方法:射线检测,保证不论主角在哪摄像机永远可以看到主角,并且把摄像机的y轴和z轴锁死,使玩家视野不晕 using UnityEngine; using System.Collections; /// /// Camera move. /// 挂载对象:摄像机 /// 作用:摄像机跟随人物 /// public class CameraMove : MonoBehaviour { //摄像机的移动速度 public float moveSpeed = 3f; //摄像机的旋转速度 public  float turnSpeed = 10f; //定义私有玩家 private Transform m_Player; //摄像机与玩家之间的初始偏移量 private Vector3 offset; //射线的碰撞信息 private RaycastHit hit; //摄像机与玩家之间的距离 private float distance; //摄像机的观察点 private Vector3[] currentPoints; //通过Awake拿到自身的组件 void Awake () { //通过tag找到人物组件 m_Player = GameObject.FindWithTag (TagsScript.Player).transform; //定义一个v3类型的数组,里面有5个元素 currentPoints = new Vector3[5]; } //初始化游戏对象 void Start () { //游戏开始时摄像机与玩家之间的距离 distance = Vector3.Distance (transform.position, m_Player.position); //摄像机指向玩家 //玩家与摄像机之间的偏移量 offset = m_Player.position - transform.position; }

//物理引擎相关的放到FixedUpdate中 //LateUpdate可以避免卡顿 void LateUpdate () { //摄像机观察的第一个点 Vector3 startPosition = m_Player.position - offset; //摄像机的最后一个点 Vector3 endPosition = m_Player.position + Vector3.up * distance; //把摄像机的五个观察点放到数组中,并且1,2,3三个观察点使用线性插值让摄像机平滑移动Slerp currentPoints [1] = Vector3.Slerp (startPosition, endPosition, 0.25f); currentPoints [2] = Vector3.Slerp (startPosition, endPosition, 0.5f); currentPoints [3] = Vector3.Slerp (startPosition, endPosition, 0.75f); currentPoints [0] = startPosition; currentPoints [4] = endPosition; //定义一个变量用来存储固定帧可以看到玩家的观察点 //viewposition = currentPoints [0] Vector3 viewposition = currentPoints [0]; //for循环遍历这些点,如果找到最合适的点就把那个当前点赋值给可以看到玩家的观察点CheckView检测某个点能否看到玩家 for (int i = 0; i < currentPoints.Length; i++) { //如果检测到某个点可以看到玩家 if (CheckView (currentPoints [i])) { //把这个当前点赋值给viewposition viewposition = currentPoints [i]; //之后返回不在继续遍历 break; } } //把摄像机移动到观察点 transform.position = Vector3.Lerp (transform.position, viewposition, Time.deltaTime * moveSpeed); //调用摄像机旋转方法 SmoothRotate (); } /// /// Checks the view. /// 检测某个点是否可以看到玩家 /// /// true, if view was checked, false otherwise. /// Position. //检测某个点能否看到玩家的方法bool类型 bool CheckView (Vector3 pos) { //定义玩家与观察点之间的方向向量 Vector3 dir = m_Player.position - pos; //发射射线 if (Physics.Raycast (pos, dir, out hit)) { //如果射线打到玩家 if (hit.collider.tag == TagsScript.Player) { //返回true return true; } } //不然返回false return false; } /// /// Smooths the rotate. /// 摄像机旋转的方法 /// /// 摄像机旋转的方法 void SmoothRotate () { //指向起始位置 //摄像机到玩家的向量 Vector3 m_Dir = m_Player.position - transform.position; //要旋转的角度 Quaternion qua = Quaternion.LookRotation (m_Dir); transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * turnSpeed); //把摄像机x,y轴锁死 transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);

} }

此种方法的好处非常多,可以检测遮挡物,并且不论人物在哪里都可以看到人物。


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3