1. 程式人生 > >關於Unity中的模型描邊與Shader切換(專題二)

關於Unity中的模型描邊與Shader切換(專題二)

ret 常駐內存 unity pri 我們 判斷 解決 start 重要

模型描邊

1: LOL裏面的模型描邊效果,點擊防禦塔會有描邊的效果,被攻擊的時候模型也要描邊凸顯一下
2: 網上可以找到模型描邊的Shader,可以直接下載使用,一組第三方的Shader, 幫我們解決了模型描邊的問題,叫Toony(第65)

Shader切換

1.被攻擊的時候模型描邊凸顯一下,不被攻擊的時候就描邊隱藏,變成正常模型的樣子

2.需要一個帶模型描邊的Shader和一個不帶模型描邊的Shader

代碼裏面切換Shader

材質是Shader的使用者,模型貼材質,材質決定了是用哪種Shader來進行繪制和渲染,所以切換Shader就是要先關聯材質到Public

1: 關聯要切換Shader的材質
2: 代碼加載對應的Shader: Shader.Find(“Shader的名字”);,不是Shader的路徑,這個名字可以打開對應的Shader在第一行就是
3: 切換材質對應的Shader; Matrix.shader = Shader
4: 將最常用的Shader, 放到Unity的Always Include裏 --> 優化檢查
5: Edit--> ProjectSetting --> Graphics --> Always-included Shaders

技術分享
  讓這些Shader很重要,在開始的時候加載,常駐內存;

Shader切換實例

1.創建Unity項目和文件目錄,保存場景

2.創建一個Shaders文件夾,把下載的Toony文件夾(第65)復制進去,Toony裏面有4個shader。在Resources文件夾下面創建一個People文件夾,把人物模型文件復制進去(People.FBX和People.png)(第65)

3.點擊People模型,Rig---->Animation Type設置為Legacy舊版動畫模式---->Apply

4.進入Resources/Material,關聯好材質球的紋理貼圖,點擊模型Animations---->Wrap Mode---->Loop---->Apply設置動畫循環播放

5.把People拖進場景,設置它的材質的Shader---->Toon---->Basic,顏色設置為255,255,255,255,這是正常狀態

 技術分享

 設置它的材質的Shader---->Toon---->Basic Outline,Outline Color描邊顏色設置為紅色,這是有描邊的狀態,Outline width可以設置描邊粗細

 技術分享

6.創建一個腳本Actor.cs掛載在People模型下來切換shader

 打開Actor.cs

using System.Collections;
using System.Collections.Generic;
using
UnityEngine; public class Actor : MonoBehaviour { public Material mat;//關聯模型的材質,才能對它的Shader進行切換 //定義兩個靜態變量來保存Shader static Shader normal=null;//正常狀態的shader static Shader outline=null;//描邊狀態的shader private bool is_normal = false;//判斷當前是否處於正常狀態 Shader get_normal() { if (normal)//當它第一次為空的時候,我們就創建一個,後面不為空就直接使用,但是這樣優化還不夠 { return normal; } //之所以用靜態變量,是因為在查找Shader的時候,也會編譯shader包括生成GLprogam,生成一個程序放進去,是有開銷的 //如果Shader沒有人使用了,或者找到了Shader不使用,也會被遊戲引擎卸載掉,如果設置為常駐內存就不會 normal = Shader.Find("Toon/Basic"); return normal; } Shader get_outline() { if (outline) { return outline; } outline = Shader.Find("Toon/Basic Outline"); return outline; } // Use this for initialization void Start () { this.mat.shader = this.get_normal(); is_normal = true; //調用的函數,3秒後開始調用,每1秒調用1次 this.InvokeRepeating("change_shader",3.0f,1.0f); } //切換shader void change_shader() { if (this.is_normal) { //切換到描邊狀態 this.mat.shader = this.get_outline(); is_normal = false; } else { //切換到正常狀態 this.mat.shader = this.get_normal(); is_normal = true; } } // Update is called once per frame void Update () { } }

7.運行,發現3秒後開始切換,每隔1秒切換一次,但是其實還沒有做完,還可以優化

//在運行的時候,去加載Shader,會消耗CPU,解決方法就是預先把Shader加載好
//Unity有一個機制,就是常用的Shader設置告訴它,它會幫你把這個Shader常駐內存
//常用的Shader,在遊戲啟動的時候預先加載好,就算Shader沒有用了,也會常住內存

//啟動的時候和運行的時候是不同的階段

Edit---->ProjectSetting---->Graphics---->Always-included Shaders---->增加Size,關聯新的Shader

技術分享

8.現在才算完成

關於Unity中的模型描邊與Shader切換(專題二)