分類:Unity、C#、VS2015 html
建立日期:2016-04-11 緩存
攝像機(Camera)是爲玩家捕捉並展現世界的一種設備。場景中至少須要有一臺攝像機,也能夠在一個場景中使用多臺攝像機。這些攝像機能夠設置爲在屏幕的任何位置或只在某些部分按任何順序進行渲染。 函數
要將遊戲呈現給玩家,相機是必不可少的。能夠對相機進行自定義、腳本化或父子化,從而實現能夠想到的任何效果。在拼圖遊戲中,可讓相機 (Camera) 處於靜止狀態,以看到拼圖的全視圖。在第一人稱射擊遊戲中,能夠將相機 (Camera) 父子化至玩家角色,並將其放置在與角色眼睛等高的位置。在競速遊戲中,您可能但願讓相機追隨玩家的車輛。 性能
攝像機類型有兩種: 設計
Perspective:透視相機。相機將用徹底透視的方式來渲染對象。 3d
Orthographic:正交相機。相機將用無透視感的渲染方法均勻渲染對象。 orm
鼠標右擊工程視圖下的Assets,導入Unity自帶的Cameras組件: htm
此時便可在Standard Assets文件夾下看到導入的四種預設(Prefabs):對象
使用這些預設的辦法很簡單,只須要選擇某種預設,將其拖放到場景中,並將相機的目標區域設置爲root。 blog
一、導入的攝像機類型
下面簡單介紹導入的這些相機分類及用途。
(1)FreeLookCameraRig、MultipurposeCameraRig
對於FreeLookCameraRig和MultipurposeCameraRig這兩種攝像機來講,「rig」都被設計爲跟隨的對象老是朝着目標的位置。Camera的偏移量是由高度(Y 軸)的「Pivot」值以及相機的向前偏移值來共同指定的。
l FreeLookCameraRig:這種相機能自動跟隨目標位置(鼠標點到哪,目標就跟隨到哪),另外還能夠經過移動鼠標(或觸摸手勢)旋轉必定的角度。
l MultipurposeCameraRig:這種相機除了能跟隨目標位置外,還能先轉身,而後再移動到你指定的目標位置,在多人遊戲中,該相機很是有用。
這兩種Camera的Y軸Pivot(支點)的典型設置都是 2 (在目標上方 2 米),Z軸Pivot的典型設置都是 -6 (在目標後方 6 米)。
若是你想調整Camera朝向目標的某一側(例如,讓第3人稱的「轉身」,即人或槍在原地轉着圈找目標),此時應該調整X軸的Pivot值。
Camera Rig:朝目標移動。
Pivot:調整高度(Y軸相對於X軸的偏移量)。
Camera:調整距離目標的Z軸位置。
這兩種相機都使用ProtectCameraFromWallClip.cs文件中的腳本,目的是爲了防止相機從場景中的某些項(好比牆或車)中穿越過去。或者說,當它遇到障礙物時,會自動繞着過去而不是直接穿牆而去。
在ProtectCameraFromWallClip腳本中,會不停地檢查數據透視(Pivot)和攝像機(Camera)之間的距離,當Camera將要撞到障礙物時,則嘗試它應該到哪一個位置。因爲這個緣由,若是你使用的是「wall clip」(牆剪輯)腳本,你沒法在運行過程當中修改Camera偏移量,由於該腳本會保護它不被修改。
(2)CctvCamera
這種攝像機是一種不帶層次結構的GameObject對象,換言之,它只會轉身,不會移動。所以,該攝像機不須要牆剪輯腳本。可是,它的目標仍然是tag標記爲「player」的對象。
CctvCamera使用的是LookAtTarget腳本,該腳本還提供了Transform.LookAt()函數以外的基本功能。它相對於目標對象的父對象的局部空間,並受其觀察角度的約束
這種Camera的用途通常是:呈現開動的汽車側窗外的場景、從移動的宇宙飛船瞄準一個目標、將目標做爲炮塔、……等。
CctvCamera能夠放置在任何地方,並且還能夠平移實現的目標。
(3)HandholdCamera
手持式攝像機。
二、如何使用攝像機組件
將某個攝像機預設拖放到場景中並將攝像機的目標區域設置爲root之後,默認狀況下,它就會自動瞄準標記爲「Player」的第一個對象。換言之,你只須要將目標的tag標記設置爲「Player」就好了。
當你將某個攝像機拖放到場景中之後,建立新場景時自動添加的「Main Camera」已經沒用了,可直接刪除它。
Camera是最重要的組件,場景中觀察的目標都是靠一臺或多臺Camera來控制的。因此,必須瞭解Camera的各類屬性及含義,不然你什麼可能什麼都看不見。
一、Clear Flags
清除標記。肯定要清除屏幕的哪些部分。該屬性在使用多臺Camera繪製不一樣遊戲元素時很方便。可選項有:
(1)skybox
天空盒。這是默認設置。屏幕上全部空白部分都將顯示當前相機 (Camera) 的天空盒。若是當前相機 (Camera) 沒有設置天空盒,則會默認爲渲染設置 (編輯 (Edit) -> 渲染設置 (Render Settings))) 中所選的天空盒。
(2)Solid Color
純色。選擇該模式,屏幕上的空白部分將顯示當前攝像機的Background(背景)色。
(3)Depth Only
僅深度。該模式用於遊戲對象不但願被裁剪的狀況。
若是要繪製玩家的槍而又不讓其在環境中被裁剪掉,能夠將深度 (Depth)爲 0 的相機 (Camera) 設置用於繪製環境,而另外一個深度 (Depth)爲 1 的相機用於單獨繪製武器清除標記 (Clear Flags) 並設置爲僅深度模式 (depth only)。這將使得環境圖像一直顯示在屏幕上,但會丟掉每一個對象在三維空間中的位置的全部信息。槍繪製完後,不透明部分將徹底覆蓋全部已繪製部分,不管槍與牆的距離有多近。
(4)Don't clear
不清除。該模式既不清除顏色,也不清除深度緩存。其結果是,每幀繪製在下一幀之上,造成拖影效果。在遊戲中通常與自定義着色器(shader)一同使用。
二、Background
背景。將視線內的全部元素都繪製好且無天空盒以後應用於剩餘屏幕的顏色。或者說,在鏡頭中的全部元素渲染完成但沒有指定skybox(天空盒)的狀況下,將沒置的顏色應用到屏幕的空白處。
三、Culling Mask
剔除遮蔽圖,也叫剔除遮罩。即:添加或刪除Camera渲染的對象層。
說明:在檢視器 (Inspector) 中爲對象分配層。一般較好的作法是,將用戶界面 (User Interface) 放在不一樣的層上,而後使其自我渲染,同時用獨立的相機 (Camera) 渲染用戶界面層。
(1)光斑層。將光斑層 (Flare Layer) 組件附加到相機 (Cameras) 上,可以使圖像出現鏡頭光斑 (Lens Flares) 效果。默認狀況下,相機已經附加光斑層 (Flare Layer)。
(2)GUI層。將GUI 層 (GUI Layer) 組件鏈接至相機,能夠啓用二維 GUI 渲染。GUI 層鏈接至相機後,將渲染場景中的全部 GUI紋理 (GUI Texture) 和 GUI文本 (GUI Text) 。GUI層不會以任何方式影響 UnityGUI 。 經過點擊檢視器 (Inspector)中 GUI 層 (GUI Layer) 的複選框可啓用或禁用渲染單個相機中的GUI。
另外,爲了使 UI 在其餘相機 (Camera) 視圖上方顯示,還須要將清除標記 (Clear Flags) 設置爲深度模式 (Depth only) ,並確保 UI 相機 (Camera) 的深度 (Depth) 高於其餘相機 (Camera)的深度。
四、Projection
投影方式。切換相機的模擬透視功能。選項有:
Perspective:透視。相機將用徹底透視的方式來渲染對象。
Orthographic:正交。相機將用無透視感的渲染方法均勻渲染對象。
將相機 (Camera) 設置爲正交 (Orthographic) 會去掉相機視圖中的全部透視效果。這在製做等距或二維遊戲時很是有用。
注意:霧是使用正交相機模式均勻渲染的,所以可能得不到期待的效果。
五、Size
大小。選擇「正交」(Orthographic) 時,設置相機視口的大小。
六、Field of View
視野。選擇「透視」(Perspective) 時,Camera視角的寬度,沿局部座標的 Y 軸進行測量(以度爲單位)。
該項僅用於透視模式,用於控制攝像機的視角寬度,以及縱向的角度尺寸。
七、Clipping Planes
裁剪平面。相機開始渲染和中止渲染的距離。選項有:
Near:近點。即將繪製時距離相機最近的點。
Far:遠點。即將繪製時距離相機最遠的點。
裁剪平面還決定了如何在場景上分佈深度緩存的精度。通常而言,爲了獲得更高的精度,應該將近平面 (Near plane) 移得儘量遠。
注意:近、遠裁剪平面和相機視野肯定的平面一塊兒構成的區域就是俗稱的相機平截頭體 (frustum)。Unity 會確保在渲染對象時徹底在這個平截頭體以外的對象不會顯示出來。這稱之爲平截頭體剔除 (Frustum Culling)。不管遊戲中是否使用了遮擋剔除 (Occlusion Culling),都會出現平截頭體剔除 (Frustum Culling)。
出於性能緣由,在有些狀況下你可能須要儘早剔除小對象(例如,與大型建築相比,讓小石塊和碎片在短得多的距離內不可見)。要作到這一點,還須要將小對象放在隔離層中並用 Camera.LayerCullDistances 腳本函數設置每一層的剔除距離。
八、Normalized View Port Rect
規範化視口矩形,或者叫標準視圖矩形。用四個數值來控制該攝像機的視圖將繪製在屏幕的位置以及大小,該項使用屏幕座標系(Screen Coordinates),數值在0~1之間。這四個值分別是:
X:繪製相機視圖的水平起始位置。
Y:繪製相機視圖的垂直起始位置。
W:寬度。相機輸出到屏幕上的寬度。
H:高度。相機輸出到屏幕上的高度。
規範化視口矩形 (Normalized Viewport Rectangles) 專門用於定義當前相機視圖繪製在屏幕上的哪一部分。您能夠在屏幕右下角放置地圖視圖,或者在左上角放置彈頭視圖。只需一點設計,您就能夠利用 視口矩形 (Viewport Rectangle) 建立一些獨特的行爲。
使用規範化視口矩形 (Normalized Viewport Rectangle)可輕鬆建立雙人分屏效果。建立兩個相機後,將兩個相機的 H 值都改爲 0.5,而後將玩家甲的 Y 值設爲 0.5,玩家乙的 Y 值設爲 0。這樣,玩家甲的相機將從屏幕中間向上顯示,而玩家乙的相機將從底部開始並在屏幕中間中止。
下圖是使用規範化視口矩形 (Normalized Viewport Rectangle) 建立的雙人顯示效果:
九、Depth
深度。相機在繪圖順序中的位置。擁有較大值的相機將會繪製在擁有較小值的相機之上。
十、Rendering Path
渲染路徑。定義相機使用什麼渲染方法。你應該根據遊戲內容和目標平臺/硬件進行選擇,不一樣的渲染路徑有不一樣的功能和性能特色,這些功能和性能特色主要影響燈光 (Lights) 和陰影 (Shadows)。
(1)Use Player Settings
使用玩家設置中選擇項目使用的渲染路徑。或者說,該相機將使用玩家設置 (Player Settings) 中設定的任意一個渲染路徑 (Rendering Path)。
(2)Vertex Lit
頂點光照。該相機渲染的全部對象都將做爲頂點光照 (Vertex-Lit) 的對象來渲染。
(3)Forward
正向渲染。全部對象都將按每種材質一個通道的方式進行渲染。
(4)Deferred Lighting
延時光照(僅限Unity專業版)。全部對象都將無照明繪製一次,用屏幕空間大小的Buffer保存幾何體的深度、法線以及高光強度,生成的Buffer將用於計算光照,同時生成一張新的光照信息Buffer;最後全部的遊戲對象會被再次渲染,渲染時還會自動疊加光照信息Buffer的內容。
十一、Target Texture
渲染的目標紋理(僅限 Unity 專業版)。該項用於將攝像機視圖輸出並渲染到屏幕。一股用於製做導航圖或者畫中畫等效果。
該功能還能夠將相機視圖放在能夠應用於另外一個對象的紋理上。這使得建立體育場大屏幕、監控攝像機和倒影等變得簡單。
下圖是用於建立直播現場相機的渲染紋理 (Render Texture):
十二、HDR
高動態光照渲染範圍(High Dynamic Range)。該項用於啓用攝像機的高動態範圍渲染功能。由於人眼對低範圍的光照強度更爲敏感,因此使用高動態範圍渲染可以讓場景更爲真實,光照的變化不會顯得太突兀。