最近DOTS發(fā)布了正式的版本,同時(shí)基于DOTS的理念實(shí)現(xiàn)了一套高性能的物理引擎,今天我們來給大家分享和介紹一下這個(gè)物理引擎的使用。
Unity.Physics的設(shè)計(jì)哲學(xué)
Unity.Physics是基于DOTS設(shè)計(jì)思想的一個(gè)高性能C#物理引擎的實(shí)現(xiàn), ?包含了物理剛體的迭代計(jì)算與碰撞檢測等查詢。Unity.Physics的設(shè)計(jì)理念與PhyX和Havok有所不同,它們追求的是全特性的物理模擬,而Unity.Physics追求的是最常用的一些物理機(jī)制的實(shí)現(xiàn),相比傳統(tǒng)的物理引擎,它實(shí)現(xiàn)的是物理引擎的核心子集,這樣導(dǎo)致比傳統(tǒng)的物理引擎實(shí)現(xiàn)起來更簡單與高效,同時(shí)能滿足大部分的需求。
?傳統(tǒng)的物理引擎在迭代計(jì)算的時(shí)候?yàn)榱吮WC物理引擎計(jì)算結(jié)果的穩(wěn)定性,緩存了很多的狀態(tài),這樣就給整個(gè)系統(tǒng)設(shè)計(jì)增加了復(fù)雜度與開銷。比如傳統(tǒng)物理引擎還考慮到了網(wǎng)絡(luò)游戲的情況下,你整個(gè)物理引擎的回滾與向前迭代計(jì)算。Unity.Physics就丟棄掉了這些,使得更容易控制和更高效。Unity.Physics物理引擎的迭代與計(jì)算都是基于Job與ECS機(jī)制的,由于沒有cache計(jì)算中的物理狀態(tài),導(dǎo)致它的性能會(huì)比傳統(tǒng)的物理引擎在某些方面性能要好。Unity.Physics的里面的物理參數(shù)與數(shù)據(jù)描述與傳統(tǒng)的Havok物理引擎兼容,這樣如果我們的項(xiàng)目中要追求物理引擎的全面性與穩(wěn)定性,我們可以很容易的使用Havok等商業(yè)的物理引擎。在Unity DOTS里面,如果你獲得了物理引擎Havok的授權(quán),你可以直接在Unity DOTS中使用Havok物理引擎。
Unity.Physics的源碼目錄結(jié)構(gòu)如下:
Base: 包含了Unity.Pysics物理引擎使用的基本數(shù)據(jù)容器與數(shù)學(xué)計(jì)算;
Collistion: 包含了所有的碰撞檢測與空間檢測的算法代碼;
DFG:包含了DataFlowGraph數(shù)據(jù),在碰撞世界里面執(zhí)行碰撞與設(shè)想檢測;
Dynamics:包含了所有的物理引擎的運(yùn)動(dòng)計(jì)算,約束計(jì)算,迭代計(jì)算;
ECS: 包含了將ECS的組件數(shù)據(jù)導(dǎo)入,導(dǎo)出到Unity.Physics引擎中;
Extensions: 包含了一些工具性質(zhì)的代碼,擴(kuò)展的一些組件,調(diào)試工具等;
Unity.Physics的物理引擎的全局設(shè)置
要對(duì)Unity DOTS的物理引擎做全局設(shè)置,我們可以給DOTS里面的SubScene添加一個(gè)”PhysicsStep”的組件實(shí)例。如下圖所示:
Simulation Type: 下拉選項(xiàng)包含Unity Physics, Havok Physics, None,你可以來選擇物理引擎的內(nèi)核,如果你獲得了Havok的商業(yè)授權(quán),你就可以看到Havok Physics的選項(xiàng)。
Gravity: 設(shè)置整個(gè)物理世界的張力加速度;
Solver Iteration Count: 設(shè)置每次迭代計(jì)算的次數(shù),次數(shù)越大,計(jì)算結(jié)果越精確穩(wěn)定,但是也消耗更多的性能;
Multi Threaded: 是否基于多線程來進(jìn)行迭代物理計(jì)算,如果勾選上,物理引擎會(huì)使用較多的線程來進(jìn)行迭代計(jì)算,否則就使用少量的線程來迭代計(jì)算。
Unity DOTS?物理引擎簡單的案例
接下來利用Unity DOTS來實(shí)現(xiàn)一個(gè)簡單的物理引擎的案例,編寫一個(gè)腳本TargetAuthoring.cs, 代碼如下:
using Unity.Entities;
using UnityEngine;
public struct Target : IComponentData
{
public Entity TargetEntity;
public float MaxDistance;
}
public class TargetAuthoring : MonoBehaviour
{
public GameObject TargetGameObject;
public float MaxDistance;
}
public class TargetAuthoringBaker : Baker<TargetAuthoring>
{
public override void Bake(TargetAuthoring authoring)
{
var component = new Target
{
MaxDistance = authoring.MaxDistance,
TargetEntity = GetEntity(authoring.TargetGameObject)
};
AddComponent(component);
}
}
再新建一個(gè)MovingBodyAuthoring.cs的文件,代碼如下:
using Unity.Entities;
using Unity.Mathematics;
using Unity.Physics;
using Unity.Transforms;
using UnityEngine;
public struct MovingBody : IComponentData
{
public float Velocity;
}
public class MovingBodyAuthoring : MonoBehaviour
{
public float Velocity;
}
class MovingBodyAuthoringBaker : Baker<MovingBodyAuthoring>
{
public override void Bake(MovingBodyAuthoring authoring)
{
var component = new MovingBody
{
Velocity = authoring.Velocity
};
AddComponent(component);
}
}
public partial struct MovingBodySystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
foreach (var(target, transform, moving, velocity) in SystemAPI.Query<RefRO<Target>, RefRO<LocalTransform>, RefRW<MovingBody>, RefRW<PhysicsVelocity>>().WithAll<MovingBody>())
{
var targetPosition = SystemAPI.GetComponent<LocalTransform>(target.ValueRO.TargetEntity).Position;
var direction = math.normalize(targetPosition - transform.ValueRO.Position);
if (math.distance(targetPosition, transform.ValueRO.Position) < target.ValueRO.MaxDistance)
velocity.ValueRW.Linear = moving.ValueRO.Velocity * direction;
else
velocity.ValueRW.Linear = new float3(0, 0, 0);
}
}
}
打開SubScene場景,創(chuàng)作3個(gè)物體,一個(gè)地面(Cube),一個(gè)球體(Sphere),一個(gè)立方體節(jié)點(diǎn)(Target)。在球體上掛TargetAuthoring與MoveBodyAuthoring兩個(gè)組件,并設(shè)置MoveBodyAuthoring的Velocity與MaxDistance為1與5,設(shè)置TargetAuthoring組件的的TargetGameObject為Target節(jié)點(diǎn)對(duì)象。如圖所示:
Baker完成后得到Entity,如圖所示:
運(yùn)行效果如下:
今天的分享就到這里,需要本篇文章完整的工具與源碼的同學(xué)可以點(diǎn)擊"閱讀全文"
鏈接:https://pan.baidu.com/s/1A3QaHpXYDXqVSJKaoZwcPQ?pwd=w741文章來源:http://www.zghlxwxcb.cn/news/detail-841320.html
提取碼:w741文章來源地址http://www.zghlxwxcb.cn/news/detail-841320.html
到了這里,關(guān)于DOTS Unity.Physics物理引擎的核心分析與詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!