国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DOTS Unity.Physics物理引擎碰撞事件處理

這篇具有很好參考價(jià)值的文章主要介紹了DOTS Unity.Physics物理引擎碰撞事件處理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

最近DOTS發(fā)布了正式的版本,同時(shí)基于DOTS的理念實(shí)現(xiàn)了一套高性能的物理引擎,今天我們給大家分享和介紹一下這個(gè)物理引擎的碰撞事件處理以及核心相關(guān)概念。

Unity.Physics物理引擎的主要流程與Pipeline

?Unity.Physics物理引擎做仿真迭代計(jì)算的時(shí)候主要通過(guò)以下步驟來(lái)執(zhí)行:

???step1: 從entity里面的ECS組件中獲取我們當(dāng)前的物體的狀態(tài)數(shù)據(jù);

???step2: 做粗略的broadphase計(jì)算階段,遍歷物理世界里面所有的body, 通過(guò)AABB包圍計(jì)算,來(lái)快速的判斷哪些物體,可能相交;粗略計(jì)算,把不會(huì)相交的排除掉, 不會(huì)相交的就不會(huì)改變運(yùn)動(dòng)狀態(tài);

???step3: narrowphase階段: 把可能相交的物體,做進(jìn)一步的精確的計(jì)算;根據(jù)他們的物理形狀,計(jì)算出來(lái)準(zhǔn)確的碰撞點(diǎn)與相關(guān)的碰撞信息;

???step4: 基于這些碰撞信息, 我們的物理引擎會(huì)計(jì)算具體的碰撞信息,關(guān)節(jié),摩檫力,阻力等計(jì)算, 結(jié)合物理的原理,計(jì)算出來(lái)我們的物理剛體的速度,角速度等運(yùn)動(dòng)狀態(tài)。

???Step5: 根據(jù)基于全新的運(yùn)動(dòng)狀態(tài),把所有運(yùn)動(dòng)的物體,向前迭代計(jì)算(線性速度,角速度,摩擦力等),計(jì)算出這幀新的剛體的位置等信息;

???Step6: Unity Physic 通過(guò) ExportPhysicsWorld System 把物理剛體的位置速度等,同步給節(jié)點(diǎn)Entity的LocalTransform組件與PhysicVelocity等組件,這樣渲染的entity,就會(huì)跟著物理引擎的剛體同步移動(dòng);

??DOTS中基于System與SystemGroup 樹(shù)行結(jié)構(gòu)來(lái)決定DOTS中的迭代順序,這個(gè)是DOTS中很重要的一個(gè)概念。Unity Physics將上面步驟與邏輯基于ECS設(shè)計(jì)思想,分別設(shè)計(jì)了相關(guān)的System與System Group,結(jié)構(gòu)如下:

-->FixedStepSimulationSystemGroup:

?-->PhysicsSystemGroup

??????-->PhysicsInitializeGroup(System Group)

??????-->PhysicsSimulationGroup(SystemGroup)

??????????-->PhysicsCreateBodyPairsGroup

??????????-->PhysicsCreateContactsGroup

??????????-->PhysicsCreateJacobiansGroup

??????????-->PhysicsSolveAndIntegrateGroup

??????-->System: ExportPhysicsWorld

所有物理引擎的迭代計(jì)算都是基于FixedStepSimulationSystemGroup,即按照固定的時(shí)間間隔來(lái)迭代物理仿真,保持物理引擎的一致性與穩(wěn)定性。所有的物理引擎的仿真計(jì)算都放在PysicsSystemGroup下。PysicsSystemGroup包含PhysicsInitializeGroup?,PhysicsSimulationGroup 與一個(gè)ExportPhysicsWorld?System。上面提到的Step1,在PhysicsInitializeGroup階段完成, step2~step5在PhysicsSimulationGroup中完成,?PhysicsSimulationGroup完成后物理引擎的一幀的迭代計(jì)算完成,最后通過(guò)ExportPhysicsWorld的System把把物理引擎的內(nèi)部數(shù)據(jù)同步到Entity的PhysicsVelocity, LocalTransform等ECS組件。在PhysicsSimulationGroup又有4個(gè)subgroup,他們分別對(duì)應(yīng)step2~step5的執(zhí)行步驟。

Unity Physics碰撞檢測(cè)事件處理

當(dāng)PhysicsSimulationGroup的分組執(zhí)行完成以后,就完成了整個(gè)物理引擎的仿真與迭代計(jì)算。仿真過(guò)程中會(huì)產(chǎn)生一個(gè)PhysicsWorld,物理世界里面的所有的剛體等相關(guān)物理數(shù)據(jù)(位置,速度等)都可以通過(guò)PhysicsWorld得到,最后還被導(dǎo)出到Entity的ECS組件里面。在物理仿真中所有的事件都會(huì)被保存到Simulation對(duì)象中,這些事件包括了我們常見(jiàn)的碰撞事件與觸發(fā)器事件。傳統(tǒng)模式下我們是通過(guò)回調(diào)函數(shù)來(lái)處理的,DOTS模式下我們是在一個(gè)System環(huán)節(jié)內(nèi)統(tǒng)一來(lái)處理這些事件。物理引擎的碰撞與觸發(fā)事件處理流程如下:

??Step1: 編寫(xiě)一個(gè)System處理邏輯,來(lái)處理物理事件;

??Step2: 指定好System執(zhí)行的時(shí)機(jī),一定要在PhysicsSimulationGroup之前或者之后,這樣才能拿到碰撞事件的數(shù)據(jù);

??Step3: 通過(guò)編寫(xiě)Job,來(lái)遍歷當(dāng)前所有發(fā)生的碰撞事件,然后編寫(xiě)每個(gè)碰撞事件的處理邏輯;

??Step4: 獲取存儲(chǔ)事件的Simulation單例,傳遞給job來(lái)進(jìn)行具體執(zhí)行;

碰撞事件的處理:

??當(dāng)所有的模擬迭代計(jì)算完成后,會(huì)把過(guò)程中的所有碰撞事件對(duì)存放到Simulation對(duì)象中,我們可以通過(guò)(SystemBase|SystemAPI|EntityQuery).GetSingleton<SimulationSingleton>().AsSimulation()獲取Simulation對(duì)象。

要處理所有的碰撞事件,我們先編寫(xiě)一個(gè)System用來(lái)編寫(xiě)事件處理邏輯,然后編寫(xiě)一個(gè)Job,繼承自IcollisionEventsJob,這樣就可以在Job中遍歷所有的碰撞事件,每個(gè)碰撞事件都調(diào)用Job的Execute函數(shù),在它里面來(lái)處理每個(gè)碰撞事件的邏輯。代碼如下:

[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]

[UpdateBefore(typeof(PhysicsSimulationGroup))] // We are updating before `PhysicsSimulationGroup` - this means that we will get the events of the previous frame

public?partial?struct?GetNumCollisionEventsSystem : ISystem

{

????[BurstCompile]

????public?partial?struct?CountNumCollisionEvents : ICollisionEventsJob

????{

????????public?NativeReference<int> NumCollisionEvents;

????????public?void?Execute(CollisionEvent collisionEvent)

????????{

????????????NumCollisionEvents.Value++;

????????}

????}

????[BurstCompile]

????public?void?OnUpdate(ref?SystemState state)

????{

????????NativeReference<int> numCollisionEvents = new?NativeReference<int>(0, Allocator.TempJob);

????????

????????state.Dependency = new?CountNumCollisionEvents

????????{

????????????NumCollisionEvents = numCollisionEvents

????????}.Schedule(SystemAPI.GetSingleton<SimulationSingleton>());

????????// ...

????}

}

觸發(fā)器事件TriggerEvent處理:

??觸發(fā)器事件與碰撞事件類(lèi)似,我們只要編寫(xiě)一個(gè)ItriggerEventsJob就可以遍歷當(dāng)前所有的觸發(fā)器事件了,代碼如下:

[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]

[UpdateAfter(typeof(PhysicsSimulationGroup))] // We are updating after `PhysicsSimulationGroup` - this means that we will get the events of the current frame.

public?partial?struct?GetNumTriggerEventsSystem : ISystem

{

????[BurstCompile]

????public?partial?struct?CountNumTriggerEvents : ITriggerEventsJob

????{

????????public?NativeReference<int> NumTriggerEvents;

????????public?void?Execute(TriggerEvent collisionEvent)

????????{

????????????NumTriggerEvents.Value++;

????????}

????}

????[BurstCompile]

????public?void?OnUpdate(ref?SystemState state)

????{

????????NativeReference<int> numTriggerEvents = new?NativeReference<int>(0, Allocator.TempJob);

????????

????????state.Dependency = new?CountNumTriggerEvents

????????{

????????????NumTriggerEvents = numTriggerEvents

????????}.Schedule(SystemAPI.GetSingleton<SimulationSingleton>());

????????// ...

????}

}

今天的分享就到這里,文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-800126.html

到了這里,關(guān)于DOTS Unity.Physics物理引擎碰撞事件處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity --- 物理引擎 --- 觸發(fā)器 與 碰撞器詳解

    Unity --- 物理引擎 --- 觸發(fā)器 與 碰撞器詳解

    對(duì)第一個(gè)條件進(jìn)行補(bǔ)充 --- 不僅要兩者都具有碰撞組件,同時(shí)還需要兩者的碰撞組件中都沒(méi)有勾選 Is Trigger屬性 ?1.上一篇文章中說(shuō)了那么多,其實(shí)也可以總結(jié)為兩個(gè)碰撞條件 --- a.兩個(gè)游戲物體都具有碰撞器組件 ,如果沒(méi)有的話,連碰撞檢測(cè)都不會(huì)發(fā)生,也就沒(méi)有所謂的碰不

    2024年02月07日
    瀏覽(27)
  • Unity --- 物理引擎 ---- 剛體RigidBody 與 碰撞器 collider

    Unity --- 物理引擎 ---- 剛體RigidBody 與 碰撞器 collider

    ? 1.RigidBody(剛體)的作用是讓物體具有物理特性(比如說(shuō)重力,摩檫力等等) 2.如果想讓物體能夠與其它物體發(fā)生碰撞的話,我們還需要一個(gè)組件 --- Colider碰撞器組件 1.上圖就是Unity中提供的已經(jīng)準(zhǔn)備好的各種形狀的碰撞器組件 2.形成不同形狀的碰撞器所需的面數(shù)不同,面數(shù)

    2024年02月16日
    瀏覽(23)
  • unity物理碰撞操作方案

    unity物理碰撞操作方案

    經(jīng)unity官方網(wǎng)站資料改寫(xiě)整理書(shū)寫(xiě)本博客,原網(wǎng)址方案鏈接如下: Lesson 2.4 - Collision Decisions - Unity Learn 首先? 1.先創(chuàng)建兩個(gè)物體 ?然后? ?2.給這兩個(gè)物體加上Box Collider 組件,并勾選“是觸發(fā)器”(英文:is 啥啥的) 注意兩個(gè)都要添加這組件,并且進(jìn)行相同的操作,都要勾選“

    2024年02月08日
    瀏覽(16)
  • Unity常用方法--Physics2D.OverlapCircleAll(獲取一個(gè)圓形區(qū)域內(nèi)所有碰撞器的列表)

    使用方式請(qǐng)直接看參考文獻(xiàn) 使用案例 可以通過(guò)該方法判斷在攻擊范圍內(nèi)是否存在敵人,并在存在時(shí),調(diào)用敵人組件的內(nèi)部函數(shù) 代碼 參考文獻(xiàn) ??https://docs.unity3d.com/cn/current/ScriptReference/Physics2D.OverlapCircleAll.html

    2024年04月10日
    瀏覽(24)
  • Unity入門(mén)7——物理系統(tǒng)之碰撞檢測(cè)

    Unity入門(mén)7——物理系統(tǒng)之碰撞檢測(cè)

    一、剛體 Rigid Body ? 剛體利用體積(碰撞器 Collider)進(jìn)行碰撞計(jì)算,模擬真實(shí)的碰撞效果,產(chǎn)生力的作用 ? 碰撞產(chǎn)生的必要條件: 兩個(gè)物體都有碰撞器 Collider 至少一個(gè)物體有剛體 Mass:質(zhì)量 默認(rèn)為千克,質(zhì)量越大慣性越大 Drag:空氣阻力 根據(jù)力移動(dòng)對(duì)象時(shí)影響空氣阻力大

    2024年02月09日
    瀏覽(23)
  • Unity UGUI的Physics2DRaycaster (2D物理射線檢測(cè))組件的介紹及使用

    Physics2DRaycaster是Unity中的一個(gè)UGUI組件,用于在2D場(chǎng)景中進(jìn)行物理射線檢測(cè)。它可以檢測(cè)鼠標(biāo)或觸摸事件在UI元素上的碰撞,并將事件傳遞給相應(yīng)的UI元素。 Physics2DRaycaster通過(guò)發(fā)射一條射線來(lái)檢測(cè)UI元素的碰撞。當(dāng)射線與UI元素相交時(shí),Physics2DRaycaster會(huì)將事件傳遞給相應(yīng)的UI元素,

    2024年02月15日
    瀏覽(20)
  • 2022-04-20 Unity入門(mén)7——物理系統(tǒng)之碰撞檢測(cè)

    2022-04-20 Unity入門(mén)7——物理系統(tǒng)之碰撞檢測(cè)

    一、剛體 Rigid Body ? 剛體利用體積(碰撞器 Collider)進(jìn)行碰撞計(jì)算,模擬真實(shí)的碰撞效果,產(chǎn)生力的作用 ? 碰撞產(chǎn)生的必要條件: 兩個(gè)物體都有碰撞器 Collider 至少一個(gè)物體有剛體 Mass:質(zhì)量 默認(rèn)為千克,質(zhì)量越大慣性越大 Drag:空氣阻力 根據(jù)力移動(dòng)對(duì)象時(shí)影響空氣阻力大

    2023年04月09日
    瀏覽(29)
  • Unity 2D點(diǎn)擊事件、碰撞

    1.事件封裝 定義腳本,實(shí)現(xiàn)事件相關(guān)接口即可 2.點(diǎn)擊對(duì)象必須要添加BoxCollider2D腳本 3.攝像機(jī)上必須添加Physics2DRaycaster腳本 4.GameInputEvent2D 事件必須添加在掛載Physics2DRaycaster的對(duì)象及其父類(lèi)身上。 5.如果要有碰撞或者觸發(fā)器回調(diào),碰撞其中之一要添加Rigidbody2D腳本,且不能設(shè)置

    2024年02月09日
    瀏覽(25)
  • 【Unity】 基礎(chǔ)交互入門(mén)(碰撞交互事件OnTriggerEnter和OnCollisionEnter)

    【Unity】 基礎(chǔ)交互入門(mén)(碰撞交互事件OnTriggerEnter和OnCollisionEnter)

    1、在場(chǎng)景中添加兩個(gè)幾何體(例如Cube和Sphere) 2、添加Rigidbody(剛體)component 點(diǎn)擊Cube(正方體)對(duì)象,在面板找到這個(gè)按鈕,添加component 搜索Rigidbody 默認(rèn)狀態(tài)下collider(碰撞)是被開(kāi)啟的。 3、創(chuàng)建C#腳本,增加OnTriggerEnter事件 4、將shpere(球體)設(shè)置為觸發(fā)器,不需要添加

    2024年02月09日
    瀏覽(24)
  • Unity基礎(chǔ)課程之物理引擎6-關(guān)于物理材質(zhì)的使用和理解

    Unity基礎(chǔ)課程之物理引擎6-關(guān)于物理材質(zhì)的使用和理解

    ?每個(gè)物體都有著不同的摩擦力。光滑的冰面摩擦力很小,而地毯表面的摩擦力則很大。另外每種材料也有著不同的彈性,橡皮表面的彈性大,硬質(zhì)地面的彈性小。在Unity中這些現(xiàn)象都符合日常的理念。雖然從原理上講,物體的摩擦力和彈性有著更復(fù)雜的內(nèi)涵,例如普通的鋼板

    2024年02月07日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包