最近DOTS發(fā)布了正式的版本,同時基于DOTS的理念實現(xiàn)了一套高性能的物理引擎,今天我們來給大家分享和介紹一下這個物理引擎的使用。
Unity.Physics的設(shè)計哲學(xué)
Unity.Physics是基于DOTS設(shè)計思想的一個高性能C#物理引擎的實現(xiàn), 包含了物理剛體的迭代計算與碰撞檢測等查詢。Unity.Physics的設(shè)計理念與PhyX和Havok有所不同,它們追求的是全特性的物理模擬,而Unity.Physics追求的是最常用的一些物理機制的實現(xiàn),相比傳統(tǒng)的物理引擎,它實現(xiàn)的是物理引擎的核心子集,這樣導(dǎo)致比傳統(tǒng)的物理引擎實現(xiàn)起來更簡單與高效,同時能滿足大部分的需求。
傳統(tǒng)的物理引擎在迭代計算的時候為了保證物理引擎計算結(jié)果的穩(wěn)定性,緩存了很多的狀態(tài),這樣就給整個系統(tǒng)設(shè)計增加了復(fù)雜度與開銷。比如傳統(tǒng)物理引擎還考慮到了網(wǎng)絡(luò)游戲的情況下,你整個物理引擎的回滾與向前迭代計算。Unity.Physics就丟棄掉了這些,使得更容易控制和更高效。Unity.Physics物理引擎的迭代與計算都是基于Job與ECS機制的,由于沒有cache計算中的物理狀態(tài),導(dǎo)致它的性能會比傳統(tǒng)的物理引擎在某些方面性能要好。Unity.Physics的里面的物理參數(shù)與數(shù)據(jù)描述與傳統(tǒng)的Havok物理引擎兼容,這樣如果我們的項目中要追求物理引擎的全面性與穩(wěn)定性,我們可以很容易的使用Havok等商業(yè)的物理引擎。在Unity DOTS里面,如果你獲得了物理引擎Havok的授權(quán),你可以直接在Unity DOTS中使用Havok物理引擎。
對啦!這里有個游戲開發(fā)交流小組里面聚集了一幫熱愛學(xué)習(xí)游戲的零基礎(chǔ)小白,也有一些正在從事游戲開發(fā)的技術(shù)大佬,歡迎你來交流學(xué)習(xí)。
Unity.Physics的源碼目錄結(jié)構(gòu)如下:
Base: 包含了Unity.Pysics物理引擎使用的基本數(shù)據(jù)容器與數(shù)學(xué)計算;
Unity.Physics的物理引擎的全局設(shè)置
要對Unity DOTS的物理引擎做全局設(shè)置,我們可以給DOTS里面的SubScene添加一個”PhysicsStep”的組件實例。如下圖所示:
Simulation Type: 下拉選項包含Unity Physics, Havok Physics, None,你可以來選擇物理引擎的內(nèi)核,如果你獲得了Havok的商業(yè)授權(quán),你就可以看到Havok Physics的選項。
Gravity: 設(shè)置整個物理世界的張力加速度;
Solver Iteration Count: 設(shè)置每次迭代計算的次數(shù),次數(shù)越大,計算結(jié)果越精確穩(wěn)定,但是也消耗更多的性能;
Multi Threaded: 是否基于多線程來進行迭代物理計算,如果勾選上,物理引擎會使用較多的線程來進行迭代計算,否則就使用少量的線程來迭代計算。
Unity DOTS 物理引擎簡單的案例
接下來利用Unity DOTS來實現(xiàn)一個簡單的物理引擎的案例,編寫一個腳本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);
}
}
再新建一個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個物體,一個地面(Cube),一個球體(Sphere),一個立方體節(jié)點(Target)。在球體上掛TargetAuthoring與MoveBodyAuthoring兩個組件,并設(shè)置MoveBodyAuthoring的Velocity與MaxDistance為1與5,設(shè)置TargetAuthoring組件的的TargetGameObject為Target節(jié)點對象。
運行,效果如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-794689.html
今天的分享就到這里,需要本篇文章完整的項目工具與源碼的同學(xué)可以關(guān)注我們文章來源地址http://www.zghlxwxcb.cn/news/detail-794689.html
到了這里,關(guān)于Unity DOTS物理引擎的核心分析與詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!