傳送門實現(xiàn)思路
免責聲明:本篇不算教程,算是一個我個人的學習記錄,記錄了我做這個功能是的思考過程,僅提供參考,歡迎各位相互交流學習;
展示視頻:傳送門項目展示_嗶哩嗶哩bilibili
參考教程:
https://www.youtube.com/watch?v=TASHWpdQFwc&t=83s(不止一集)
【50CaL】傳送門背后的開發(fā)原理分析 | 游戲之后 EP4 - Portal_嗶哩嗶哩_bilibili(原理講得比較透徹,但不涉及具體的代碼實現(xiàn))

功能總結(jié):
可以通過門看到另一個門的景象

可以傳送物體,并能夠卡在中間

可以傳送玩家,確切來說是玩家攝像機

藍圖實現(xiàn):
第一步視覺的實現(xiàn),簡單地說就是用兩個相機渲染兩張RT,并把這兩張RT分別貼在兩個傳送門上;
通過藍圖來賦予材質(zhì)

注意:以下部分均通過Sequence連接到Tick上
因為RT是通過屏幕映射的方式貼在傳送門上的,所以視口的比例與RT的比例不同則會造成RT的變形,所以要實時調(diào)整RT的長寬比;
如果不是很明白uv的原理,可以看看Youtube上的視頻(大概28min左右):https://www.youtube.com/watch?v=Ju23BFU5TNI&t=2134s


傳送門需要另一個門配對,可以不用我這種方法,手動選取也可以,只要保證能找到另一個連接的門就行;

實時計算玩家相機變換后的Transform,并將Transform賦予捕獲攝像機,并根據(jù)攝像機與門的距離計算近裁切平面的距離,防止被其它物體遮擋;

這里用了一個自己寫的純函數(shù),原理也很簡單(我一共用了三個純函數(shù),都是計算變換的,長得也差不多)

對坐標變換原理不了解的可以看看這個Up的視頻;
【50CaL】傳送門背后的開發(fā)原理分析 | 游戲之后 EP4 - Portal_嗶哩嗶哩_bilibili

第二步,傳送物體的原理也不難,就是在另一個門后復制一個一摸一樣的物體,并且完全繼承本體的Transform,當本體傳送過去后,刪除復制體。但是UE的藍圖里好像并沒有完全復制一個Actor的功能,之后通過類生成Actor,但屬性無法繼承,所以,我就用了C++寫了一個組件完成這部分功能,并把函數(shù)公開到藍圖(Clone Actor、Clone Static Mesh Actor);
創(chuàng)建C++類的方法我就不講的,因為我自己也不是很懂,怕誤人子弟,各位還是去看看別的Up或者Youtuber的教程吧,這里只貼一下我的C++代碼;
如果不是很理解這個原理的,也可以看看這個Up的視頻,基本所有的原理都有講【50CaL】傳送門背后的開發(fā)原理分析 | 游戲之后 EP4 - Portal_嗶哩嗶哩_bilibili


別問為什么不用Collision,慘痛的教訓。因為Collision用的是事件,而事件是異步執(zhí)行的,也就是你完全不能預(yù)估事件執(zhí)行的順序,這對于需要引用前面變量的值的程序來說是致命的,所以不能這么用,還是老實用射線檢測吧;



這部分的判斷看起來確實是有點亂,實際上也確實是有點亂,還有更亂的在后面。這里主要是為了避免Actor傳送過去了,但因為距離原因又傳送回來,從而變成一個無限循環(huán)的情況。還有一個就是為了讓已經(jīng)一半身子進入傳送門的Actor能夠順利出來(反悔)

這里標紅的,設(shè)置速度的,因為不是所用Actor都像靜態(tài)網(wǎng)格體一樣模擬物理的,比如第一人稱模板里的子彈,就是加了發(fā)射物組件的,所以這里需要多要解決方案,像白框那里一樣,在后面加上去就好;


第三步,傳送角色。這里不僅包括玩家Pawn,我把所有Character類都與其它Actor類分開來寫,但整體上思路沒有太大區(qū)別,就多了一個調(diào)整克隆體的姿勢的步驟而已,還有就是玩家Pawn需要一些格外處理;
Pawn的話,主要的還是相機,畢竟相機才是玩家的本體。瞬移沒太多要講的,和普通的Actor差不多,不過相機一般不會繞X軸旋轉(zhuǎn)。判斷是否傳送,這里主要是通過門到相機的向量與門的前向量叉乘判斷的,加上一個球型的范圍限定,防止在大老遠就被誤傳送;



這里的主要難點是,玩家的傳送需要事實上的無縫,和Actor不同,Actor可以在距離門一段距離后再傳送,以至于不會重復觸發(fā)。所以需要多加一個變量判斷Pawn在傳送后是否離開了一定距離。




這個需要多一步,同步骨骼網(wǎng)格體的姿勢;

因為考慮到AI,所以需要和玩家分開判斷,就顯得有點復雜了;



補丁,如果是第三人稱鏡頭,就會出現(xiàn)鏡頭距離角色太遠,而不能很好的傳送的問題,所以需要在接近傳送門時調(diào)整彈簧臂的長度,不過還是因為異步的原因,所以視覺效果有點問題,不過能用。碰撞的設(shè)置是為了避免在第三人稱鏡頭下,因為攝像機碰到了傳送門而發(fā)生傳送的誤操作情況,需要在項目設(shè)置里加多一個Object;

不足:不足的地方太多了,甚至不知道從哪說起,我就列三個比較明顯的吧;
在第三人稱下,人物移動時鏡頭會出現(xiàn)抖動的情況,雖然玩家視角看著好像沒有,但數(shù)據(jù)告訴我確實是有,所以導致了變換Transform的捕捉相機也出現(xiàn)抖動,從而使得RT的抖動會比較明顯,第一人稱倒沒事;
目前傳送門只能水平放置,不能傾斜,傾斜的話,其它Actor可以照常工作沒啥問題,但是Pawn就會出現(xiàn)鏡頭問題,雖然能用,但是不太好用;
還有一個問題就是相機的近裁切面,因為才切面不一定會與傳送門平行和重合,所以就導致了畫面的不連貫,觀感不好,這個問題用不對成視錐體可以解決,但是我不會。關(guān)于這個問題也可以去看看這個Up的視頻,他也有講【50CaL】傳送門背后的開發(fā)原理分析 | 游戲之后 EP4 - Portal_嗶哩嗶哩_bilibili;
