首页 > 其他分享 >creator 3.x 2D 物理引擎 基础使用

creator 3.x 2D 物理引擎 基础使用

时间:2023-08-08 18:11:08浏览次数:38  
标签:creator Collider2D 碰撞 2D 引擎 组件 物理 刚体

首先, 本文基于 V3.5 , 官方文档在这里: https://docs.cocos.com/creator/3.5/manual/zh/physics/

一.
明确 2D 物理引擎, 和 3D 物理引擎 在接口上有点区别, 实际区别我也不清楚在哪里, 官方文档也没说.
比如:

启用物理引擎
PhysicsSystem2D.instance.enable = true;

3D 的叫 
PhysicsSystem.instance.enable = true;

比如:
刚体 3D 的叫 Rigidbody, 2D 的叫  Rigidbody2D
碰撞体 3D 的叫 BoxCollider, 2D 的叫 BoxCollider2D

一开始比较懵逼.

开启 调试, 会画出 物理世界中的刚体 或 碰撞体.

PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.All;

/*
    export enum EPhysics2DDrawFlags {
      None = 0,
      Shape = 1,
      Joint = 2,
      Aabb = 4,
      Pair = 8,
      CenterOfMass = 16,
      Particle = 32,
      Controller = 64,
      All = 63
    }
*/

二. 刚体想象成一个你不能看到(绘制)也不能摸到(碰撞)的且不能变形的物体。 Rigidbody2D 即可以添加 2D 刚体组件。
由于 Builtin 2D 物理系统只带有碰撞检测的功能,所以刚体对于 Builtin 2D 物理系统是不生效的,本篇设置只对 Box 2D 物理系统产生作用。
基本属性:

属性 说明
Group 刚体的分组。通过 碰撞矩阵 可设置不同分组间碰撞的可能性
EnabledContactListener 开启监听碰撞回调
Bullet 这个刚体是否是一个快速移动的刚体,并且需要禁止穿过其他快速移动的刚体, 请参考 Rigidbody2D API 获取更多信息
Type 刚体类型,详情请参考下方 刚体类型
AlllowSleep 是否允许刚体休眠, 物理配置 中可调整休眠的临界值
GravityScale 重力缩放比例, 仅对 Dynamic 类型的刚体生效
LinearDamping 移动速度衰减系数
AngularDamping 旋转速度衰减系数
LinearVelocity 移动速度, 仅对 Dynamic 和 Kinematic 类型的刚体生效
AngularVelocity 旋转速度, 仅对 Dynamic 和 Kinematic 类型的刚体生效
FixedRotation 是否固定旋转
AwakeOnLoad 加载完成后立刻唤醒刚体
AngularVelocity 旋转速度, 仅对 Dynamic 和 Kinematic 类型的刚体生效
FixedRotation 是否固定旋转
AwakeOnLoad 加载完成后立刻唤醒刚体
  // 获取移动速度
  const velocity = rigidbody.linearVelocity;
  // 获取旋转速度
  const velocity = rigidbody.angularVelocity;
  // 获取旋转速度衰减系数
  const damping = rigidbody.angularDamping;

刚体类型 说明

刚体类型 说明
Static 静态刚体,零质量,零速度,即不会受到重力或速度影响,但是可以设置他的位置来进行移动。该类型通常用于制作场景
Dynamic 动态刚体,有质量,可以设置速度,会受到重力影响。 唯一可以通过 applyForce 和 applyTorque 等方法改版受力的刚体类型
Kinematic 运动刚体,零质量,可以设置速度,不会受到重力的影响,但是可以设置速度来进行移动
Animated 动画刚体,在上面已经提到过,从 Kinematic 衍生的类型,主要用于刚体与动画编辑结合使用. 仅对 Dynamic 和 Kinematic 类型的刚体生效

三. 碰撞体

Editing 是否对碰撞组件进行编辑。勾选后可以在场景内编辑碰撞组件的位置、样式和大小。详情请参考下方 编辑碰撞组件
Tag 标签。当发生碰撞后,可根据 Tag 区分不同碰撞组件
Group 碰撞组件分组。通过 碰撞矩阵 可设置不同分组间碰撞的可能性
Sensor 指明碰撞组件是否为传感器类型,传感器类型的碰撞组件会产生碰撞回调,但是不会发生物理碰撞效果
Density 碰撞组件的密度,用于刚体的质量计算
Friction 碰撞组件摩擦力系数,碰撞组件接触时的运动会受到摩擦力影响
Restitution 碰撞组件的弹性系数,指明碰撞组件碰撞时是否会受到弹力影响
Offset 碰撞组件相对于节点中心的偏移

四. 碰撞回调 demo 代码

@ccclass('TestContactCallBack')
export class TestContactCallBack extends Component {
    start () {

        // 注册单个碰撞体的回调函数
        let collider = this.getComponent(Collider2D);
        if (collider) {
            collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
            collider.on(Contact2DType.END_CONTACT, this.onEndContact, this);
            collider.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
            collider.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
        }

        // 注册全局碰撞回调函数
        if (PhysicsSystem2D.instance) {
            PhysicsSystem2D.instance.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
            PhysicsSystem2D.instance.on(Contact2DType.END_CONTACT, this.onEndContact, this);
            PhysicsSystem2D.instance.on(Contact2DType.PRE_SOLVE, this.onPreSolve, this);
            PhysicsSystem2D.instance.on(Contact2DType.POST_SOLVE, this.onPostSolve, this);
        }
    }
    onBeginContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        // 只在两个碰撞体开始接触时被调用一次
        console.log('onBeginContact');
    }
    onEndContact (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        // 只在两个碰撞体结束接触时被调用一次
        console.log('onEndContact');
    }
    onPreSolve (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        // 每次将要处理碰撞体接触逻辑时被调用
        console.log('onPreSolve');
    }
    onPostSolve (selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        // 每次处理完碰撞体接触逻辑时被调用
        console.log('onPostSolve');
    }
}

五 设置好 刚体 碰撞体以后, 需要在项目中设置 相关内容
项目 => 项目设置 => 物理 => 碰撞矩阵

  1. 设置碰撞分组

    设置好之后 状态显示 不一定会实时更新, 需要重新打开.

  2. 配置 使用的物理引擎, 是基于 Box2D 还是 builtin 2D 物理系统

六 还有个需要注意的问题,
在添加全局的碰撞监听后直接去销毁对象会产生Uncaught Error

// 等待物理回调销毁
director.once(Director.EVENT_AFTER_PHYSICS, ()=>{
	selfCollider.node.destroy();
})

// 延迟一帧后销毁
setTimeout(()=>{
    selfCollider.node.destroy();            
}, 50)

解决方案自这里: https://forum.cocos.org/t/topic/106186

标签:creator,Collider2D,碰撞,2D,引擎,组件,物理,刚体
From: https://www.cnblogs.com/lesten/p/17615050.html

相关文章

  • 火山引擎DataLeap数据质量动态探查及相关前端实现
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群需求背景火山引擎DataLeap数据探查上线之前,数据验证都是通过写SQL方式进行查询的,从编写SQL,到解析运行出结果,不仅时间长,还会反复消耗计算资源,探查上线后,只需要一次探查,就可以得到整张表的......
  • 数据仓库(十二)---分布式SQL查询引擎---teradata版本的presto安装和使用
    我们在使用presto过程中,发现facebook原版和京东原版都是解压可用,teradata版本的安装要麻烦一些。下面对teradata版本的安装过程进行记录。首要条件1、需要python2.6或者python2.7环境之所以需要python环境是因为teradata版本的presto把安装封装成了集群式安装。根据配置在安装过......
  • VINKA/永嘉微电防干扰/抗噪2键/2通道/2路触摸触控芯片VK36N2D/VK3602XS/KA适用于玩具,
     概述      VK3602XS具有2个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了2路锁存输出功能,可通过IO脚选择输出电平。芯片内部采用特殊的集成电路,具有高电源电压抑制比,可减少按键检测错误......
  • 针对搜索引擎优化您的网站(面向新手)
    今天文章将简明扼要的介绍如何优化您的网站有助于提升网站在Google搜索结果中的排名Google不会通过收取费用来提高网站排名,也不会因网站在Google上投放广告而提高其排名。任何与此不符的消息均是子虚乌有。描述应贴切:您的网页应使用准确的描述性标题。我们建议将不同的主题、......
  • 支持多数据源联合查询的SQL运行引擎sycnany-SQL添加使用自定义函数
    在微服务和云原生愈发流行的今天,数据的分布也愈发脱离单库单机而更加复杂,使用的数据库类型也会更多,但业务的复杂依然会带来了大量的数据查询和导出需求,而很多时候我们很难为数据量的大部分系统创建完整的BI数仓系统,这时候你是不是觉得为这些需求查询和导出数据就会是一个十分困难且......
  • MySQL和MongoDB如何JOIN查询?一个直接在本地运行的SQL执行引擎
    在微服务和云原生愈发流行的今天,数据的分布也愈发脱离单库单机而更加复杂,使用的数据库类型也会更多,但业务的复杂依然会带来了大量的数据查询和导出需求,而很多时候我们很难为数据量的大部分系统创建完整的BI数仓系统,这时候你是不是觉得为这些需求查询和导出数据就会是一个十分困难且......
  • Unity用CPU上下翻转Texture2D的最优解
    将Texture2D上下翻转效率的进化史以下数据都是基于8000x4000全景图进行对比的1、最简单也是最先想到的,直接根据索引塞到另一个数组里,耗时:0.3061805秒staticColor32[]FlipColors(Color32[]originalColors,intwidth,intheight){Color32[]......
  • 使用 Roslyn引擎动态编译代码
    Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它。以前老一套的动态编译方法在.NETCore中似乎不再支持了,很多方法都是未实现的。下面就介绍如何在.NETCore环境中使用Roslyn进行动态编译。话不多说,Talkischeap,showmethecode.首先是安装nuget......
  • bevy 0.11 camera2d zoom and pan with touchpad on macos
    usebevy::prelude::*;usebevy::{input::mouse::MouseWheel,render::camera::ScalingMode};usebevy::input::touchpad::TouchpadMagnify;usebevy::window::PrimaryWindow;constGRID_SIZE:usize=200;pubstructSimpleCameraPlugin;implPluginforSimpleCam......
  • 传奇引擎知识分享HxM2幻想引擎简单介绍与假人功能设置
    HxM2幻想游戏开发引擎又被传奇GM们称为HX引擎,也叫幻想引擎,相对于现在流行的传奇版本中,幻想HX是一个低产的引擎,现在已经非常小众化了,可能由于年代久远,款引擎现在使用的很少,但是也出过非常火爆的版本,比如灵域迷失系列、恶魔大极品等等……HXM幻想引擎也现在仍在更新,而且一直有保持免......