2016年5月11日 星期三

【心得】我的Uncharted 4開發雜記

http://forum.gamer.com.tw/C.php?bsn=60596&snA=21826&tnum=1

#1 【心得】我的Uncharted 4開發雜記
發表:2016-05-11 13:10:28看他的文開啟圖片
cjcat2266(CJ Cat)
開始XD的見習生LV19 / 人類 / 初心者
巴幣:21362
GP:1103
經驗:
之答應過要寫的,剛出爐熱騰騰的Uncharted 4開發雜記~



Uncharted 4已經發售,終於可以分享我負責開發的部分了
我主要是負責單人模式的夥伴AI、多人模式的戰友AI、還有一些遊戲邏輯
沒有收錄到最終遊戲的部分和一些瑣碎的細工我就略過不提


= 崗位系統 =

在本文開始前,我想要先談談我們用來指派NPC移動位置的崗位系統
這個系統的核心邏輯不是我負責的,我寫的是使用這個系統的客戶端程式
崗位是可行走空間中的離散位置
大部分是用工具自動生成的,也有一些是設計師手動擺置的
基於不同需求,我們設計不同的崗位平分系統
(e.g. 潛行崗位、戰鬥崗位)
然後我們選擇評分最高的崗位,指派NPC移動過去



= 夥伴跟隨 =

夥伴跟隨系統是繼承自The Last of Us
基本概念就是,夥伴在玩家周為找個跟隨點
這些可能的跟隨點從玩家位置扇狀分開
並且要滿足以下的路徑線段淨空條件:
– 玩家到跟隨點
– 跟隨點到前方投射點
– 前方投設點到玩家


攀爬是Uncharted 4的新功能,這是The Last of Us 沒有的
為了與現有的跟隨系統整合,我利用攀爬崗位讓夥伴可以跟著玩家一起攀爬


這個功能比我想像中的還要難搞
單純根據玩家的攀爬狀態來切換夥伴的攀爬狀態,結果不甚理想
只要玩家快速在攀爬與非攀爬的狀態之間切換,夥伴就會在兩個狀態間快速跳換
於是我加入了遲滯現象(hysteresis)
只有在玩家切換了攀爬狀態,並且保持此狀態移動一定距離之後,夥伴才跟進
廣泛來說,遲滯現象是個解決行為跳換的好方法


= 夥伴帶領 =

遊戲中的某些特定場景,我們要讓夥伴帶領玩家前進
我把The Last of Us的帶領系統移植過來
設計師使用spline曲線在關卡中標記他們想讓夥伴帶領玩家的大致路線


如果有多個帶領路線,設計師則會用腳本語言切換主要的帶領路線


玩家的位置投射到spline曲線上,再往前延伸設定為帶領參考點
當帶領參考點超越被標記為等待點的spline曲線控制點,夥伴會前往下個等待點
如果玩家走回頭路
夥伴只有在帶領參考點離此次推進至最遠的等待點一段距離,才會回頭
這也是利用遲滯現象來避免行為跳換

我也把動態移動速度調整的功能整合進帶領系統
根據夥伴和玩家之間的距離,一些”速度平面”沿著spline曲線放置
夥伴有三種移動模式: 走路、跑步、衝刺
根據玩家撞到的速度平面,夥伴會選擇不同的移動模式
另外,夥伴的行進動畫速度也會基於玩家距離做微調
目的是避免切換移動模式的時後,有太突然的移動速度變化



= 夥伴掩體共用 =

在The Last of Us中,玩家和夥伴可以在各不離開掩體的狀況下重疊
我們稱這個為掩體共用


The Last of Us中的Joel伸手跨過Ellie和Tess按在掩體上
看起來很自然,因為夥伴的身型都比玩家嬌小
但是同樣的動作就不適合身型差不多的Nate、Sam、Sully、和Elena
而且Uncharted 4的遊戲節奏較快
讓Nate伸手去按掩體只會讓動作流暢性打折扣
所以我們決定就單純讓夥伴靠緊掩體,玩家稍微繞彎避開伙伴


我用的邏輯很簡單
如果玩家位置往移動方向投射的點,落在夥伴掩體周圍的一個方框內
夥伴就會取消目前的掩體行為,並且快速靠緊掩體



= 救星戰友 =
我負責多人模式的戰友(sidekicks),而救星戰友是其中最特別的
單人模式中的NPC,沒有一個人的行為跟救星戰友一樣
他們會復甦被擊倒的同伴,也會複製玩家的掩蔽行為



救星戰友會嘗試複製玩家的掩蔽行為,並且盡量待在離玩家很近的地方
所以當玩家被擊倒的時後,他們就可以迅速跑過來復甦
如果玩家有裝備救星戰友的復甦包額外功能
他們會在採取復甦行動之前,朝被擊倒的復甦目標丟復甦包
復甦包丟擲基本上就是延用手榴彈的拋物線淨空測試和擲彈動作
只是我把手榴彈換成復甦包而已



= 隱蔽草叢 =
在隱蔽草叢中蹲行也是Uncharted 4才有的新功能
要實作這個功能,我們需要某種能夠標記場景的手段
遊戲邏輯才可以判斷玩家是否身處隱蔽草叢中

我們一開始是讓美術人員在Maya中標記背景模型的表面
但美術人員和設計師之間的溝通時間太長,很難頻繁改進關卡
於是我們決定用另外一種方法標記隱蔽草叢
我在場景編輯器中的nav mesh增加了隱密草叢的額外tag
讓設計師可以直接在編輯器中精準標記隱蔽草叢
有了這個額外的標記
我們也可以用這個資訊來為隱蔽崗位評分



= 感知 =
Uncharted 4沒有像The Last of Us有聆聽模式
所以我們必須要找另外一種方法,讓玩家有辦法得知附近的敵人威脅
好讓玩家不會在未知的敵對環境中產生迷失感
我利用敵人的感知資料,加入了威脅標示
當敵人開始注意(白色)、起疑(黃色)、和發現(橘色)玩家
這些標示會適時地提醒玩家
另外,我在威脅標示開始累積的同時播放背景雜音,以製造張力
當玩家被發現的時候,則播放大聲的提示音效
這些音效的安排和做用跟The Last of Us類似



= 調查 =
這是在我們送廠壓片前,我負責的最後一個功能
我平常在Naughty Dog是不參加正式會議的
不過在送廠壓片的前幾個月,我們每週至少開一次會
Bruce StraleyNeil Druckmann主持,專注在遊戲的AI部分
幾乎每次開完會之後,調查系統都有需要更動的地方
前前後後總共經歷了好幾次大改
會讓敵人起疑的因素有兩種: 玩家和屍體
當敵人起疑了(起疑者),他會抓最近的同伴來一起調查
離起疑點較近的人會成為調查者,另外一個人則是看守者
起疑者可能會視調查者,也有可能是看守者
我們總共有兩組不同的對話,適用於兩種不同的情況
(“那邊有異狀,我去看看” vs “那邊有異狀,你去看看”)

為了讓雙人調查看起來更自然
我使用了時域錯位的技巧,讓兩人的行動和威脅標示時間點錯開
否則兩個人的行為完全同步,看起來非常機械式、很不自然


如果調查者發現了屍體,他會通知全部的同伴開始搜索玩家
屍體也會被暫時標示,以讓玩家知道敵人為什麼進入警戒


在某些難度下,短時間內連續觸發調查,會讓敵人的感應力變敏銳
他們會更容易發現玩家,即使玩家躲在隱蔽草叢中也一樣
慘烈模式下,敵人永遠處於敏銳狀態


= 對話動作 =

這也是我負責的最後幾個功能之一
對話動作系統負責操控角色,在對話的時候做出一些小動作
像是轉頭看其他人和肢體動作
之前在The Last of Us
開發人員花好幾個月的時間,把整個遊戲所有的對話腳本手動加註上對話動作
我們可不想再做一次這種苦工
在這個開發階段,已經有部分對話腳本被手動加註好對化動作了
我們需要一個泛用型系統,可以幫沒有加註對化動作的腳本自動產生對話動作
而我就是負責制做這個對話動作系統
動畫師可以調整參數,改變轉頭速度、轉頭角度、注視時間、反覆時間等



= 維持吉普車動量 =

開發初期遇到的問題之一,就是馬達加斯加的吉普車駕駛關卡
當玩家開車撞到牆或者敵人的載具,玩家的車就會旋轉失速以致脫離車隊而關卡失敗
我使用的解決方法是,當玩家的車撞到牆或者敵方載具的時候
短暫地限制吉普車的最高角速度和線性速度的方向變量
這個簡單的方法相當有效,從此玩家就比較不容易旋轉失速而導致關卡失敗了



= 載具死亡 =

可駕駛的載具是首次在Uncharted 4登場
在這之前,所有的載具都是NPC駕駛、沿著固定軌道行進
我負責載具死亡的部分
摧毀載具有幾種方式:
解決駕駛、開槍射車、開車撞飛敵方機車、開車撞敵方吉普車導致旋轉失速
基於不同的死法,載具死亡系統會選擇載具和乘客的死亡動畫來播放
死亡動畫會漸漸混入物理引擎控制的ragdoll系統
所以死亡動畫會不著痕跡地轉換成物理模擬的翻車


當玩家開吉普車撞飛敵方機車的時候
我使用機車在XZ平面上投影的bounding box和碰撞點
來判斷要使用四個撞飛死亡動畫中的哪一個


至於衝撞使得敵方吉普車旋轉失速
我是拿敵方吉普車與預設行進方向之間的旋轉量差來比較旋轉失速判定閾值


載具播放死亡動畫的時候,有機會穿透牆壁
我使用球體投射,從預設位置投射向載具實際位置
如果投射結果是與牆壁碰撞,則把載具稍微往牆壁的法向量移動
不一次完全修正誤差,是為了避免太過劇烈的位移


我另外實作了一種特別的載具死亡類型,叫做載具死亡提示
這些死亡提示是動畫師和設計師在場景中擺置好的客製化死亡動畫
每個死亡提示在載具行進軌道上都有個進入範圍
當一個載具在死亡提示進入範圍中死亡,則會開始播放死亡提示的特殊死亡動畫
之所以開發這功能,一開始是為了2015年E3展的超帥氣吉普車死亡動畫


= 混色用的貝爾矩陣 =

我們想要消除攝影機切入看穿物體的瑕疵,特別是遊戲中的各種植物
於是我們決定要讓靠近攝影機的像素淡出
使用半透明像素並不是個好主意,因為非常消耗效能
我們使用的技巧,是所謂的混色(dithering)
https://en.wikipedia.org/wiki/Dither

使用混色技巧搭配貝爾矩陣(Bayer matrix)
利用一個預先決定的點陣模板來決定哪些像素可以捨棄而不渲染
https://en.wikipedia.org/wiki/Ordered_dithering

結果就是產生半透明的錯覺


一開始使用的貝爾矩陣是個8×8矩陣,取自上述的Wikipedia頁面
我認為這個矩陣太小,會造成不美觀的帶狀瑕疵
我想要使用16×16的貝爾矩陣,但是網路上都找不到相關資料
於是我試著用逆向工程找出8×8貝爾矩陣的遞迴特性
光用目測法,我想我應該可以直接解出16×16貝爾矩陣
但是我想要讓過程更有趣一點
我寫了一個工具,可以生成二的任何次方大小的貝爾矩陣


換到16×16貝爾具陣之後,可以明顯看到帶狀瑕疵的改善



= 爆炸聲延遲 =

這個部份我其實沒有什麼大貢獻,但是我還是覺得值得一提
在2015年E3展示中,Nate和Sully同時接收到高塔傳過來的爆炸聲和爆炸畫面
這是不合理的,因為高塔距離非常遠,爆炸聲應該會晚一點才被接收到
我在開展前幾週指出這點,美術團隊後來就在爆炸聲之前加上一小段延遲了


= 繁體中文在地化 =

直到送廠壓片前幾週我才開始在遊戲中改用繁體中文字幕,而我找到了許多錯誤
大部分的錯誤都是英文直譯中文,而變成四不像的用語
我認為我沒有足夠的時間可以單槍匹馬全破一次遊戲又同時抓出翻譯錯誤
於是我請幾個QA部門的人分章節、用繁體中文模式遊玩
然後我陸續瀏覽他們的遊玩錄製影片
結果這個方法相當有效率
我成功地把我找到的翻譯錯誤建檔,而在地化小組也有足夠的時間修正翻譯


= 結束 =

以上就是我對Uncharted 4開發上值得一提的貢獻
希望大家讀得愉快 :)
最後編輯:2016-05-11 14:19:15 ◆ Origin: <75.82.92.xxx>
武術家:先首讚在說6小時前
Έμπουσα:C貓推一個 ~ 再推台灣廟照片 Xddd6小時前
Baker9:支持了一份.開發人員辛苦了6小時前
KILLERROSS:先推在看 台灣之光 謝謝你6小時前
派大豬:讚讚讚6小時前
兔子:太神拉6小時前
Joker Bank Robber:Awesome6小時前
:已跪6小時前
玩家:這次的密境4在PS4上的表現,我看到了開發者的用心。也搖頭PS4效能的極限。GP+16小時前
HAHA:嘆為觀止的解說,感覺到頑皮狗滿滿的用心6小時前
Έμπουσα:上巴哈GNN ~ GNN!!!6小時前
紅莓慕斯夏洛特:先按gp再來慢慢看6小時前
歐西:遊戲做的很棒期待未來的新作品5小時前
阿彩嚇嚇叫:只能推了5小時前
:第七章 BUG破圖啊啊啊~~5小時前
索娜姐姐:推推!5小時前
布魯布魯:完全看不懂 感覺好像很厲害 給GP5小時前
寶貝的老公:GP!給!wwwwwwww5小時前
自由射手~☆:推~但這些沒有機密問題吧!?5小時前
5:推5小時前
我就是真理:先跪5小時前
蒼雷之舞:辛苦你門的努力 我們才有好遊戲玩5小時前
寶貝的老公:感謝大大用心阿!wwww 能給100個GP嗎?wwwwww5小時前
熊仔:答應了誰呢..不寫也OK的^^4小時前
北斗第八星:讚,可惜秘境1-3合輯是應該sony作的,翻譯比p3爛,錯誤又一大堆,在sonyfb留言過,卻到現在都沒更新,還好4代有您4小時前
FinallyPeace:這代翻譯不錯 感謝cj貓大如此用心4小時前
LULALA:神串留名~4小時前
Elf:看起來超神的!4小時前
肥肥:特地登入給大大一個GP4小時前
法蘭西先生:太強了 請受小弟一拜4小時前
肥婆精:未看先推4小時前
榮光の劍-Vesperia:太神啦3小時前
修改個人資料:看到這篇只能選擇登入丟GP!不丟對不起自以!3小時前
Antique Cowboy:我雖然是完全看不懂的門外漢,但這不推真的不行! 好文+好遊戲!3小時前
:感謝大大的用心與分享! 另外主角大叔好帥啊舔(別(重點誤3小時前
Cly:GP不廢話!3小時前
SEL:有神快拜3小時前
大懶:台灣 no13小時前
Roki~小喵~涅吉:真的辛苦了 所以我買了一片3小時前
Arto:GP BJ4 感謝大大分享!!2小時前
種族蜘蛛.職業魔法師:最後生存者2快出~1小時前
傑森Z:跪著看! 大大辛苦了1小時前
阿卡拉特:真得很厲害 我馬上訂巴哈得了1小時前
JohnBoy75129:台灣之光QQ1小時前
阿凱Keven:謝謝你,還有頑皮狗所有工作人員,讓全世界玩家可以體驗到如此精彩的作品,實在太令人敬佩18分前
熾炎之翼:辛苦了,感謝您為這神作所做的一切努力!!!16分前
阿憲:你真是台灣人的驕傲QQ...5分前
18GP-BP
#2 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 13:26:37看他的文開啟圖片
KEN1983TW(KUSO)
不擊隔大學士LV35 / 人類 / 武鬥家
巴幣:16240
GP:988
經驗:

遊戲中出現的寺廟,照片這是台灣吧!?
台灣no.1
最後編輯:2016-05-11 13:33:58 ◆ Origin: <114.42.60.xxx>
Έμπουσα:是的沒錯6 小時前
Έμπουσα:台北三峽祖師廟6 小時前
KUSO:了解!感謝解答!6 小時前
十五年的時光:這我一開始也注意到!果真是台灣2 小時前
2GP-BP
#3 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 13:33:00看他的文開啟圖片
Empusa(Έμπουσα)
未夠班的勇者LV18 / 人類 / 初心者
巴幣:16968
GP:541
經驗:
CJ貓大,這篇足以上GNN,

秘境四,遊戲開發心路歷程啊!!

大家團結力量大,推上去!!

讓看衰這款遊戲玩家的,讓他們知道,

這背後也是有個默默辛苦付出的台灣人呢!!

 …………
手機發文.最後編輯:2016-05-11 13:33:00 ◆ Origin: <101.15.18.xxx>
3GP-BP
#4 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 13:35:05看他的文開啟圖片
CYVIA(Joker Bank Robber)
倒十字的使徒LV47 / 人類 / 盜賊
巴幣:178786
GP:8352
經驗:
※ 引述《cjcat2266 (CJ Cat)》之銘言 

請問德瑞克家中的台灣三峽祖師廟的照片是你提供的嗎?

或是美術人員隨意挑選的?


昨天我是第一個確認地點的,有紀念品可以領嗎XD (開玩笑的)
最後編輯:2016-05-11 15:01:22 ◆ Origin: <1.169.198.xxx>
Έμπουσα:贈品 … 秘境錶 … C貓提供 XDD6 小時前
6GP-BP
#5 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 13:42:56看他的文開啟圖片
fenglidon(青春的肉體)
只知kuso的小平民LV15 / 獸人 / 初心者
巴幣:11933
GP:83
經驗:
我媽這次沒問我為什麼跪了,因為她也跟我一起跪了 XD
最後編輯:2016-05-11 13:42:56 ◆ Origin: <220.141.130.xxx>
Έμπουσα:+1 … 我祖先也跟我一起跪著看這篇流淚6 小時前
索娜姐姐:我家的狗啊魚啊也一起跪惹5 小時前
寶貝的老公:跪求魚跪的照片,應該很萌~wwwww5 小時前
榮光の劍-Vesperia:wwwwwwww3 小時前
0GP-BP
#6 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 14:08:54看他的文開啟圖片
j7159902(軟糖燒)
聖獸之召喚士LV37 / 妖精 / 弓箭手
巴幣:30640
GP:828
經驗:
快推

不然別人會以為我們看不懂
最後編輯:2016-05-11 14:09:23 ◆ Origin: <203.64.92.xxx>
Antique Cowboy:事實上真的看不懂XDD3 小時前
0GP-BP
#7 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 14:26:35看他的文開啟圖片
LV16 / 妖精 / 初心者
巴幣:11404
GP:0
經驗:
看到Allen 大為了大家繁體中文的遊戲品質幫忙校正翻譯

這不買說不過去啊!!!!

Allen 大辛苦你了,讓我們有美好的遊戲體驗.
最後編輯:2016-05-11 14:26:35 ◆ Origin: <223.136.168.xxx>
Antique Cowboy:事實上真的看不懂XDD3 小時前
Antique Cowboy:抱歉上面的留言留錯篇XD3 小時前
1GP-BP
#8 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 14:40:04看他的文開啟圖片
bobo910018(阿青)
LV10 / 矮人 / 初心者
巴幣:2915
GP:14
經驗:
台灣之光啊!!!推上GNN!!
手機發文.最後編輯:2016-05-11 14:40:04 ◆ Origin: <101.8.65.xxx>
0GP-BP
#9 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 14:55:50看他的文開啟圖片
rty12232000(愉悅的中中)
神眼遊俠LV35 / 妖精 / 劍士
巴幣:24538
GP:1697
經驗:
請問在地化小組是指SCET嗎?
最後編輯:2016-05-11 14:55:50 ◆ Origin: <180.205.138.xxx>

0GP-BP
#10 RE:【心得】我的Uncharted 4開發雜記
發表:2016-05-11 19:15:08看他的文開啟圖片
yunski(yun)
經歷滄桑的老巴友LV50 / 人類 / 武鬥家
巴幣:544753
GP:6330
經驗:
※ 引述《cjcat2266 (CJ Cat)》之銘言
> 之答應過要寫的,剛出爐熱騰騰的Uncharted 4開發雜記~ 
在新視窗開啟圖片 
原文連結 
= 混色用的貝爾矩陣 = 
> 我們想要消除攝影機切入看穿物體的瑕疵,特別是遊戲中的各種植物 
> 於是我們決定要讓靠近攝影機的像素淡出 
> 使用半透明像素並不是個好主意,因為非常消耗效能 
> 我們使用的技巧,是所謂的混色(dithering) 
https://en.wikipedia.org/wiki/Dither 
> 使用混色技巧搭配貝爾矩陣(Bayer matrix) 
> 利用一個預先決定的點陣模板來決定哪些像素可以捨棄而不渲染 
https://en.wikipedia.org/wiki/Ordered_dithering 
> 結果就是產生半透明的錯覺 
在新視窗開啟圖片 
> 一開始使用的貝爾矩陣是個8×8矩陣,取自上述的Wikipedia頁面 
> 我認為這個矩陣太小,會造成不美觀的帶狀瑕疵 
> 我想要使用16×16的貝爾矩陣,但是網路上都找不到相關資料 
> 於是我試著用逆向工程找出8×8貝爾矩陣的遞迴特性 
> 光用目測法,我想我應該可以直接解出16×16貝爾矩陣 
> 但是我想要讓過程更有趣一點 
> 我寫了一個工具,可以生成二的任何次方大小的貝爾矩陣 
在新視窗開啟圖片 
> 換到16×16貝爾具陣之後,可以明顯看到帶狀瑕疵的改善 
在新視窗開啟圖片 
這個真的太讚了以往很多遊戲都有這種類似的帶狀瑕疵
不過這邊講了一個解法
從圖看起來這效果還真不錯

= 繁體中文在地化 = 
> 直到送廠壓片前幾週我才開始在遊戲中改用繁體中文字幕,而我找到了許多錯誤 
> 大部分的錯誤都是英文直譯中文,而變成四不像的用語 
> 我認為我沒有足夠的時間可以單槍匹馬全破一次遊戲又同時抓出翻譯錯誤 
> 於是我請幾個QA部門的人分章節、用繁體中文模式遊玩 
> 然後我陸續瀏覽他們的遊玩錄製影片 
> 結果這個方法相當有效率 
> 我成功地把我找到的翻譯錯誤建檔,而在地化小組也有足夠的時間修正翻譯 
= 結束 = 
雖然我以前也參與過遊戲在地化
不過時間有點久了不清楚現在是不是也是這樣做的
有時候翻譯人員拿到的文件就是單純的文件
並沒有搭配遊戲,而且句子都一句一句的,不一定連貫
會變成單看文件來翻譯,有時候前後文可能都不在同一個地方
如果遊戲玩的熟,場景和前後句搭得起來就比較不會有這問題
但如果這些都沒有還滿容易變成英文直譯中文搭場景看會變成四不像
可以想像這樣的情況

> 以上就是我對Uncharted 4開發上值得一提的貢獻 
> 希望大家讀得愉快 :) 

真的很難得看到原生中文的開發雜記
實在太棒了
最後編輯:2016-05-11 19:15:08 ◆ Origin: <BAHAMUT>

沒有留言:

張貼留言