3月7日
快开学了
好了继续tk
接下来就是给场景内的物体添加碰撞器,这也是十分重点的一部分
两个发生碰撞的物体上都必须要有碰撞器Box Collider,并且其中一方需要有刚体,通常在运动的一方身上设置刚体,因为长时间的不运动会使刚体进入休眠状态。
淦,加了Box Collider2D也加了rigidbody 2d,死活无法触发碰撞怎么办啊我要疯了
好了解决了,虽然不是很懂原理,发生问题的原因是,因为物体受到重力影响下坠,我就想去掉重力,因此把Rigidbody 的body type改成了Kinematic,当我改回Dynamic 时,他就碰撞了,于是我去查了一下这三个属性的意思
Body Type | 刚体类型 | 设置为不同的运动行为(移动和旋转)和碰撞方式。 Dynamic(动态,默认)、Kinematic(运动学)、Static(静态) |
Dynamic Rigidbody2D | 动态,默认 | Dynamic Rigidbody2D被设计用来制作在物理模拟下会移动的物体。 它会与所有类型的Rigidbody2D进行碰撞,是最常用的Rigidbody2D类型、默认的类型,同时也是最耗费性能的类型。 不要使用Transform组件来设置Dynamic Rigidbody2D的position和rotation。 |
Kinematic Rigidbody2D | 运动学 | Kinematic Rigidbody2D被设计用来制作在物理模拟下会移动、但是仅仅在明确的用户控制下运动的物体,它不会受到重力和AddForce、AddTorque等力相关的函数的影响。 Kinematic Rigidbody2D对系统资源的要求比Dynamic Rigidbody2D更低(所以更有效率)。 Kinematic Rigidbody2D被设计用来通过Rigidbody2D.MovePosition或Rigidbody2D.MoveRotation来进行重定位。 对于Kinematic Rigidbody2D,velocity属性对它依旧有效,只不过施加力和重力都不会对velocity造成影响。 Kinematic Rigidbody2D仅仅只会与Dynamic的Rigidbody2D发生碰撞(在不勾选Use Full Kinematic Contacts的情况下),它在碰撞行为上类似于Static Rigidbody2D,可以理解为具有无限质量、无法被撼动(不能通过力或碰撞改变速度,但是可以设置其速度和位置、旋转)的刚体。 |
Static Rigidbody2D | 静态 | Static Rigidbody2D被设计用来制作在物理模拟下不会移动的物体。 它在表现上可以理解为一个具有无限质量、不可移动的物体。此时velocity、AddForce、gravity、MovePosition、MoveRotation都是不可用的。 Static Rigidbody2D对资源最不敏感(对性能要求低),Static Rigidbody2D仅仅会与Dynamic Rigidbody2D发生碰撞。 两个Static Rigidbody2D之间也不会发生碰撞,因为他们本来就被设计成不可移动的。 |
由此可见如果我将物体的属性设置为Kinematic ,他只能与有Dynamic Rigidbody2D属性的物体碰撞
害,真叫人头大
其他注意事项:
1.碰撞时发生轻微旋转,只需要将Rigidbody2D中constraints的z轴固定即可
2.碰撞时发生抖动,如果想去掉抖动,只需要在脚本中将移动方法放在private void FixedUpdate()中即可
这样子就暂时结束这个问题,继续项目
对tank的移动进行优化,因为之前的脚本使得同时按下垂直和水平方向键使,tank进行了斜方向的漂移,此处在移动前加一个限制语句,使同时只有一个按键生效
if (h != 0)//在移动之前
{
return;
}