在一些經典的游戲中,需要玩家在一個3D場景中選取場景中的物體。例如《仙劍奇俠傳》,選擇要攻擊的敵人時、為我方角色增加血量、為我方角色添加狀態,通常我們使用鼠標來選擇一個目標物體,當鼠標移動到目標物體上時,目標物體將顯示輪廓線,此時就表示當前物體被選中,我們可以在此基礎上為游戲物體進行一系列的操作。那么,這一功能是如何在Unity3D中實現呢?
首先我們可以將問題分解為兩個子問題:第一,如何確定物體是否被選中;第二,物體被選中后如何清晰地傳達給用戶。
如圖是古劍奇譚和仙劍奇俠傳的戰斗畫面:
接下來,我們分別來解決這兩個問題。對于第一個問題,我們可以采取射線檢測的方法,即從攝像機向鼠標所在的位置發射射線,如果該射線擊中了游戲場景中的物體,我們就認為該物體被選中了。對于第二個問題,我們需要讓物體的輪廓線顯示出來,這是我們今天著重要研究的地方。在Unity3D中我們可以通過Shader 即著色器來實現更改材質的渲染方法。Unity3D內置了6類著色器,從簡單的VertexLit到復雜的帶有高光的視差凹凸貼圖(Parallax Bumped with Specular),共30個。其中:
1、Normal:適用于不透明的物體
2、Transparent:適用于半透明的物體,透明度由貼圖的alpha通道決定
3、TransparentCutOut:適用于某些部分透明,某些部分不透明的物體
4、Self-Illuminated:適用于需要自發光的物體
5、Reflective:適用于需要反射環境光的物體
6、Lightmapped:適用于需要添加光照貼圖及相應的UV坐標數值
從一般的意義上來說,著色器定義了渲染物體的方法、材質中指定的貼圖、用于渲染的頂點及片段著色程序、材質中調整的顏色以及各種數值設定。而相對應地,材質決定我們將使用那些貼圖來渲染、使用哪些顏色渲染等。在今天的文章中,我們將定義下面的著色器代碼:
?對于著色器程序的編寫,我們此時可以先放在一邊,這里我們著重來學習如何使用著色器來實現不同的渲染效果。我們新建一個材質,將該材質的著色器設置為我們這里編寫的著色器,如圖:
注意到這里的物體時沒有輪廓線的,因為我們這里使用的是默認材質Default-Diffuse。那么,接下來,我們通過編程的方式來動態更換材質,這樣就可以實現不同的渲染效果,編寫下面的腳本:
? ?在上面的這段腳本中,首先我們指定了三個材質,分別是適用于簡單物體(如Cube等)的帶輪廓線的材質,適用于復雜物體(如人物模型)的帶輪廓線的材質(?本文未實現)、適用于簡單物體的默認材質。主要原理就是我們在文章開頭就提到過的射線檢驗方法。我們將這個腳本綁定到游戲場景中的物體上,設置好tag后就可以運行程序了,我們一起來看看程序的效果吧!
這就是我們今天想要實現的效果啦,通過今天的文章我們可以實現在3D場景中對一個物體的選取,這種需求在游戲里還是比較多的啊!希望大家好好學習并加以應用!