Unity2D_检测障碍物(碰撞检测)

5/15/2022 Unity

# 检测障碍物

# 刚体与碰撞器

unity中的两个物体要想发生碰撞,必须依赖于自身的碰撞器组件(Collider),并且至少其中一个物体必须附有刚体组件(Rigidbody),其中附带碰撞检测脚本的物体必须有刚体组件(一般刚体放在运动物体上,因为刚体会休眠)。

unity中的碰撞检测,主要有两种接口函数,一种是碰撞信息检测,一种是触发信息检测(在检视面板碰撞器组件中勾选IsTrigger属性选择框,则为触发器模式),这两种接口函数具体为:

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter(Collision collisionInfo) 只有进入碰撞器时,调用该方法,在两个物体离开碰撞器之前只调用一次

onTriggerEnter2D

2.MonoBehaviour.OnCollisionStay(Collision collisionInfo) 在两物体保持接触时调用,在两个物体碰撞器离开之前每帧调用一次

onTriggerStay2D

3.MonoBehaviour.OnCollisionExit(Collision collisionInfo) 只有两个物体碰撞器离开时,调用该方法一次 触发信息检测:

OnTriggerExit2d

如果需要对不同类型物体的碰撞做出对应的操作,可以对不同的物体打上tag,在函数中获取对应的tag switch 不同的操作

如果不点isTrigger,那么碰撞会有物理效果。比如一方会阻止另一方的移动,碰撞会对移动产生影响。

如果有任意一方点了isTrigger,那么不会有物理效果,双方会互相穿透。

如果碰撞了刚体有3种类型

  1. Dynamic 类型会响应所有物理效果,在碰撞到物体会发生位移,旋转。
  2. Kinematic 不会响应物理效果,不受力的影响,但是可以通过Rigidbody2d.movePosstion来移动它。
  3. Static 表示一个不会动的物体,质量无限大,且不会收到力的作用,也不能通过RIgidbody2d的函数来进行移动或者旋转。

# 检测周围物体属性

上面的稍微麻烦了一点,如果你只是想简单的检测周围的物体。

比如类似pokemon 游戏,用tilemap做了地图,检测是不是在遇怪区域。

可以给这个tilemap设置tilemap colider2d 和 composite colider2d

image-20220516210559400

另一个物体player不需要设置刚体和 碰撞器

只需要把对应的层传进脚本

然后检测player周围的layer类型就可以了

    private bool IsWalkable(Vector3 targetObject)
    {
        // 检测目标位置的0.3f范围是否存在不可过去的sloid层
        //   						移动时的目标位置
        if (Physics2D.OverlapCircle(targetObject, 0.1f, solidObjectLayer) != null)
        {
            return false;
        }
        return true;
    }

    private void CheckForEncounters()
    {
        // 是否在草丛遇怪区				角色位置
        if (Physics2D.OverlapCircle(transform.position, 0.2f, longGrassLayer) != null)
        {
            if (UnityEngine.Random.Range(1, 101) <= 10)
            {
                onEncountered();
                animator.SetBool("isMoving", false);
            }
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23