【Unity Particle System】遊戲特效教學 – 素材整理
L01 circle L02 cut impact L03 L05 c word wordColor L06
L01 circle L02 cut impact L03 L05 c word wordColor L06
製作第一人稱遊戲時,如果使用的是現成的角色及動畫,可能會需要把手部獨立出來顯示,某些情況下不要顯示角色的其他部分,以免遮到鏡頭之類的問題。但是一個模型,要只顯示部分就必須用到材質、繪製貼圖(手部不透明、其他透明),但前提是你要知道這個模型的UV,不然也無從畫起。 今天就來分享我們的處理方法-直接把手部模型拆開。因為手上剛好沒有FPS遊戲用的角色,就先拿其他角色代替了。在Blender中,可以看到模型是骨架的子物件,也就是說,就算拆成多個模型,還是能受骨架影響(權重不會跑掉)。 這是原本的動畫: 現在選取手部,按P分離物件,將手部模型獨立成一個Mesh。 現在播放動畫,手部還是能順利動作~就算隱藏手或身體都不會影響。
整理模型 Apply Modifler,因為Unity沒有修改器,所以必須先全部套用、轉成普通的模型。檢查法向,打開Viewport Overlays下拉式選單,勾選Face Orientation,藍色的是正面,紅色是反面(這點很重要,因為blender是雙面渲染,從背面還是能看到模型,但Unity是單面)。 整理的方法是:選擇要轉向的面 -> Shift+N。 整理Transform 1.將每個物件都Apply Transform,讓旋轉量歸零、尺寸歸一。 也就是說,以當前尺寸作為Unity中scale的「1」。 (在這裡可以查看) 2.將每個物件都Set Origin to Geometry,將軸心移到物件的中心點(如果有特殊需求就Set Origin to 3D Cursor將軸心移到想要的位置)。 整理Texture 如果預設是用路徑載入貼圖,而非直接匯入圖檔,要特別將貼圖打包到一個資料夾,這樣才能在Unity中調整材質。 點選File→External Data→Unpack All Into Files,Blender就會自動建立一個textures資料夾存放所有貼圖。 匯出設定 1.將fbx匯入Unity後會發現所有物件全都變成一個同檔案名稱的空物件的子物件,簡單來說,並不會記錄Outliner中的分層,要讓他能保持階級關係,匯出時要將Batch…
今天來學習如何在Unity中做出透視效果。 當然透視效果有許多做法,今天用的是最容易理解、步驟也相對較少的方法-Renderer Feature。 簡介 大致流程就是「當目標物件被其他物件遮住時,直接渲染出來並指定新的材質;沒被遮住時也渲染一次,使用原本材質」。 目標是讓這個Sphere能一直被看到,就算被牆擋住還是能渲染出來。 Renderer Feature 先了解一下什麼是Renderer Feature,它的功能在Unity官方網站中是這樣解釋的:在URP的Renderer上加上額外的渲染途徑。 能讓使用者自由設定渲染的對象、順序、材質……等,也就是說,可以指定「在渲染整個畫面之後,再將特定物件渲染一次特定材質」之類的指令。說得白話點,就是用來覆寫渲染的結果。 以下簡單介紹一下Renderer Feature中幾個重要的部分。 Event 這裡可以選擇渲染的順序,選單中的順序就是URP的Render Pass。 Filters 可以選擇目標渲染物件,Queue選擇是否為透明、Layer Mask指定對象Layer。 Overrides 選擇完渲染的時間點跟目標後,再來就是要對其進行的動作了。 Material:用來覆寫的材質。 Depth:決定如何影響深度緩衝區(Z-Write)。 Write Depth:決定是否更新深度緩衝區。 Depth Test:深度測試,畫面從離攝影機最遠處往攝影機移動,用碰到的先後順序來決定物件的前後。 Camera:覆寫攝影機的某些屬性。 實作 製作材質…
卡通材質其中一種常見作法就是使用Unlit材質,讓物件本身不受Unity的光影運算影響,然後用Code獲取光源向量及顏色,利用這些數值重新上色,算出自己想要的漸層、高光、陰影......等。 上色 暗面 首先先從變數的宣告開始,分別控制一個光源的向量及顏色,Reference要記得命名,這樣之後才能用Code取得這個變數。 再來將光源跟normal做內積後就能看到模型會有明暗了。(用形狀較不規則、凹凸起伏較多的模型來做效果會較好) 至於為什麼要這麼做,可以回想一下內積的公式,當兩向量垂直則內積0。也就是說,表面平行於光源方向(normal&lightDir垂直),就會是黑色的(數值0);光源垂直表面入射(原則上要將光源向量Normalize,也就是變成單位向量),則呈現白色(數值1)。 這段十分重要,製作卡通材質的第一步就是做出光影明暗。 當然還有一些問題,例如剛剛得出的陰影向量跟實際要的效果差了-1倍(不要從數值想,從空間座標系想就能明白了)。 再來是做出塊狀暗面,卡通材質的一大重點就是顏色不是漸層、而是塊狀的。 做出這個的效果的方法有很多,我看過將光影向量取底整數(Floor)變成像黑白色票那樣、使用Smoothstep節點讓漸層不是線性的......等,而今天用的是UV。 先用Smaple Texture 2D匯入一張圖,將剛剛的結果輸入UV的X、lightColor的alpha值作為Y。 大致的邏輯是,先用貼圖畫出暗面(黑色部分),再用Normal跟lightDir改變暗面位置,光源的alpha控制暗面範圍。 貼圖&顏色 再來是顏色的部分,首先要能受到光源顏色的影響,那自然直接跟lightColor相乘就好。 之後還有貼圖跟底色也是直接相乘。 跟Ambiment的Color相加,可以看到物件會受環境光照影響,暗面部分會有些漸層。 高光 接著是高光,高光的邏輯跟一開始做的暗面很像,唯二的差別就是範圍跟視角。 高光的範圍很小,有時甚至只有一個點;至於視角,物體的高光會根據視角改變,這直接拿個會反光的物體旋轉移動一下就能了解。 (接到Preview節點查看效果。) 這裡最重要的是Normalize,因為黑白在Unity中對應0~1,要做出黑白漸層只需要0~1的變化就好。 而Normalize就是用來將一個向量化為單位向量,這樣dot後的結果才會介於0到1之間。 剛剛已經做出了黑白漸層,白色部分是高光,那麼要控制高光範圍,只要將剛才的結果接到Power節點就好。(接到Preview節點查看效果。) Power節點就是次方的意思,輸入A、B,輸出A的B次。0~1的數值經過次方運算後會越來越小,也就是說,B越大則高光範圍越小。 (Step則是將Edge以下的質變為0、以上變為1,用來把漸層變成色塊。) 合併 將剛剛的高光跟暗面接入Maximum就能看到初步的卡通材質效果了。 至於為什麼不是用相乘而是Maximum,因為我們要的結果是高光疊在一開始的明暗效果上,如果相乘,那高光以外的部份全部都會乘上黑色,變成黑的。…
Reflection Probe是Unity中時常使用、十分重要的工具,但它的功能卻常常被誤會,在剛接觸到Reflection Probe時,我對它的理解是「在其範圍內的物件,可以反射周遭靜態物件」,甚至自作聰明的把它掛在角色下成為子物件,跟著角色移動...這樣的解釋其實並非全錯,只是差在反射的原理不構清楚。Unity中的反射並非物理意義上的反射,簡單的說,是將環境變成貼圖,貼在物件上,一般來說,這個環境貼圖就是Skybox。如果將這個環境貼圖稱作反射球,Reflection Probe的功用是改變反射球。 在Unity,所有物件都會無條件的反射Environment Reflections中的Source,也就是說即使是在室內中的物體依然會反射Skybox,這樣會很不自然。 因此,在室內、或不該被天空照射到的地方,要使用Reflection Probe將反射球改變。 先用Cube搭出簡單的室內場景,可以看到中間的Sphere雖然有變暗,但依然反射Skybox。 加了Reflection Probe後,物件就會反射Reflection Probe範圍內的靜態物件。 至於反射的方法,可以想成是將方形範圍的六個面,變形壓縮成一個球型,並貼在物件表面。(如果對詳細原理有興趣,可以搜尋Cubemap,Skybox本身也有用到差不多的原理。) 當物件一進入Reflection Probe,反射球就會立刻被改變,因此Reflection Probe的範圍十分重要,如果範圍太大,物件還沒完全進到室內就會先碰到,換成室內的反射球。 因此可以多複製幾個,讓反射球從室外到室內是漸變的。 補充一下物件同時碰到多個Reflection Probe時,該如何處理。 物件的Mesh Renderer中有4個選項可以選。 Off:不受Reflection Probe影響。Blend Probes:混合,但不包含Skybox,一般用於室內。Blend Probes And Skybox:混合,包含Skybox,一般用於室外。Simple:只使用權種最高的一個Reflection Probe。 Blend Probes…
Light Probe Group 的功能:吸收周圍靜態物件的光線給動態物件。 在Unity中,只有靜態物件會受到材質球的Emission影響(要先Bake過)。 但有時也希望角色等動態物件也能受到影響,Light Probe Group 就能用來達成。 (為了看得更清楚,這裡先關掉Directional Light。) 加了Light Probe Group 後動態物件上也會有光了。 Light Probe Group會吸取八個點所圍成區域的光,並「照射」在動態物件上。 可以看到,每個動態物件都會吸取最近的三個點的光源。 也就是說,不管離得多遠、甚至中間有其他障礙物,都還是會照射得到。 因此,要讓畫面「正常」,必須多複製幾個Light Probe,這樣每個動態物件就只會吸取周遭最近三個點的顏色。 但Light Probe Group並不會判斷物件是否被遮住、是否應該被照射…等,只會無差別的吸取鄰近Light Probe的光,要確實達成合理的光照,必須多複製幾個點,讓Light Probe的採光更精緻,「模擬」出合理的光照。 總結Light Probe Group的重點:…
最近看了一些網路文章、影片教學,發現Unity的初始場景其實包含了許多渲染相關設定,把這些設定一一拿掉後,就能看到場景最原始的樣子(只有模型、光影、材質...等基本資訊)。 這是開一個新3D專案、建立一個Plane、一個Sphere,並指定了純色的標準材質球後的場景,並未進行任何渲染設定。 1.Color Space Color Space可以想成是電壓及亮度的曲線,Linear是符合物理原則的線性關係,較接近現實世界;預設的Gamma則是顯示器上的曲線(非正比,亮度為電壓的2.2次方),較接近人眼所看到的顏色。 在Unity中,Linear是經過校正,讓顏色符合物理、接近現實,計算量較大、較吃資源;Gamma則不會做校正處理,由於2.2次方的關係,整體環境會偏暗(黑色為0、白色為1,因此亮度在暗處增加較緩)。 Gamma Linear Reflection Lighting中的Environment Reflections是指物體反光時反射的顏色,也就是周遭的環境,可以想像成把環境「貼」在物件上。 將Source設為Custom並不指定任何Cubemap,就會看到物體還有反光,但會變成純色的明暗漸層。 (這裡有刻意將材質的Smoothness調高,讓反光更明顯。 Before(Skybox) After(Custom) Environment Lighting Environment Lighting顧名思義就是環境光,先前的場景都在Skybox的「照射」下,可以看到影子也有分明暗,就跟現實世界一樣。 將Lighting中的Environment Lighting的Source改成Color,這樣這個場景就不再受Skybox的「照射」了,陰影自然就只有一種顏色。 將Ambient Color改成純黑,陰影就會變成完全沒有漸層的全黑了。 這裡改回預設材質球會看得更清楚(黃黃的是因為預設Directional Light的顏色)。 Skybox 將環境光跟反射的Skybox都改掉後,現在Skybox就只是一個背景了,不會對物件的顏色有任何影響。 直接在Lighting中將Skybox設為none,場景除了背景消失外沒有其他變化。 Other…
最近在學習Unity的渲染,想要更了解整個畫面渲染的流程與機制,並整理成了筆記。主要是關於Frame Debugger這個工具的運用及Unity的畫面渲染的步驟。 Frame Debugger Frame Debugger能一步一步呈現渲染的過程,是用來檢查渲染過程的工具,當畫面結果不如預期時,用Frame Debugger來檢查非常方便。 路徑在Window->Analysis下。 開啟視窗後,要點擊Enable才能作用。 接下來,在Game視窗中就能看到變化了。拖動FrameDebugger視窗上方的拉桿,就能看到渲染的過程了(步驟數量一場景物件&設定而異)。 第一步:清空Buffer GPU中會有兩個跟顯示視窗尺寸相同的空間,稱為Buffer,負責呈現我們螢幕所看到的畫面。 兩個Buffer快速輪流切換,一個負責接收CPU傳入的資料,一個負責呈現畫面,讓畫面實時更新,不會卡頓。而切換一次的過程,就是所謂的一幀。 所以每幀都要把畫面清空,畫上下下幀的畫面(下一幀由另一個Buffer呈現)。 可以看到視窗是全黑的。 第二步:深度圖 再來會由頂點資訊畫出深度圖。 可以看到深度是整個畫面最先渲染出來的部分(Event下方有詳細的項目可以查看,這裡最重要的就是Shadow Depth)。 離攝影機越遠、就會越黑;反之則越白。由此初步構出場景。 第三步:Shadow Map 再來會由攝影機與場景內的光源來畫出Shadow Map。 Shadow Map是一張2D的Texture,用來記錄頂點受光的程度(0~1)。從光源出發,越先碰到的點越白、越晚碰到越黑,由此判斷頂點是否處在陰影中。 (這裡畫面可能會是全黑的,要移動一下攝影機或光源看看。) 補充一下,Project Setting中的Shadow Distance會影響這一步渲染的畫面(調高會渲染得較遠)。…