贵阳论坛网站建设,企业网站建设合同范本免费,笔记模板wordpress,玩网页游戏的网站一、修改物理材质
Unity对物体表面材料的性质做了件化处理#xff0c;仅有5种常用属性#xff1a; Dynamic Friction#xff08;动态摩擦系数#xff09;Static Friction#xff08;静态摩擦系数#xff09;Bounciness#xff08;弹性系数#xff09;Friction Combine…一、修改物理材质
Unity对物体表面材料的性质做了件化处理仅有5种常用属性 Dynamic Friction动态摩擦系数Static Friction静态摩擦系数Bounciness弹性系数Friction Combine摩擦力系数算法Bounce Combine弹性系数算法 物理材质是配合碰撞体使用的。碰撞体有一个Material属性将创建好的物理材质拖拽到该属性上即可指定该属性。
不指定任何物理材质时碰撞体具有默认的物理材质。
二、FixedUpdate 物理更新保证稳定的时间间隔默认0.02s可以通过Edit-Project Settings-Time来修改。 物理系统对于时间是非常敏感的。举一个例子发射子弹0.1秒后几种物体。假如更新频率不稳定子弹接触物体时没有及时检测再晚0.02秒子弹已经穿过了物体。这样子弹就错过了碰撞的时机导致后续结果完全不同。
按理说刷新频率应该是越高越好但综合考虑机器负担和性能后决定50帧是最合理的选择。
所有的物理系统处理都会在引擎循环中的一个专门环节上完成从而保证更新频率的稳定。
特殊机制
如果说设备卡了一下物理更新还能保证更新频率吗 答案是有办法间接保证这一点。简单来说游戏世界的时间是一个虚拟的概念一定程度上可以人为控制。如果在T时刻卡了0.06秒正好错过了三个周期那么在下一次不卡的时候FixedUpdate函数会补上之前错过的三次连续执行4次而且还会假装这4次的调用时间点分别是T0.02,T0.04,T0.06T0.08.通过这样的机制就能保证无论硬件运行是否稳定游戏都能保证稳定的物理更新避免出现奇怪的结果。作为对比Update就没有这个特性。 三、修改角速度
与修改刚体速度类似代码如下 Rigid.angularVelocitynew Vector3(0,60,0); 刚体的angularVelocity属性的数据类型为Vector3代表x、y、z轴的旋转速度单位时弧度/s也就是说3.14代表每秒半圈。
由于具有角阻尼Angular Drag因此即便没有接触其他物体旋转也会慢慢停下来。
四、质心
拼接一个简单的模型使用物理系统调整其重心就可以只做一个不倒翁。代码如下 Rigidbody rigid; rigidGetComponentRigidbody(); //设置centerOfMass就可以指定重心了 rigid.centerOfMassnew Vector3(0,-1,0); 游戏物体的重心不受真实世界的限制不但可以设置在物体的任意位置而且还可以超出物体本身的范围。
对物体施加力时力的位置不同效果也就不同。严格来说对一个不受任何力的物体在Unity里就是去掉了中立也不与其他物体接触的刚体如果手里的方向通过了该物体的质心物体就不会获得较速度。如果力的方向错过了质心那么物体就会有旋转的趋势。质心到受力线的距离越远旋转的趋势就越强
五、更多施加力的方式
力的位置很重要但前文提到的AddForce却没有位置参数。可以猜想AddForce函数施加力时就是从物体的质心位置施加的。
如果要模拟更复杂的情况可以使用以下函数 void AddForceAtPosition(Vector3 force,Vector3 position); void AddForceAtPosition(Vector3 force,Vector3 position,ForceMode mode); 第二个参数为施加力的位置以世界坐标表示因此使用时可能需要转换坐标。
第三个参数为力的模式是一个枚举类型定义如下 public enum ForceMode { //默认方式为持续施加力 Force0 //设置为瞬间博发力适合表现快速猛烈的力如爆炸 //力的持续时间有区别 Impulse1 //瞬时改变刚体速度不考虑质量 VelocityChange2 //直接改变加速度不考虑质量 Acceleration5 也就是说施加力的时候可以通过改变蚕食mode来让施加力的含义发生变化。前两种比较常用第三种完全可以用直接修改刚体速度的velocity属性代替
六、刚体约束
在Rigidbody中有一个Constraints可以锁定xyz轴的移动与旋转。根据需要锁定一些自由度可以让刚体的行为更加可控。
也可以用脚本控制冻结 rigid.constraintsRigidbodyConstraints.FreezeAll;//冻结所有移动和旋转 rigid.constraintsRigidbodyConstraints.FreezePositionX;//冻结x轴的位移取消所有其它约束 rigid.constraintsRigidbodyConstraints.FreezeRotation;//冻结所有旋转取消位移约束 rigid.constraintsRigidbodyConstraints.FreezeRotationX|RigidbodyConstraints.FreezeRotationZ|RigidbodyConstraints.FreezePositionY;//冻结x和z轴旋转冻结y轴位移