首页 > 其他分享 >Unity DOTS物理引擎的核心分析与详解

Unity DOTS物理引擎的核心分析与详解

时间:2024-01-11 10:34:31浏览次数:25  
标签:DOTS Unity 引擎 Physics public 详解 物理

最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。

Unity.Physics的设计哲学

 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,  包含了物理刚体的迭代计算与碰撞检测等查询。Unity.Physics的设计理念与PhyX和Havok有所不同,它们追求的是全特性的物理模拟,而Unity.Physics追求的是最常用的一些物理机制的实现,相比传统的物理引擎,它实现的是物理引擎的核心子集,这样导致比传统的物理引擎实现起来更简单与高效,同时能满足大部分的需求。

  传统的物理引擎在迭代计算的时候为了保证物理引擎计算结果的稳定性,缓存了很多的状态,这样就给整个系统设计增加了复杂度与开销。比如传统物理引擎还考虑到了网络游戏的情况下,你整个物理引擎的回滚与向前迭代计算。Unity.Physics就丢弃掉了这些,使得更容易控制和更高效。Unity.Physics物理引擎的迭代与计算都是基于Job与ECS机制的,由于没有cache计算中的物理状态,导致它的性能会比传统的物理引擎在某些方面性能要好。Unity.Physics的里面的物理参数与数据描述与传统的Havok物理引擎兼容,这样如果我们的项目中要追求物理引擎的全面性与稳定性,我们可以很容易的使用Havok等商业的物理引擎。在Unity DOTS里面,如果你获得了物理引擎Havok的授权,你可以直接在Unity DOTS中使用Havok物理引擎。

 Unity.Physics的源码目录结构如下:

Base: 包含了Unity.Pysics物理引擎使用的基本数据容器与数学计算;

Collistion: 包含了所有的碰撞检测与空间检测的算法代码;

DFG:包含了DataFlowGraph数据,在碰撞世界里面执行碰撞与设想检测;

Dynamics:包含了所有的物理引擎的运动计算,约束计算,迭代计算;

ECS: 包含了将ECS的组件数据导入,导出到Unity.Physics引擎中;

Extensions: 包含了一些工具性质的代码,扩展的一些组件,调试工具等;

 

 

 

Unity.Physics的物理引擎的全局设置

   要对Unity DOTS的物理引擎做全局设置,我们可以给DOTS里面的SubScene添加一个”PhysicsStep”的组件实例。如下图所示:

 

 

 

Simulation Type: 下拉选项包含Unity Physics, Havok Physics, None,你可以来选择物理引擎的内核,如果你获得了Havok的商业授权,你就可以看到Havok Physics的选项。

Gravity: 设置整个物理世界的张力加速度;

Solver Iteration Count: 设置每次迭代计算的次数,次数越大,计算结果越精确稳定,但是也消耗更多的性能;

Multi Threaded: 是否基于多线程来进行迭代物理计算,如果勾选上,物理引擎会使用较多的线程来进行迭代计算,否则就使用少量的线程来迭代计算。

Unity DOTS 物理引擎简单的案例

接下来利用Unity DOTS来实现一个简单的物理引擎的案例,编写一个脚本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场景,创作3个物体,一个地面(Cube),一个球体(Sphere),一个立方体节点(Target)。在球体上挂TargetAuthoring与MoveBodyAuthoring两个组件,并设置MoveBodyAuthoring的Velocity与MaxDistance为1与5,设置TargetAuthoring组件的的TargetGameObject为Target节点对象。

 

 

 

 

运行,效果如下:

 

 

 

 

 

今天的分享就到这里

标签:DOTS,Unity,引擎,Physics,public,详解,物理
From: https://www.cnblogs.com/rainy1unity/p/17958011

相关文章

  • Unity3D 最后一次drawcall 如何避免详解
    Unity3D是一款广泛使用的游戏开发引擎,它基于C#编程语言,可以实现跨平台的游戏开发。在Unity3D中,drawcall是一个非常重要的概念,它指的是渲染引擎每次渲染物体时所调用的函数。过多的drawcall会导致游戏性能下降,因此我们需要采取一些措施来避免过多的drawcall。对啦!这里有个游戏开发......
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • 【愚公系列】2024年01月 WPF控件专题 ListBox控件详解
    ......
  • 详解GaussDB(DWS)通信安全的小妙招:连接认证机制
    本文分享自华为云社区《GaussDB(DWS)数据库安全系列之通信安全》,作者:yd_262982826。1.前言网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,为了确保通信双方身份的真实性和通信内容的私密性,防止非法......
  • MyBatis实战指南(二):工作原理与基础使用详解
    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。那么,它是如何工作的呢?又如何进行基础的使用呢?本文将带你了解MyBatis的工作原理及基础使用。一、MyBatis的工作原理1.1MyBatis的工作原理工作原理图示:1、读取MyBatis配置文件mybatis-config.xml为MyBat......
  • 美国服务器配置参数详解:了解其硬件及规格
    ​美国服务器提供的配置规格范围广泛。现成型号具有不同的存储容量、存储技术(例如HDD、SSD)、内存大小、CPU、内核和带宽速度。选择错误的规格可能意味着您的服务器无法完成您想要的任务,或者您最终会为一台比您需要的功能更强大的机器付出太多代价。因此,在寻找美国服务器前,建......
  • MyBatis实战指南(二):工作原理与基础使用详解
    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。那么,它是如何工作的呢?又如何进行基础的使用呢?本文将带你了解MyBatis的工作原理及基础使用。一、MyBatis的工作原理1.1MyBatis的工作原理工作原理图示:1、读取MyBatis配置文件mybatis-config.xml为MyBa......
  • 腾讯大牛深入浅出详解云原生
    腾讯大牛深入浅出详解云原生 本文介绍目前业界非常火热的“云原生(CloudNative)”相关知识结构,包括微服务、DevOps、持续交付、服务网格、Serverless等相关知识点。“云原生”通过提供一套完整的技术体系和方法论来指导我们在云环境下,在系统功能越来越复杂的情况下,还能够做到敏......
  • 支付宝小程序备案流程详解(必看!)
    为什么要小程序备案2023年8月4日,工信部发布了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》,为了落实《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》等法律法规要求,在中华人民共和国境内从事互......
  • 中间件 ZK分布式专题与Dubbo微服务入门 4-8 权限acl详解,acl的构成-scheme与id
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12704 1重点关注1.1权限的构成权限字符串缩写crdwaCREATE:创建子节点READ:获取节点/子节点WRITE:设置节点数据 DELETE:删除子节点ADMIN:设置权限  2课程内容  ......