Rigidbody2D使用与优化

1.移动


当gameobject被加上rigidbody2d组件时,如果想移动它,不要这样写:

void Update(){
        this.transform.Translate (Vector3.left * speed * Time.deltaTime);
}

这种写法,主要针对无rigidbody2d的gameobject对象,否则,性能很差。
正确的写法:

void FixedUpdate()
    {
        rigidbody2D.MovePosition (rigidbody2D.position 
                  + Vector2.left * speed * Time.fixedDeltaTime);
    }
void Start () {
        rigidbody2D.velocity = Vector2.left * speed;
    }

2.Body Type属性


rigidbody2d最为重要的一个属性,不同的选项,不同的物理效果:
2.1 Dynamic(动态的)

具有完全的物理特性;
会与所有类型的Rigidbody2D进行碰撞;
是最常用的Rigidbody2D类型、也是默认的类型;
是最耗费性能的类型;

2.2 Kinematic(运动学)

仅在用户控制下运动,不会受到重力和AddForce等力相关函数的影响;
只与Dynamic的Rigidbody2D发生碰撞(不勾选Use Full Kinematic Contacts);
不能通过力或碰撞改变速度,但是可以设置其速度和位置、旋转;
比Dynamic性能高;

2.3 Static (静态的)

具有无限质量、不可移动的物体;
velocity、AddForce、gravity、MovePosition、MoveRotation都不可用;
只与Dynamic的Rigidbody2D发生碰撞;
性能最高;

3. Simulated 物理模拟


设置为true(勾选)时开启模拟;设置为false(不勾选)时关闭模拟。
模拟包括:

运动;
Collider2D的碰撞;
Joint2D的约束效果;
是否驻留在内存;

直接更改此属性,比直接启用/禁用Collider2D组件或Joint2D组件更有高效;

4. Use Full Kinematic Contacts

Kinematic 模式下的属性。

勾选后,在碰撞上类似于Dynamic Rigidbody2D,可以和所有类型Rigidbody2D进行碰撞,但是仍然不会受到力的影响;
不勾选,只会与Dynamic Rigidbody2D发生碰撞;

5. 其他注意事项:

1.运行中,不要修改Rigidbody2D的Body Type属性,性能会变差。
2.如果一个Rigidbody2D需要移动,并且接受完全的物理模拟,包括重力、碰撞、施加力等,
   那么需要将Rigidbody2D设置成Dynamic,并附加Collider2D组件。
3.如果一个Rigidbody2D需要移动,但不接受力的作用,那么需要将它设置成Kinematic;
4.如果一个Rigidbody2D不需要移动,也不需要接收力的作用,但是需要接受碰撞,
   那么需要将Rigidbody2D设置为Static,并附加Collider2D组件。

推荐阅读更多精彩内容

  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 3,155评论 0 15
  • 窗下的刺玫开了。迎春、小桃红、丁香都依次开过,败了。刺玫现在是万绿丛中一点红,骄傲! 白天,我晒着太阳,在水泥台上...
    朴姬淑阅读 18评论 0 0
  • 大家好,我是IT修真院上海分院1期的Web学员刘洪利,今天给大家分享一下关于angular中的常见指令ng-if、...
    LHongLi阅读 471评论 0 0
  • 《寸心》第二章,全文共2593字。 眼前的这辆自行车承载了邈清过去约一年时间的所有欢乐,这么说或许有些夸张,肯定还...
    楠谷美阅读 32评论 0 2
  • 撒旦军团
    一只会飞的猫头鹰阅读 57评论 0 0