這一節(jié)課,我們來設(shè)置相機(jī)。
使用Hierarchy中額Created菜單創(chuàng)建一個(gè)空的游戲?qū)ο驝reate Empty,重命名空的游戲?qū)ο鬄镃ameraRig,利用Reset Position重設(shè)屬性,并將Rotation屬性設(shè)為(40,60,0),將Main Camera對象拖入CameraRig對象中。設(shè)置Main Camera的Position值為(0,0,-65),并將Main Camera的Rotation設(shè)置為(0,0,0)
好了,攝像機(jī)對象創(chuàng)建完畢,那么我們的攝像機(jī)應(yīng)該做什么呢?
1。跟蹤坦克
2.。重新聚焦使適應(yīng)在場景中的坦克。
好下面我們開始進(jìn)行。
找到Scripts/Camera文件夾,將Camera Control腳本放到CameraRig對象當(dāng)中。下面我們就來設(shè)置Camera Control腳本,雙擊打開。
首先我們實(shí)現(xiàn)對坦克的跟蹤功能,當(dāng)兩個(gè)坦克在進(jìn)行對戰(zhàn)時(shí),我們選擇兩個(gè)坦克的中間點(diǎn)為焦點(diǎn),然后在每一幀設(shè)置攝像機(jī)的位置。按照這個(gè)思路。創(chuàng)建一個(gè)腳本命名為Camera Control。
首先定義一個(gè)獲取中間點(diǎn)的函數(shù)findAveragePosition。
private void findAveragePosition(){
?Vector3 averagePos=new Vector3();//定義一個(gè)存儲(chǔ)三維位置信息的變量;
?int numTargets=0;//初始化目標(biāo)個(gè)數(shù)
//遍歷所有的目標(biāo)然后獲取他們的位置
//定義一個(gè)全局?jǐn)?shù)組變量,用于存儲(chǔ)目標(biāo)的Transform信息
public Transform[] m_Targets; ?
for(int i=0;i<m_Targets.Length;i++){
? ?if(!m_Targets[i].gameObject.activeSelf) ? //如果物體不是 活動(dòng)的,那么遍歷下一個(gè)
? ? ? ? ? continue;
? averagePos+=m_Targets[i].position;
? numTargets++;
}
if(numTargets>0)
averagePos/=numTargets;//獲得中點(diǎn)坐標(biāo)
averagePos.y=transform.position.y;//y的值保持不變
m_DesiredPosition=averagePos;//獲得想要的位置坐標(biāo);
}
再定義一個(gè)全局私有變量用于存儲(chǔ)相機(jī)的新位置
private Vector3 m_desirePosition;
定義一個(gè)相機(jī)的移動(dòng)函數(shù)Move
private void Move(){
? ?FindAveragePosition();//尋找目標(biāo)的中點(diǎn)位置
?transf.position=Vector3(transform.position,m_desirePosition,ref m_MoveVelocity,m_DampTime);
//這個(gè)方法的四個(gè)參數(shù)數(shù)分別是攝像機(jī)當(dāng)前的位置;攝像機(jī)需要接近的目標(biāo)的position;當(dāng)前的速度,這個(gè)值會(huì)在你調(diào)用函數(shù)時(shí)隨時(shí)被更改,攝像機(jī)重新聚焦的時(shí)間,更多詳細(xì)的參數(shù)及信息可以參看官方文檔。
}
我們再定義兩個(gè)變量
public float m_DampTime=0.2f;
private Vector3 m_MoveVelocity;
然后再FixedUpdate函數(shù)中調(diào)用Move函數(shù)。接下來回到Unity界面當(dāng)中,我們將Target改為1,而后將Tank對象拖入到Element當(dāng)中,攝像機(jī)就可以跟著坦克一起移動(dòng)了。
接下來我們需要讓攝像機(jī)自動(dòng)變焦。繼續(xù)打開Camera_Control腳本
定義一個(gè)函數(shù)FindRequestSize(),用于改變相機(jī)視角的Size;
private float FindRequestSize()
{
Vector3 desiredLocalPos = transform.InverseTransformPoint(m_DesirePosition);//找到攝像機(jī)正在移動(dòng)到的位置的坐標(biāo)對應(yīng)的自己的坐標(biāo)
float size = 0f; //開始size預(yù)設(shè)為0;
//遍歷所有的目標(biāo)
for (int i = 0; i < m_Targets.Length; i++)
{
if (!m_Targets[i].gameObject.activeSelf)
continue;
Vector3 targetLocalPos = transform.InverseTransformPoint(m_Targets[i].position);//在攝像機(jī)的Local space中找到目標(biāo)的位置。
Vector3 desiredPosInTarget = targetLocalPos - desiredLocalPos;//從相機(jī)自己坐標(biāo)空間中找到期望的位置的目標(biāo)的位置
size = Mathf.Max(size, Mathf.Abs(desiredPosInTarget.y));
size = Mathf.Max(size, Mathf.Abs(desiredPosInTarget.x) / m_camera.aspect);
}
size += m_ScreenEdgeBuffer;
size = Mathf.Max(size, m_Minsize);
return size;
}
在定義幾個(gè)變量
private float m_ZoomSpeed;
private Camera m_camera;
public float m_ScreenEdgeBuffer = 4f;
public float m_Minsize = 6.5f;
這樣我們的攝像頭就可以進(jìn)行變焦了