Unity3D中攝像機跟隨方法(借鑒大神,僅作為筆記用)


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;
/// <summary>
/// Camera move.
/// 掛載對象:攝像機
/// 作用:攝像機跟隨人物
/// </summary>
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 ();
}
/// <summary>
/// Checks the view.
/// 檢測某個點是否可以看到玩家
/// </summary>
/// <returns><c>true</c>, if view was checked, <c>false</c> otherwise.</returns>
/// <param name="pos">Position.</param>
//檢測某個點能否看到玩家的方法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;
}
/// <summary>
/// Smooths the rotate.
/// 攝像機旋轉的方法
/// </summary>
/// 攝像機旋轉的方法
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);

}
}

此種方法的好處非常多,可以檢測遮擋物,並且不論人物在哪里都可以看到人物。
 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM