zoukankan      html  css  js  c++  java
  • Unity学习笔记2:物理引擎和碰撞

    本小节主要是Unity物理引擎,刚体碰撞方面的散记。

    Character Controller的一些特性:
    本身不受physics影响,需要接受外力作用时,使用onCharacterColliderHit().
    Skin width:最好设置为radius的10%,防止角色经常卡住。
    step offset:对于2meter高的Character最好设为0.1到0.4
    min move distance设为0即可。

    Rigidbody的属性设置:
    Is Kinematic:打开后物体不受物理引擎影响,只受transform的控制。比如制作一个上升的平台,本身是rigidbody,且不受物理引擎影响,打开Is Kinematic.
    Interpolate:使运动更光滑。
    Freeze Rotation:使旋转不受碰撞或由script里定义施加的外力影响。只受tranform控制。

    对rigidbody使用力的script方法:AddForce(),AddTorque().当使用physics时不要直接修改transform.

    collision detection:高速运动的碰撞体应设为continuous,防止出现上一帧在其他碰撞物体的这边,下一帧已经穿过碰撞物体到达另一边的情形。默认为discrete.只有box,sphere和capsule的collider才能设置为continuous.

    对于rigidbody,size是个比mass更重要的属性,所以在建模的时候强烈建议总是参考实际标准大小(unity中单位长度是米)。实时instantiate一个物体并修改它的大小,会影响其物理属性,因而会降低游戏性能。

    两个rigidbody自由下落的速度不受mass影响,而是用drag(空气阻力)这个参数来控制。drag值越大,看起来感觉物体重量越轻(典型的0.001-金属块,10-羽毛)。

    对rigidbody使用constant force组件来设置一个constant force,这个力可以是force或torque。
    对物体施加constant force时,设置一个drag值可让物体加速到一个特定的最大速度以后不再加速。drag值越大这个速度越小。

    某带有rigidbody的collider碰撞时会发送三个消息给该collider的对象,分别是Collider.OnCollisionEnter,Collider.OnCollisionExit和Collider.OnCollisionStay,这些事件可以在script里选择利用NVIDIA PhysX engine进行特别处理。

    打开collider的Is trigger选项,碰撞就不受到物理引擎影响,而是通过发送三个消息变成某个事件的trigger。(同样的,发生碰撞的两个collider中至少有一个必须是rigidbody)这三个消息函数分别是:Collider.OnTriggerEnter,Collider.OnTriggerExit和Collider.OnTriggerStay.引发的事件可以是切换场景,开门,播放教程等等,自由发挥你的想象力。

    总结下来:三种collider:
    1.static collider: 带有collider却没有rigidbody的对象,最好用于静止物体如环境地理。
    2.rigidbody collider:带有rigidbody的collider对象,能够根据物理引擎很好的响应外力和碰撞作用。
    3.kinematic rigidbody collider:带有rigidbody的collider对象,开启Is kinematic之后,等效于可以频繁使用insform来移动(而非rigidbody collider利用外力或碰撞的物理效应)的static collider,用于需要rigidbody但不希望响应物理效果的对象。另外就是可以给其设置Is trigger,作为某些事件的触发器,但Is trigger的设置对象必须是rigidbody,但你又不希望其受物理定律约束的情形。

    注:kinematic还常用来创造ragdoll.由于kinematic可以方便的开关,通常情况下开启kinematic方便角色移动等,但遇到碰撞、爆炸冲击等情况,可以在脚本里添加代码使其关闭kinematic变为普通的rigidbody接受物理作用。

    Collision Action Matirx(各种碰撞属性对象碰撞的消息发送标准):


    各种碰撞属性对象的碰撞消息发送标准

    不难看出其中规律。
    另外Unity3.X以后支持Layer-based Collision Detection,这个在后面script的学习里会详细介绍。
    两个mesh collider不能互相碰撞除非都设为convex。mesh collider设置为convex有个限制,这个mesh必须少于255个三角形。
    Physics Material:设置物体的弹性,摩擦系数,软硬程度的组件。
    Hinge Joint:关节组件。用于门的轴或者链条等。
    Spring Jonit:弹簧组件。实时创建和调整spring的方法——创建一个空的game object作为spring绑定的connected body对象,在脚本里控制这个空的game object从而有效控制spring.
  • 相关阅读:
    PAT Advanced 1067 Sort with Swap(0, i) (25分)
    PAT Advanced 1048 Find Coins (25分)
    PAT Advanced 1060 Are They Equal (25分)
    PAT Advanced 1088 Rational Arithmetic (20分)
    PAT Advanced 1032 Sharing (25分)
    Linux的at命令
    Sublime Text3使用指南
    IntelliJ IDEA创建第一个Groovy工程
    Sublime Text3 安装ftp插件
    Sublime Text3配置Groovy运行环境
  • 原文地址:https://www.cnblogs.com/definitelymaybe/p/3617784.html
Copyright © 2011-2022 走看看