国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

基于物理玩法的思考(二)—— 大數(shù)量單位

0
分享至



作者:余田

首發(fā)“魚塘游戲制作工坊”公眾號

一、前言

溫馨提示,全文5k字,閱讀需要一定程序基礎(chǔ),歡迎大家關(guān)注后慢慢閱讀——

上一篇探討了物理玩法中的操控和移動實現(xiàn),本篇進行下一步,研究一下如何實現(xiàn)同屏大數(shù)量單位的移動和控制,大數(shù)量是指幾千數(shù)量級,且要支持物理影響這些單位。

我們的難點如下:

  • 難點1,數(shù)量級要足夠大,手機支持數(shù)千到上萬級別
  • 難點2,這些單位還要可以受物理影響,有物理效果
  • 難點3,不想要基于代理的方式來簡化,也就是每個單位有獨立邏輯
  • 難點4,基于組裝,目標多變,并不固定,并且會有多目標

當然,從設(shè)計目的出發(fā),我們也有一些簡化問題的機會點:

  • 機會點1,限定2D平面上的多單位,不是3D
  • 機會點2,不需要過于精確的尋路結(jié)果,不追求最短距離的尋路最優(yōu)解
  • 機會點3,底層不需要基于物理,只要和玩家操控的物理底層能夠銜接,表現(xiàn)有物理的感受即可
  • 機會點4,不追求精確避障,可以接受偶爾重疊

接下來,我們先來簡單總結(jié)一下現(xiàn)有的實現(xiàn)方式都有哪些:

1.基于NavMesh + 局部避障的思路

這是最容易想到的思路,unity本身就支持,比較成熟,優(yōu)點是尋路的質(zhì)量比較好,缺點就是性能要求比較高,適合幾百數(shù)量級的實體,不符合我們的需求。



2.VO / RVO / ORCA:基于速度空間的避障(Velocity Obstacle)

這個三個方法一脈相承,主要用于避障,和一般基于位置進行避障的思路不同,簡單來說,這一系列方法的核心就是:如果我現(xiàn)在選這個速度,未來一小段時間會不會撞到別人?把所有“會撞的速度”圈成一個區(qū)域,然后在區(qū)域外選一個盡可能接近期望速度的安全速度。



這一類方法雖然避障效果很好,但對于數(shù)學計算有一定要求,因此從性能上考慮也不是最佳的選型,研究了一下也pass了,unity里也有現(xiàn)成的實現(xiàn),大家想要學習,可以上git搜,鏈接在這https://github.com/Nebukam/com.nebukam.orca?tab=readme-ov-file

3.流場尋路(Flow Field)

傳統(tǒng)尋路(A* / NavMesh)是:對每一個單位,從起點到終點求一條離散路徑(拐點列表),單位沿路徑走。

Flow Field 則是以“目標點”為源頭,在整個地圖上鋪一張“勢能場”,每個格子都存一個“朝目標前進的最佳方向”。單位只需要:

  1. 找到自己所在格子
  2. 讀取這個格子的“方向向量”
  3. 朝這個方向加速/移動

換個形象的比喻,把目標點看成一個低洼水坑,整張地圖做一次“地勢計算”,每個格子有一個“高度”(離坑有多遠)。單位就是水滴,只要沿著坡度下降方向走,就會自然流進水坑。



流場尋路關(guān)鍵特點:

  • “路徑”不是存在于每個單位身上,而是存在于“地圖格子”上;
  • “路徑規(guī)劃”是一次全局計算,之后所有單位都廉價復用;

理論上O(1),復雜度跟單位數(shù)量無關(guān),只跟流場構(gòu)建成本有關(guān),配合一些優(yōu)化流場計算的手段,可以實現(xiàn)極大數(shù)量的單位共同運動。

缺點也很明顯,需要目標盡量固定且少量,需要地圖盡量固定,因為“地勢”一變,就得更新流場地圖。所以很適合塔防之類的游戲,我們游戲主角到處移動,未來還考慮多人聯(lián)機,因此不太適合。但流場尋路確實很優(yōu)雅,某些場景可以考慮混合使用。

4.Steering + 射線 + 空間分區(qū)避障

由于前面說的,我們不追求完全最優(yōu)解的尋路,且未來需要結(jié)合物理,對性能要求更高,所以最后這是最適合我們的一個方案,足夠簡單高性能,也可以很好地拓展。

整體思路是每個單位不做復雜的尋路,而是:

  • 每個單位只知道:想去的“目標方向”(一般就是指向玩家,或者任意目標位置)
  • 前面有沒有墻/障礙(射線檢測)
  • 如果前方是通的 → 篤定往前沖
  • 如果前方有障礙 → 在附近扇形范圍內(nèi)“試探”幾個方向,找一個能通過的方向
  • 加一點點“單位間排斥力”,避免全擠成一團

二、移動具體實現(xiàn)思路

以“單個單位”為例,每一幀大致流程是:

  • 計算“理想前進方向”
  • 用射線檢測這條方向是否被障礙擋住
  • 如果被擋,扇形范圍內(nèi)尋找替代方向
  • 在避障方向基礎(chǔ)上,疊加“和周圍單位保持距離”的偏移
  • 在最終方向上做平滑處理,并加一點點隨機擾動防止卡死
  • 通過剛體/位移沿這個方向移動

整個過程只決定“方向”,移動本身依然交給剛體物理和碰撞系統(tǒng)處理 [來源]。

下面把每一步展開講。

第一步:理想方向——它本來想往哪兒走?

先只考慮“目標”,不考慮障礙和友方。目標可以是玩家位置、某個路徑點、玩家周圍的某個隨機點等。理想前進方向就是:從自己指向目標的單位向量。這一方向是后面所有計算的“基準”,避障和群體行為都只是對這個基準做修正。如圖:



第二步:射線檢測——這條路通不通?

有了理想方向之后,下一步是判斷:“如果沿著這個方向往前走,近期內(nèi)會不會撞到墻或障礙?”

方法很簡單,從單位中心以及單位的邊緣,如果是圓形碰撞器,就是對應(yīng)方向間隔半徑的兩條射線(可以再略大一點,留點余裕比較好),沿理想方向發(fā)射三條射線,這樣可以檢測出去往目標的路徑上有沒有能擋住自己這個體積物體的障礙。射線注意只檢測“墻/障礙”所在的 Layer,優(yōu)化性能。如圖:



如果射線前方?jīng)]有命中任何障礙,這一幀就可以直接沿理想方向移動,不需要額外繞路。如果射線撞到了障礙,說明正前方有墻或阻擋,進入“扇形掃描”階段:

第三步:扇形掃描 + 記住繞哪邊——選出“次優(yōu)方向”

當前方被擋住時,單位不會立刻停下,而是在理想方向附近的一個扇形區(qū)域里,嘗試若干個稍微偏左、偏右的方向,這個范圍和精度可配,決定了掃描的精度和性能代價,例如配置了120度范圍,每10度發(fā)一個射線。順序就是從理想方向開始左右擴散來試探,如圖:



每試一個方向,都像第二步一樣用射線檢測前方是否有障礙,一旦找到“前方一段距離內(nèi)都沒有障礙”的那個方向,就把它作為本幀的避障方向。

這里,為避免單位在某些墻角來回左右搖擺,可以給每個單位記錄一個“上次繞障偏向”(例如優(yōu)先偏右),下一次再遇到障礙時,優(yōu)先從這一側(cè)開始掃描,這樣就能避免在墻角附近“一會兒想從左繞、一會兒又改從右繞”,導致方向抖動。

如果扇形范圍內(nèi)所有候選方向都被判定為“前方有障礙”,則進入下一步:

第四步:墻滑動——被擋住時別硬頂,沿墻溜過去

當理想方向被障礙擋住時,可以沿著墻的邊緣走,既然正對著墻走不通,那就沿著墻面切線方向滑過去,只要不是封閉空間,總能走出去。

具體做法:

障礙碰撞檢測時能得到一個法線方向(即墻面朝向單位的那一側(cè))

把當前想走的方向拆解成兩部分:

  1. 垂直墻面的分量(正頂著墻)
  2. 平行墻面的分量(沿著墻滑)

去掉“垂直墻面、撞墻那一部分”,只保留沿墻的方向



效果上看就是:

單位不會呆呆地頂在墻上不動,而是自動“貼著墻邊擦過去”。

第五步:多單位避讓,空間分區(qū)方法

這一步是防止單位間重疊,肯定不能用碰撞器,性能消耗過大,同時也不能直接兩兩檢測距離,那樣的復雜度就是 O(N2),這里就要用到一個比較通用的方法:空間分區(qū)。

空間分區(qū)的核心思路就是把地圖劃分成網(wǎng)格,每個單位每幀通過自己的坐標,加入自身所屬網(wǎng)格,每個網(wǎng)格里的單位,只關(guān)心自身所在格子和附近網(wǎng)格的單位,例如附近八格,如此,每次計算量就大大縮小。然后對過于靠近自己的鄰居,施加一個推開的傾向,可以越近,力度越大。



這一步的結(jié)果是得到一個“分離向量”:它代表“為了不擠到別人,應(yīng)該稍微偏移的方向”。

第六步:方向融合 + 平滑 + 隨機擾動——最終行走方向

到這一步為止,我們手里已經(jīng)有幾種方向信息:

  • 理想前進方向(只考慮目標)
  • 避障/繞墻后的方向(考慮了墻和障礙)
  • 來自鄰居的分離方向(防止擠成一團)

現(xiàn)在要把它們合成一個最終移動方向,并做好“防抖動”處理:

這里可以進行一個加權(quán)處理,權(quán)重更高的是“避障方向”,因為不撞墻是底線?!胺蛛x方向”是其次,讓單位輕微遠離鄰居。兩者合成就是當前的新方向,但是不能直接應(yīng)用,因為和理想前進方向間,會有一個跳變,就會很奇怪地抖動。為了自然,可以記住一個“當前移動方向”,每幀向新的目標方向緩慢靠近,可以用各種插值方法,不贅述。

最后得出一個行走方向后,再給一個小的隨機擾動,來打破一些極端情況下的僵局,例如兩堵墻對稱,單位在其中尬住。

第七步:生效移動

最終方向確定后,真正的移動可以交給物理系統(tǒng),也可以直接賦位置,我們選擇后者,因為更省性能,完全不讓多單位參與unity的物理,都由我們自己計算,也為后面的性能深度優(yōu)化做鋪墊。

三、加入物理影響

整體架構(gòu)

整體思路是用虛擬的力,來統(tǒng)一銜接物理和非物理部分,對于多單位來說,所有的物理效果,都通過抽象的“力場 ForceData”來實現(xiàn)。我們以兩個典型的物理效果,爆炸沖擊波,以及黑洞引力來舉例:

  • 所有爆炸、黑洞等效果,不再直接去改單位,而是統(tǒng)一抽象成力場
  • 場景中所有力場由一個ForceManager集中管理和更新
  • 每個單位自己持有“受力狀態(tài)”(外力速度、是否擊暈等),每幀由 ForceManager 計算它應(yīng)該受到多少外力

這樣一來:

  • 技能/道具只負責“創(chuàng)建某種力場”(比如在某點創(chuàng)建一個爆炸力場)
  • ForceManager 負責“這個力場到底對哪些單位、造成多大力”
  • 單位只需要把“自己的受力結(jié)果”加進最終移動速度即可

架構(gòu)干凈、可擴展,也便于以后加新類型的力如風場、磁場等,力的數(shù)據(jù)結(jié)構(gòu)統(tǒng)一抽象成 ForceData后,也可以為后續(xù)ECS的深度優(yōu)化做準備。

力場 ForceData

ForceData 主要字段包括:

  • 位置:力場中心(如爆炸點、黑洞中心)
  • 類型:爆炸、吸引(黑洞)、定向推力(沖擊波)、漩渦……
  • 半徑:影響范圍
  • 強度:力的基礎(chǔ)大小
  • 持續(xù)時間:是瞬時爆炸還是持續(xù)吸引
  • 時間進度:已經(jīng)過了多久,用來做時間上的衰減
  • 距離衰減指數(shù):力隨距離衰減的曲線(線性、平方等)
  • 是否影響“可控單位”:可以控制某些力只作用于怪物,不影響玩家

單位

而每個單位自己,還會有一份“受力狀態(tài)”:

  • externalVelocity:由外力產(chǎn)生的速度(和自身移動速度區(qū)分開)
  • stunTime:當前剩余的擊暈時間
  • mass:質(zhì)量,用來控制“同樣爆炸,對重單位擊飛更小,對輕單位更大”

力場管理器ForceManager

ForceManager 是整個系統(tǒng)的“中樞”:

  • 內(nèi)部維護一個活動力場列表:所有仍在生效的爆炸、黑洞等等

每幀會做兩件事:

  • 更新所有力場的時間進度,過期的自動移除
  • 提供接口給單位/UnitManager:計算某個單位當前受到的總外力

力場的創(chuàng)建非常簡單:

  • 爆炸:在某點創(chuàng)建一個“爆炸型力場”,半徑 + 強度 + 持續(xù)時間很短
  • 黑洞:在某點創(chuàng)建一個“吸引型力場”,半徑大、持續(xù)時間長

然后計算單位受力時的邏輯,遍歷所有活動力場,對每個力場:

  • 算出單位與力場中心的距離
  • 如果超出半徑 → 這個力場對該單位無效,跳過
  • 在半徑內(nèi) → 按距離衰減、時間衰減計算出當前力的大小
  • 根據(jù)力場類型,決定方向,爆炸就是從中心向外,黑洞就是指向中心
  • 把所有力場對該單位的力向量相加,得到總外力,這樣外力是線性可疊加的,多個爆炸疊在一起會更猛,一個爆炸疊加一個黑洞會產(chǎn)生復雜但可預(yù)期的效果。

拿到 ForceManager 給出的“總外力”之后,單位要做的事只有三步:

步驟一:把力轉(zhuǎn)換成外力速度(擊飛)

  • 力 → 沖量 → 速度變化:力越大、單位越輕,速度變化越大
  • 把這一部分速度寫入 externalVelocity 中
  • 為避免數(shù)值過大,給外力速度設(shè)一個最大值上限(比如 maxExternalSpeed)

步驟二:判斷是否進入擊暈/失控狀態(tài)

  • 擊暈單位不能進行自主移動(不能追玩家、不能執(zhí)行 AI 行走)
  • 只剩下“外力產(chǎn)生的慣性速度”和模擬阻力在起作用
  • 擊暈時間隨著時間減小,到 0 后恢復正??刂?/li>
  • 擊暈狀態(tài)可以防止出現(xiàn)炸飛還在移動的情況,可以讓被動的運動更加自然。

步驟三:外力速度的自然衰減(模擬阻力)

  • 每一幀,都對 externalVelocity 施加一個全局阻力系數(shù)
  • 當外力速度很?。ń?0)時,直接歸零,避免永遠留著一個極小的殘余值

與原有移動 / 避障系統(tǒng)的融合

如果單位處于擊暈狀態(tài),直接用externalVelocity。如果單位處于正常狀態(tài),則根據(jù)之前計算出來的移動速度向量,和externalVelocity進行相加。

四、總結(jié)和性能優(yōu)化

性能優(yōu)化總體有幾個非常通用的思路,不同工程其實差不多。

  1. 通過四叉樹八叉樹等空間分區(qū)方法,讓多單位間的查詢,從 O(N2) 到 O(N)
  2. 通過多線程和數(shù)據(jù)管理來優(yōu)化,unity里可以用DOTS,甚至放GPU去做復雜的并行計算
  3. 分幀,平滑每幀的消耗
  4. LOD思路,重要的單位算細一點,不重要的粗一點,屏幕外看不到的,更粗糙等等
  5. 能近似就近似,復雜運算簡化,例如這個工程里就會用到的距離的平方來判斷距離,減少開方,復雜函數(shù)讀表等等技巧

對于我們上述的基本實現(xiàn),還沒進行任何優(yōu)化,可以支持2000個單位60幀率運行,而且是在編輯器下,這還遠遠沒到我們的要求,通過profiler分析(忘記截圖了),不出所料,最耗性能的是射線檢測部分。那我們先進行一波射線檢測放JobSystem多線程處理的快速優(yōu)化,一通改造代碼,性能提升很明顯,可以做到5000個單位,帶物理效果,100幀左右。最終結(jié)果如下:

到這里,初步驗證方案的可行性已經(jīng)通過,可以給程序去實現(xiàn)了,就不再深入優(yōu)化了,我只是個可憐的小策劃,理論上按我之前經(jīng)驗,全套用ECS實現(xiàn),再加上各種優(yōu)化,最終能支持數(shù)萬個單位同屏,考慮到最后效果復雜之后,縮到幾千個也足夠用了。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
隱私研究員質(zhì)疑微軟Edge免費“VPN”宣傳 更像代理而非真正VPN

隱私研究員質(zhì)疑微軟Edge免費“VPN”宣傳 更像代理而非真正VPN

cnBeta.COM
2026-02-23 14:30:10
一日英超動向:舍什科拉門斯助卡里克1-0勝,曼城阿森納斗到底

一日英超動向:舍什科拉門斯助卡里克1-0勝,曼城阿森納斗到底

夢憶之淺
2026-02-25 03:22:11
巴塞羅那就拉什福德永久轉(zhuǎn)會做出最終決策

巴塞羅那就拉什福德永久轉(zhuǎn)會做出最終決策

本澤體育
2026-02-24 18:19:41
誰懂??!要是我是王藝迪,新加坡大滿貫一打完,

誰懂??!要是我是王藝迪,新加坡大滿貫一打完,

小光侃娛樂
2026-02-24 16:07:06
拉波爾塔再談梅西離隊:無法承受他的薪水,巴薩也為球員付出很多

拉波爾塔再談梅西離隊:無法承受他的薪水,巴薩也為球員付出很多

銜春信
2026-02-25 06:16:19
新加坡大滿貫:2月25日賽程公布,孫穎莎戰(zhàn)老將,向鵬黃友政對決

新加坡大滿貫:2月25日賽程公布,孫穎莎戰(zhàn)老將,向鵬黃友政對決

乒談
2026-02-24 23:12:17
中美南??諔?zhàn):美軍毀了3架戰(zhàn)機,損失慘重,我軍一炮未發(fā)

中美南??諔?zhàn):美軍毀了3架戰(zhàn)機,損失慘重,我軍一炮未發(fā)

大千世界觀
2026-02-23 12:48:29
一個毒梟被擊斃,為啥引爆了一個大國?

一個毒梟被擊斃,為啥引爆了一個大國?

虛聲
2026-02-24 19:58:57
測量319位中國女性外陰,他們發(fā)表全球首例研究

測量319位中國女性外陰,他們發(fā)表全球首例研究

醫(yī)學界
2026-02-18 17:56:22
廣東“新春第一會”,信息量爆棚

廣東“新春第一會”,信息量爆棚

廣東發(fā)布
2026-02-24 18:10:07
梅洛:尤文已發(fā)生了變化,擁有C羅和沒有C羅的尤文是兩支球隊

梅洛:尤文已發(fā)生了變化,擁有C羅和沒有C羅的尤文是兩支球隊

懂球帝
2026-02-24 23:09:06
起效速度是西地那非2倍!全球首款舌下ED藥,千億市場洗牌在即?

起效速度是西地那非2倍!全球首款舌下ED藥,千億市場洗牌在即?

思思夜話
2026-02-23 17:37:21
巴拿馬賭輸了?撕毀白紙黑字后,大國占21.4%貨運量終成致命一擊

巴拿馬賭輸了?撕毀白紙黑字后,大國占21.4%貨運量終成致命一擊

小虎新車推薦員
2026-02-24 20:16:24
海口:發(fā)票抽獎有人違規(guī),將追回獎金

??冢喊l(fā)票抽獎有人違規(guī),將追回獎金

南方都市報
2026-02-24 20:34:37
馬筱梅順利產(chǎn)子!汪小菲喜提三娃,玥兒希箖暖心迎弟引全網(wǎng)熱議

馬筱梅順利產(chǎn)子!汪小菲喜提三娃,玥兒希箖暖心迎弟引全網(wǎng)熱議

清衣渡a
2026-02-25 03:47:07
美籍華人集體破防:當年離開去美國,如今成了回不去的香餑餑

美籍華人集體破防:當年離開去美國,如今成了回不去的香餑餑

生活魔術(shù)專家
2026-02-24 04:37:43
霍伊倫德轉(zhuǎn)會生變?那不勒斯恐達不到激活條件,仍向曼聯(lián)承諾買斷

霍伊倫德轉(zhuǎn)會生變?那不勒斯恐達不到激活條件,仍向曼聯(lián)承諾買斷

羅米的曼聯(lián)博客
2026-02-24 06:02:18
兩性關(guān)系:65-75歲夫妻必看,真正惜命的是守住這7條底線!

兩性關(guān)系:65-75歲夫妻必看,真正惜命的是守住這7條底線!

新時代的兩性情感
2026-02-24 04:05:41
成都蓉城迎來久違的外援回歸,球迷卻高興不起來,直言他早該走了

成都蓉城迎來久違的外援回歸,球迷卻高興不起來,直言他早該走了

張麗說足球
2026-02-24 08:35:42
航天科研人員趙學軍留學被策反,回國后大量搜集核心要害情報提供給境外間諜,央視披露細節(jié):才到國外就被盯上,請吃燒烤增進感情

航天科研人員趙學軍留學被策反,回國后大量搜集核心要害情報提供給境外間諜,央視披露細節(jié):才到國外就被盯上,請吃燒烤增進感情

極目新聞
2026-02-23 15:04:52
2026-02-25 07:27:00
GameRes游資網(wǎng) incentive-icons
GameRes游資網(wǎng)
GameRes游資網(wǎng)
7311文章數(shù) 10463關(guān)注度
往期回顧 全部

游戲要聞

《死亡擱淺2》PC版配置需求公開!最低GTX1660暢玩

頭條要聞

男子摟住繼女強吻動作親密 當?shù)貗D聯(lián)介入

頭條要聞

男子摟住繼女強吻動作親密 當?shù)貗D聯(lián)介入

體育要聞

蘇翊鳴總結(jié)米蘭征程:我仍是那個熱愛單板滑雪的少年

娛樂要聞

汪小菲官宣三胎出生:承諾會照顧好3個孩子

財經(jīng)要聞

縣城消費「限時繁榮」了十天

科技要聞

宇樹科技發(fā)布四足機器人Unitree As2

汽車要聞

入門即滿配 威蘭達AIR版上市 13.78萬元起

態(tài)度原創(chuàng)

數(shù)碼
親子
旅游
公開課
軍事航空

數(shù)碼要聞

《死亡擱淺2》PC版推薦配置RTX 3060可FHD 60幀,Steam國區(qū)298元

親子要聞

坑弟弟,我是一把好手

旅游要聞

海南接待游客數(shù)增長近三成

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

美軍參聯(lián)會主席警告:對伊朗動武可能帶來重大風險

無障礙瀏覽 進入關(guān)懷版