Unity第一人稱視覺化傳送門製作

2021-10-13 16:10:34 字數 3283 閱讀 9809

遊戲中很多地方用得到傳送門,就跟哆啦a夢的任意門一樣,從這邊走進去,從那邊走出來,用unity實現一下它吧。

先來個效果圖,請原諒沒有給門新增漂亮的門框、或者特效,因為手頭沒有合適的素材,但這不影響任意門的功能,也不影響介紹它的原理。另外,機器上也沒有按裝gif截圖,所以不帶動態,但圖中的「能量波動花紋」是帶動態的哦,請自行腦補。

這裡是另乙個,傳送門嘛,至少得兩個。

從一端走進去,就會從另一端走出來。效果還是可以的。

下面介紹一下原理和製作方法:

原理是這樣的,用乙個攝像機,觀察傳送門另一邊的影象,然後渲染到本端傳送門的平面上,這樣,就能在本端門內看到遠端的畫面了。

用shadergraph製作乙個shader如下圖:

這個shader的原理比較簡單,事實上最關鍵的是下面兩個節點,上面的那一堆都是為了加能量波動的效果的。將攝像機畫面也就是一張紋理連線到basecolor節點即可,最關鍵的是uv節點,要使用螢幕空間,否則的話,攝像機畫面會被壓縮到門的尺寸,就變形了。還要注意,這個shader勾選一下雙面渲染,否則跑到門的後面就看不到了。

然後用這個shader製作乙個材質,右鍵剛剛建好的shadergrap**件,選建立材質即可。

建乙個quad平面,作為傳送門。將上面的材質賦給它。然後在門的下面建立乙個相機、兩個空物體,結構如下圖:

由於要在門上顯示另乙個門外的場景,所以,本地門材質上顯示的是遠端門相機的畫面。另外需要注意的是,上面shader中所說過了,一定要使用螢幕空間作為紋理uv,這還有乙個問題,那就是紋理尺寸,要跟螢幕尺寸相符,至少比例要一致,否則門上的畫面是要變形的。這個其實很容易解決,紋理使用動態建立的就好,根據螢幕尺寸動態建一張紋理即可:

// 獲取門底下的相機元件

camera cam = m_protalcamera.

getcomponent

<

camera

>()

;// 根據螢幕尺寸建一張紋理

protalcameratexture =

newrendertexture

(screen.width, screen.height,32)

;// 將門下相機的渲染目標設定為該紋理

cam.targettexture = protalcameratexture;

// 設定相機不要觀察門本身

cam.cullingmask &=~

(1<

< gameobject.layer)

;

然後就是將紋理設定到門的材質了,也是用**:

if

( targetdoor !=

null

)}

那麼,為啥還要有兩個空物體呢?介紹一下原理:

如上圖所示,由於傳送門的兩端朝向是任意的,所以搞清楚攝像機的相對位置尤為重要,否則在a門看到的b門處的影象角度就會不正確。有了上面那個空物體,這一切就變得簡單多了,甚至不需要計算,也不需要什麼數學知識。

// 將主相機(角色)的世界座標和朝向賦予a門表示主相機的空物體

m_maincamerapos.position = m_camera.position;

m_maincamerapos.rotation = m_camera.rotation;

// 將a門下表示主相機的空物體相對於a門的相對位置,賦予b門的相機,使得b門相機相對於b的相對位置與主相機相對於a門的相對位置相同

targetdoor.m_protalcamera.localposition = m_maincamerapos.localposition;

targetdoor.m_protalcamera.localrotation = m_maincamerapos.localrotation;

請看上述**中的注釋,文字有點繞,但道理比較容易理解。

上面步驟中共建了兩個空物體,但目前只說了其中乙個的用途,另乙個是幹嘛的呢?試想一下,當角色被傳送時,從a門離開時相對於a的位置,應該與他到達b門時相對於b門的相對位置是相同的。這樣才不會顯得突兀,畫面跳轉也會比較正常。那麼剩下的這個空物體,就是解決這個的,原理跟上面相機相對位置的原理是一模一樣的:

// 當角色進入門的碰撞範圍,觸發碰撞器

private

void

ontriggerenter

(collider other)

是不是很簡單,完事了麼?no,還需要處理幾個小問題。試想一下,如果角色進入a門的觸發器,那麼a門會把它傳送到b門去,但是,角色一旦到達b門,就會立即觸發b門的觸發器,然後b門又會把他傳送到a,然後,你的玩家就會被兩個門傳來傳去。。。怎麼解決這個問題呢?還有,測試中發現,如果你的角色控制器用的是unity自帶的charactercontroller元件的話,那麼就會有點小問題,一併解決一下:

private

void

ontriggerenter

(collider other)

}

好了,把傳送門做成預製體,盡情在你的遊戲中擺放吧。。a傳到b,b再傳回a,或者a傳到b,b傳到c,c又傳到d…只要你願意,你可以一直這麼擺下去。擺完之後,只要把目標門拖到inspector面板即可。如下圖:

transform target layer :允許被傳送的物體層,比如玩家層、子彈層…

target door:這個門的目標門(要把待傳送物體傳送到哪個門,就把哪個門拖到這裡即可)

使用起來很簡單吧。。

本文到這裡就結束了,它已經可以實現基本的傳送門的功能,但仍有很多優化和完善的餘地,比如,shader可以寫的更炫酷一點,可以新增啟用或者禁用傳送門的效果和機關,傳送的瞬間新增一些特效…如果要繼續完善,那麼就盡情的發揮想象力吧。

openGL實現第一人稱視角

最近做的乙個題目要求用opengl實現乙個漫遊功能,雖然不知道這個漫遊是不是指第一人稱 其實我覺得第三人稱俯視的那種也算 不過都差不多 主要使用opengl的glulookat函式,通過計算球面座標來實現 目錄 glulookat 實現過程 demo 最終效果 void glulookat gldo...

第一人稱視角漫遊(unity 暴風魔鏡)

沒用的話就不說了,直接開始。1 開啟unity,將場景的攝像機刪除掉。找到mojingmain.prefab,新增到場景中。2 搭建場景。3 場景中新增mojingfirstcharactercontroller.prefab和integrateinputmanager.prefab 4 建立乙個空...

Unity 之第一人稱無重力控制器

最近在專案中遇到乙個需求,要求軟體中人物的操作為第一人稱視角,並且不包含重力。要求使用者可以自定義重力。在經過一番思考之後,我想到了一種解決方案,那就是通過控制相機物體的transform屬性,來對相機進行移動。至於相機的視角,我參考了unity自帶的第一人稱視角控制器的 來實現。經過一番折騰是實現...