Unity学习记录-物理系统

Tag和Layer

Tag:用于给GameObject分类

  • 是一个string
  • 每一个GameObject都有一个Tag,默认为Untagged
  • Tag可以用来判断一个物体是否属于某分类,也可以用于寻找物体
1
2
3
4
5
6
//通过Tag来搜索物体
//此方法返回它找到的具有指定标签的第一个 GameObject。如果一个场景包含多个具有指定标签的活动 GameObjects,则无法保证此方法返回特定 GameObject。
respawn = GameObject.FindWithTag("Respawn");

//此方法返回所有带有指定tag的GameObject数组
GameObject[] temp = GameObject.FindGameObjectsWithTag("test");

Layer

  • 是一个int
  • 每个GameObject都有一个Layer,默认为Default
  • 可以让相机只渲染一些Layer,可以让物理运算只在一些Layer上进行
  • 最多可以有32个Layer
1
2
//访问Layer
int layerInt = gameObject.layer;

Layer和LayerMask

Layer是标准整数,LayerMask是格式化为位掩码的整数,以0表示排除的Layer,以1表示选中的Layer。在计算机中int表示的最大数值为2147483647,即2^31,有32个bit,所以Unity最多可以有32个Lager。

将Layer转化为LayerMask:使用左移运算符和或运算符

1
2
3
4
5
//第9层的LayerMask
int tempLayerMask = 1<<9;

//第9层和第15层的LayerMask
int layerMask = 1<<9|1<<15;

RigidBody

刚体,定义了一个物体的物理行为

RigidBody2D的三种行为模式:

  • Dynamic:完全参与物理模拟,例如掉落物
  • Kinematic:不会主动移动,需要代码去调整,例如由程序驱动的角色移动
  • Static:完全不会移动,例如地面和墙壁

RigidBody.AddForce:为刚体添加力

  • 第一个参数:力的方向
  • 第二个参数ForceMode:力的模式:
    1. ForceMode.Force:考虑刚体的质量
    2. **ForceMode.Acceleration:**添加加速度,不考虑质量
    3. ForceMode.Impulse:瞬时的力,考虑质量
    4. ForceMode.VelocityChange:添加一个瞬时的速度,不考虑质量
  • 在2D物理中可以使用ForceMode2D来代替ForceMode

Collider&Trigger

定义了物体的物理体积

有两种模式:Collider(有物理体积)和 Trigger(无物理体积)

事件函数:

1
2
3
4
5
void OnCollisionEnter2D() //在刚体碰到时触发一次

void OnCollisionExit2D() //在刚体离开时触发一次

void OnCollisionStay2D() //在刚体碰撞时每帧触发

Trigger同理