GameDesign 板


LINE

最近用UE4遇到了一個非常奇怪的現象, 困擾了好久,於是我決定用力追查下去… 網誌版: http://dorgon.horizon-studio.net/zh/archives/1561 ===============全文開始==================== 事情是這樣的。 本來我是想要測一下network做replication變數相關的功能,因此建了一個空白的level(全黑色那張),並做了一個Character後加了幾個變數與寫了幾個function來進行實驗。在按下play之後……嗯,一開始變數成功的從server傳過去給client了(開了二個player,一個listen server,一個client)。很好!就在我滿足於事情正如想像中進展的時候,突然間,變數卻完全送不過去給Client了! 到底發生了什麼事?就我的理解上,我用的是COND_None,只要server有任何變動的話,變數應該會送給client阿?難不然變數是unreliable的?不對阿,replication變數肯定都是reliable,頂多就只有因為頻寬的問題而延遲送達而已。經過我的反覆實驗,最後發現了一件驚人的事實: 我listen server上的character居然被砍掉了! 在得知這項資訊後,我決定馬上到AMyCharacter::EndPlay這個function中下斷點──我想想看看到底是那個混蛋砍了我的character。可惜的是,我依然沒有抓到兇手。──AMyCharacter::EndPlay是被呼叫了沒錯,可是EndPlayReason只寫了一行Destroyed。這資訊完全沒有幫助,因此我決定循著call stack往上層追,最後看到了這段程式碼: https://gist.github.com/dorgonman/00c3c173f3a70fc040d88d00915e3323 WTF!?網路收到了斷線通知之後,就馬上把我的角色砍了!?為什麼listen server上所擁有的Character會被斷線?我並沒有加入任何砍Actor的邏輯阿?難道是因為自動觸發GC的緣故?也不對阿,Actor的生命週期應該是跟著world才是,要砍Actor的話只能手動呼叫Destroy(K2_DestroyActor)才行。我完全被眼前的事實驚呆了,這跟我過去對於UE4相關的知識完全不相符。 「這樣不行,一定要找出原因。」──雖然感受到了挫折,但我才不會因為這點小事就被擊敗。為了找出被斷線的原因,我決定利用手邊僅剩唯一的蛛絲馬跡「Bunch.bClose」來找出殺死Character的兇手是誰。事出必有因,既然Bunch.bClose這個flag是true,那必然是有那段邏輯使然。在搜遍了整個引擎之後,總算發現下面這段非常可疑的程式碼: 温ttps://gist.github.com/dorgonman/5f021b9eac330493d3f012bfda9a8d99 當Channel->Close();被呼叫之後,就會送出一個CloseBunch出來並把我的Character殺死。而為什麼會進到這段邏輯的根本原因,在於bIsRecentlyRelevant是false,意即,listen server認為這個Character已經跟自己沒有任何瓜葛了,所以就殺了他。 到這裡,似乎就已經破案了,原來人是Server自己殺掉的阿…… 但李組長眉頭一皺,事情似乎並不是這麼樣的單純。為什麼listen server會無緣無殺的去殺掉自己的親生兒子?難不成二兒子就那麼該死嗎(PlayerController2)?大兒子(PlayerController1,listen server)不是還活蹦亂跳的好好的在那邊嗎?為什麼就只有二兒子!?而且是非常固定,每次在世界被建構起來約10秒鐘之後,這件兇殺案就會必然的發生。不管是我模擬了幾十次還是幾百次,都無法逃離二兒子死亡的結局。 這世界上肯定是哪裡有Bug了!──我的心底對著Epic大神這麼叫囂著。 這麼顯而易見的Bug,不可能只有我才會遇到。於是我轉而求向古歌大神的協助……然而,卻還是一無所獲。沒辦法,只好靠著新發現的事實,繼續的往上追蹤。目前我們知道,當Listen Server決定要跟二兒子斷絕關係的時候,bIsRecentlyRelevant就會被設成false,那麼我們只要找到設置bIsRecentlyRelevant這個flag的源頭,就必然有辦法找出這件兇殺案背後發生的原因。 殺人兇手,是身為父親的Listen Server。──這點已經不容質疑。 但事實的背後往往有著更令人訝異的真實。只要努力不懈的話,真理永遠就只會有一個。是的,最後我終於到達了,那扇真理之門的面前: https://gist.github.com/dorgonman/baba67405e381f52f35f7112c7b610a7 看到這段程式碼之後,我馬上理解了整個案情的來龍去脈。為了證明事實真的如同我所想像的,我馬上再次開啟了最後一次世界的模擬: 「failllllllllllllllllllllllllllllllllllllling──────!」我彷彿聽到了慘叫聲。 二兒子Z軸的數字正以著不可思議的速度往下遞減──在重力加速度的加成下,二兒子快速的離大兒子遠去,然後在到達一定的臨界值(NetCullDistanceSquared)之後,就這麼消失在世界的盡頭。 什麼嘛,原來是摔死的。 至此,一切的謎題都已經解開了。 想要避免這件慘絕人寰的兇殺案,大致上有以下幾個解決方案: 將CharacterMovement中的Default Land Movement Mode 設成Flying:這樣你的角色就不會掉下去了。 將Character中的Always Relevant這個選項打勾:但是你的Character還是會無限的往下進行自由落體的動作,只是,這個flag是有其必要性,它在多人連線遊戲下可以減少不少網路頻寬,在調整這個設置前,最好對這個flag有正確的認識。 下面放個Cube:這樣Character就有地方可以站。 -- Sent from my Windows --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.35.182.84
※ 文章網址: https://webptt.com/m.aspx?n=bbs/GameDesign/M.1530194954.A.836.html
1F:推 coolrobin: 推推 06/29 00:02
2F:推 dklassic: 這也寫得太有趣了吧 Xd 06/29 12:18
3F:推 ConSeR: 摔死XD 07/05 18:28







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP