《Unity入門案例-Tanks坦克大戰(zhàn)》10-相機(jī)控制

10 相機(jī)控制

本節(jié)主要學(xué)習(xí)如何控制相機(jī)自動調(diào)整位置和焦距,使兩個坦克一直同時在視野內(nèi).

image

在Hierarchy點擊右鍵

image

點擊 Create Empty,生成空對象,改名為CameraRig

image

設(shè)置CameraRig rotation為(40,60,0)

image

將MainCamera拖拽到CameraRig中,使之成為CameraRig的子對象

設(shè)置MainCamera的position為(0,0,-65),rotation為(0,0,0)

image

Orthographic Camera

image

Orthographic size

image

通過設(shè)置size實現(xiàn)縮放

Aspect寬高比

image

相機(jī)要做到事情有兩個:跟隨坦克和通過縮放實現(xiàn)坦克一直在屏幕內(nèi).

在wm/Scripts文件夾新建腳本CameraRig ,掛載到CameraRig上面

下面我們首先實現(xiàn)跟隨坦克

image

跟隨坦克首先找到坦克坐標(biāo)的中間坐標(biāo),然后把cameraRig移動過去

先計算中間坐標(biāo)

public Transform[] targets; // tanks

private Vector3 targetPos; // 計算出來的目標(biāo)點

void FindAveragePos(){ // 計算平均坐標(biāo)

    Vector3 avg = new Vector3 (); // 計算平均坐標(biāo)的臨時變量

    for (int i = 0; i < targets.Length; i++) { // 所有tank遍歷一遍

        avg += targets [i].position; // 所有坐標(biāo)都加起來

    }

    avg /= targets.Length; // 除以坦克個數(shù),得到坐標(biāo)的平均值

    avg.y = transform.position.y; // 坐標(biāo)的y軸保持不變

    targetPos = avg; // 更新目標(biāo)點

}

然后使用 Vector3.SmoothDamp 平滑阻尼是相機(jī)移動過去

還需要聲明兩個變量

private Vector3 moveSpeed; // 移動速度,SmoothDamp里面使用的

private float dampTime = 0.2f;// 到達(dá)目標(biāo)的大約時間,SmoothDamp里面使用的

然后再Update()里面添加

transform.position = Vector3.SmoothDamp (transform.position, targetPos, moveSpeed, dampTime);

就可以緩動運動過去了.

image

CameraRig代碼:

using UnityEngine;

using System.Collections;

public class CameraRig: MonoBehaviour {

public Transform[] targets; // tanks

private Vector3 targetPos; // 計算出來的目標(biāo)點

private Vector3 moveSpeed; // 移動速度,SmoothDamp里面使用的

private float dampTime = 0.2f;// 到達(dá)目標(biāo)的大約時間,SmoothDamp里面使用的

// Use this for initialization

void Start () {

} 

// Update is called once per frame

void Update () {

    FindAveragePos (); // 計算平均坐標(biāo)

    transform.position = Vector3.SmoothDamp (transform.position, targetPos,ref moveSpeed, dampTime);// 緩動效果

}

void FindAveragePos(){ // 計算平均坐標(biāo)

    Vector3 avg = new Vector3 (); // 計算平均坐標(biāo)的臨時變量

    for (int i = 0; i < targets.Length; i++) { // 所有tank遍歷一遍

        avg += targets [i].position; // 所有坐標(biāo)都加起來

    }

    avg /= targets.Length; // 除以坦克個數(shù),得到坐標(biāo)的平均值

    avg.y = transform.position.y; // 坐標(biāo)的y軸保持不變

    targetPos = avg; // 更新目標(biāo)點

}

}

回到unity,將兩個坦克放到Targets里面

image

點擊Play運行,就可以看到無論兩個坦克怎么移動,此時相機(jī)一直會在兩個坦克之間.

image

但是不一定總能看到兩個坦克.

下面來計算一下size實現(xiàn)正確的縮放.

image

中間的點為targetPos,就是我們上面計算出來的那個坐標(biāo).

Y軸 size = distance.y

X軸 size = distance.x / aspect

取大的

image

最終版本代碼截圖

image

CameraRig最終代碼:

using UnityEngine;

using System.Collections;

public class CameraRig: MonoBehaviour {

public Transform[] targets; // tanks

private Vector3 targetPos; // 計算出來的目標(biāo)點

private Vector3 moveSpeed; // 移動速度,SmoothDamp里面使用的

private float dampTime = 0.2f;// 到達(dá)目標(biāo)的大約時間,SmoothDamp里面使用的

private Camera camera; // 相機(jī)

private float screenEdgeBuffer = 4f; // 邊緣緩沖

private float minZoom = 6.5f; // 最小縮放值

private float zoomSpeed ;// 縮放速度 SmoothDamp里面使用

// Use this for initialization

void Start () {

    camera = GetComponentInChildren<Camera> ();

} 

// Update is called once per frame

void Update () {

    FindAveragePos (); // 計算平均坐標(biāo)

    transform.position = Vector3.SmoothDamp (transform.position, targetPos,ref moveSpeed, dampTime);// 緩動移動

    float zoom = FindZoomSize (); // 計算縮放值

    camera.orthographicSize = Mathf.SmoothDamp (camera.orthographicSize, zoom, ref zoomSpeed, dampTime);// 緩動縮放

}

void FindAveragePos(){ // 計算平均坐標(biāo)

    Vector3 avg = new Vector3 (); // 計算平均坐標(biāo)的臨時變量

    for (int i = 0; i < targets.Length; i++) { // 所有tank遍歷一遍

        avg += targets [i].position; // 所有坐標(biāo)都加起來

    }

    avg /= targets.Length; // 除以坦克個數(shù),得到坐標(biāo)的平均值

    avg.y = transform.position.y; // 坐標(biāo)的y軸保持不變

    targetPos = avg; // 更新目標(biāo)點

}

float FindZoomSize(){ // 計算縮放大小

    float size = 0; // 臨時縮放值變量

    Vector3 localTargetPos = transform.InverseTransformPoint (targetPos);// 將目標(biāo)點轉(zhuǎn)換為相對于當(dāng)前transform的本地坐標(biāo)

    for (int i = 0; i < targets.Length; i++) { // 變量所有坦克

        Vector3 tankLocalPos = transform.InverseTransformPoint ( targets [i].position); // 坦克本地坐標(biāo)

        Vector3 distance = targetPos - tankLocalPos; // 和當(dāng)前坦克的距離

        size = Mathf.Max (size, Mathf.Abs (distance.y)); // y軸距離,取大的

        size = Mathf.Max (size, Mathf.Abs (distance.x)  / camera.aspect ) ; // x軸距離/aspect,取大的

    }

    size += screenEdgeBuffer; // 加上屏幕邊緣緩沖值

    size = Mathf.Max (size, minZoom); // 不能小于最小縮放值

    return size;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茉兰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屉符,更是在濱河造成了極大的恐慌拧略,老刑警劉巖裤唠,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽糟,死亡現(xiàn)場離奇詭異蔓榄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诡必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門奢方,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔扁,“玉大人爸舒,你說我怎么就攤上這事「宥祝” “怎么了扭勉?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苛聘。 經(jīng)常有香客問我涂炎,道長,這世上最難降的妖魔是什么设哗? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任唱捣,我火速辦了婚禮,結(jié)果婚禮上网梢,老公的妹妹穿的比我還像新娘震缭。我一直安慰自己,他們只是感情好战虏,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布拣宰。 她就那樣靜靜地躺著党涕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巡社。 梳的紋絲不亂的頭發(fā)上膛堤,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音晌该,去河邊找鬼肥荔。 笑死,一個胖子當(dāng)著我的面吹牛朝群,可吹牛的內(nèi)容都是我干的次企。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼潜圃,長吁一口氣:“原來是場噩夢啊……” “哼缸棵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谭期,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堵第,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隧出,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踏志,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年胀瞪,在試婚紗的時候發(fā)現(xiàn)自己被綠了针余。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡凄诞,死狀恐怖圆雁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帆谍,我是刑警寧澤伪朽,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汛蝙,受9級特大地震影響烈涮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窖剑,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一坚洽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧西土,春花似錦讶舰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橡疼。三九已至,卻和暖如春庐舟,著一層夾襖步出監(jiān)牢的瞬間欣除,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工挪略, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留历帚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓杠娱,卻偏偏與公主長得像挽牢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摊求,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容