日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详解Unity中的摄像机及实例应用

發(fā)布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解Unity中的摄像机及实例应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Unity中,通過攝像機來呈現給玩家精彩紛呈的游戲世界。開發(fā)者可以通過攝像機來固定玩家的游玩視角,渲染出特定畫面來呈現給玩家。本文介紹了Camera組件的相關參數以及如何使用攝像機的一些應用實例和誤區(qū)。

目錄

    • 前言
    • 一、攝像機組件及參數介紹
      • 1.ClearFlags: 清除標記(背景)
      • 2.Culling Mask: 選擇渲染層
      • 3.Projection: 投影方式 (透視(默認)和 正交)
      • 4.Clipping Planes: 裁剪平面
      • 5.Viewport Rect: 視圖矩形(攝像機位置寬高)
      • 6.Depth: 深度(攝像機渲染次序)
      • 7.Occlusion Culling:遮擋剔除的開關
      • 8.其余屬性,暫時用不到,就不贅述了
    • 二、攝像機的實例應用
      • 1.控制攝像機場景漫游
    • 三、總結和參考資料
      • 1.總結
      • 2.參考資料

前排提醒:本文僅代表個人觀點,以供交流學習,若有不同意見請評論留言,筆者一定好好學習,天天向上。
閱讀此文章時,若有不理解的地方,推薦觀看本文列出的參考資料來對照閱讀。

Unity版本[2019.4.10f1] 夢小天幼 & 禁止轉載 2022.4.3

視頻講解:
詳解Unity的攝像機_BiLiBiLi


一、攝像機組件及參數介紹

當你創(chuàng)建一個場景,Unity會自動創(chuàng)建一個Main Camera,若你刪除它,那么你的世界會一片漆黑。我們可以在Hierarchy窗口右鍵,創(chuàng)建一個Camera,這時你會發(fā)現,你的世界又恢復了一片光明。

當我們新建了Camera,這時你會發(fā)現,它掛載了三個組件,分別是Transform、Camera和Audio Listener,其中Transform是每個游戲對象都擁有的,Camera和Audio Listener則是此攝像機的耳朵和眼睛。下面我們來詳細介紹關于Camera組件的相關參數。

新建一個Camera,自動添加這三個組件。

1.ClearFlags: 清除標記(背景)

攝像機渲染視圖時,會緩存顏色和深度信息,繪制出來的圖像中那部分沒有被繪制到的部分是空白,默認會顯示天空盒的顏色。

  • Sky Box:使用天空盒填充空白部分,默認使用渲染設置[Window-Rendering-Lighting Settings]中的天空盒,若渲染設置也沒有設置天空盒,則會使用背景顏色。

  • Solid Color:使用攝像機背景色填充空白部分
  • Depth Only:不填充

這個也很容易理解,除去繪制之外的部分用默認黑色填充,若此時有其他相機(Depth比當前低),則填充其他相機畫面。

  • Don’t Clear: 不清除顏色和深度緩存。(這里用處不多,不解釋了,反正我也沒搞懂)

Background: 背景顏色(當ClearFlags選擇Solid Color時,此選項生效)

2.Culling Mask: 選擇渲染層

通過選擇層來渲染指定層的對象,Unity中每個對象都被分配了一個層,默認為“Default”層

我將圓柱和正方體放到了層“Camera Culling Mask”,通過演示讀者應該能明白此參數作
通過Camera.cullingMask來在代碼中修改此值,Int類型,默認值為0

3.Projection: 投影方式 (透視(默認)和 正交)

  • FOV Axis:視野軸
    Vertical:垂直軸,設為該項后,調整FieldOfView會改變相機上下開合角度
    Horizontal:水平軸,設為該項后,調整FieldOfView會改變相機左右開合角度
  • Field Of View: 視角范圍(相機的視野拉伸),視角越大,視野越大,同時焦距越短

代碼中可以通過Camera.fieldOfView類變量來修改此值,單位為度,當相機為正交模式時,此參數被忽略

  • Physical Camera: 以后再說,筆者還沒搞明白
  • Size(正交模式選項):相機視口大小,屏幕豎直方向上相機所繪制出來的區(qū)域的一半。

4.Clipping Planes: 裁剪平面

顧名思義,Near和Far指定了其裁剪的區(qū)域范圍,若不處于這個范圍的不被渲染,可以節(jié)省計算量,設置多少合適,看需求。

代碼中可通過Camera.farClipPlane 和 Camera.nearClipPlane類變量來修改此值

5.Viewport Rect: 視圖矩形(攝像機位置寬高)

這里提供了四個數值,其中X和Y代表攝像機原點,一般不改動。
W和H則代表了攝像機的寬高,默認1則是占滿全屏,這里使用了屏幕坐標系來計算,不理解的讀者可以去我專欄里查看關于Unity中坐標系的講解(預計22.4.10會寫出來),

可以通過修改W和H來使兩個攝像機視圖疊加起來的效果。具體如何應用,下面再說

這里我設置了兩個攝像機,其中主要的攝像機先被渲染,然后左下角的攝像機后被渲染,且設置了這個攝像機的ClearFlags為Depth Only,這樣不會渲染多余部分,就實現了上圖所示效果。

6.Depth: 深度(攝像機渲染次序)

用于控制攝像機渲染次序,一般數值較小的會先渲染,數值較大的則會疊加到上一個攝像機上,上一個例子就用到了,其中左下角的攝像機次序為:0,主背景攝像機次序為:-1,所以能保證主背景攝像機先被渲染,然后再被左下角的攝像機疊加。

通過Camera.depth類變量來在代碼中修改此值

7.Occlusion Culling:遮擋剔除的開關

這個選項勾選有助于提升游戲性能,比如不在攝像機范圍內的物體,將不會被渲染出來

需要注意的是,場景中的物體需要預計算,且是靜態(tài)物體,勾選時Unity才能快速實時判斷物體是否在攝像機范圍內。

8.其余屬性,暫時用不到,就不贅述了

其實就是我沒搞明白,等我搞明白再添加上來


二、攝像機的實例應用

通過上述參數,讀者應該基本了解了Unity中的攝像機,下面通過幾個簡單的小案例來鞏固一下吧。

1.控制攝像機場景漫游

需求:通過WASD來前后左右移動攝像機,通過QE可以抬升下降,按住Shift可以加速。
通過鼠標滾輪可以縮放視圖,鼠標按下鼠標右鍵并移動,可以旋轉攝像機

演示動態(tài)圖如下:

整部分代碼其實并沒有應用上太多攝像機相關的參數,例子比較簡單。但是代碼寫的又臭又長,供新手參考一下,沒啥質量。且這段代碼是有Bug,旋轉沒有鎖定Z軸,這會導致鏡頭莫名其妙就圍著中心打轉。
高情商:請大家找出Bug并修復
低情商:我懶得寫了

public Camera camera_;// 攝像機移動速度和旋轉靈敏度public float mouseSenstivity = 100;public float speed = 5;void Update(){//鍵盤控制攝像機移動Move_Update();//鼠標滾輪控制場景縮放MousewheelZoom_Update();//鼠標右鍵控制場景旋轉MousergihtRot_Update();}private void Move_Update(){if (Input.GetKey(KeyCode.W)){camera_.transform.Translate(Vector3.forward * Time.deltaTime * speed);}if (Input.GetKey(KeyCode.S)){camera_.transform.Translate(Vector3.back * Time.deltaTime * speed);}if (Input.GetKey(KeyCode.A)){camera_.transform.Translate(Vector3.left * Time.deltaTime * speed);}if (Input.GetKey(KeyCode.D)){camera_.transform.Translate(Vector3.right * Time.deltaTime * speed);}if (Input.GetKey(KeyCode.Q)){camera_.transform.Translate(Vector3.up * Time.deltaTime * speed);}if (Input.GetKey(KeyCode.E)){camera_.transform.Translate(Vector3.down * Time.deltaTime * speed);}}private void MousewheelZoom_Update(){if (Input.GetAxis("Mouse ScrollWheel") < 0){camera_.fieldOfView += 2;}if (Input.GetAxis("Mouse ScrollWheel") > 0){camera_.fieldOfView -= 2;}}private void MousergihtRot_Update(){if (Input.GetMouseButton(1)){// X軸控制上下旋轉,Y軸控制左右旋轉float mouseX = Input.GetAxis("Mouse X") * Time.deltaTime * mouseSenstivity;float mouseY = Input.GetAxis("Mouse Y") * Time.deltaTime * mouseSenstivity;// 注意這里因為X軸是控制上下的,Y軸是控制左右的// 而mouseX返回的是屏幕的左右值,所有他倆調換了一下// 又因為mouseY向下為負值,而攝像機Y軸向下則為正值,則對mouseY進行了一個取反。// 這里要是理解不了,推薦看參考資料的第一篇博文,總結了Unity相關的移動控制方法。camera_.transform.Rotate(new Vector3((0f - mouseY), mouseX, 0));}}

三、總結和參考資料

1.總結

沒啥可總結的,主要把攝像機的幾個參數的作用記住就行。

2.參考資料

[1].夢天幼.詳解Unity的移動控制實現
[2].夢天幼.詳解Unity的幾種移動方式實現
[3].雪庭.unity中camera攝像頭控制詳解
[4].靈寶兒.Unity Physical Camera中Focal Length和Field of View關系
[5].syddf_shadow.天空盒(SkyBox)的實現原理與細節(jié)
[6].游戲蠻牛.[蠻牛教程] Unity3D 淺析-Camera(攝像機)
[7].邢小鵬.unity攝影機depth模式_Unity3d攝像機詳解

總結

以上是生活随笔為你收集整理的详解Unity中的摄像机及实例应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。