18.Collision2D碰撞体2D和碰撞检测函数2D

  1. 18.2D相关-2D物理系统-碰撞体
    1. 18.1 知识点
      1. 碰撞器是用来干嘛的
      2. Collision2D碰撞体2D组件其参数
        1. 圆形碰撞器
          1. Edit Collider 编辑碰撞器
          2. Material 材质
          3. Is Trigger 是触发器
          4. Used By Effector 由效果器使用
          5. Offset 偏移
          6. Radius 半径
        2. 盒状碰撞器
          1. Use by Composite 由复合使用
          2. Auto Tiling 自动拼接
          3. Size 大小
          4. Edge Radius 边缘半径
        3. 多边形碰撞器
          1. Points 点
        4. 边界(边缘)碰撞器
        5. 胶囊碰撞器
          1. Size 大小
          2. Direction 方向
        6. 复合碰撞器
          1. Geometry Type 几何学类型
            1. Outlines
            2. Polygons
          2. Generation Type 生成类型
            1. Synchronous
            2. Manual
          3. Vertex Distance 顶点距离
          4. Offset Distance 偏移位置
          5. Edge Radius 边缘半径
      3. 2D碰撞检测函数
    2. 18.2 知识点代码
    3. 18.3 练习题
      1. 在之前练习题的基础上,请用2D刚体和碰撞器制作一个玩家,它可以在一个平台上移动跳跃。(注意:移动和跳跃都通过刚体的API进行制作,类似3D物理系统中刚体加力和给速度,之前练习题是通过直接改变坐标移动位置的)
        1. 给Player添加碰撞体和刚体,创建几个方形精灵图片添加盒型碰撞器作为要跳跃的平台
        2. Update函数内。注释原来使用Translate API移动的逻辑。根据输入改变刚体的速度来进行移动。注意只改变x轴的,不改y轴的。否则重力会受影响。按下J键时给刚体添加力,作为跳跃。由于给Player添加的是胶囊碰撞器,所以要锁定刚体的旋转,免的移动时倒了。
    4. 18.4 练习题代码

18.2D相关-2D物理系统-碰撞体


18.1 知识点

碰撞器是用来干嘛的

  • 碰撞器是用于在物理系统中表示物体体积的的(形状或范围)。
  • 刚体通过得到碰撞器的范围信息进行计算,判断两个物体的范围是否接触。
  • 如果接触,刚体就会模拟力的效果产生速度和旋转。

Collision2D碰撞体2D组件其参数

圆形碰撞器


Edit Collider 编辑碰撞器
Material 材质
  • 一种物理材质,用于确定碰撞的属性,控制摩擦和弹性。
Is Trigger 是触发器
  • 是否是触发器。
Used By Effector 由效果器使用
  • 是否被附加的2D效应器使用。
Offset 偏移
  • 圆心偏移位置。
Radius 半径
  • 圆形的半径。

盒状碰撞器


Use by Composite 由复合使用
  • 如果勾选,则该碰撞器将附加到2D复合碰撞器中使用。
  • 勾选后将消失一些属性,这些属性将在复合碰撞器中配置。
Auto Tiling 自动拼接
  • 如果SpriteRender精灵渲染器组件中的DrawMode设置为Tiled平铺模式。勾选该选项后,当改变精灵大小时将自动更新碰撞器的尺寸。
Size 大小
  • 矩形的宽高。
Edge Radius 边缘半径

  • 使四个定点为圆角。

多边形碰撞器


Points 点
  • 多边形顶点。
  • 虽然可以手动修改,但是一般情况下,我们通过数值编辑太复杂了,都通过Edit Collider编辑,或者让Unity自动识别创建。

边界(边缘)碰撞器


  • 边界碰撞器的编辑主要还是通过Edit Collider。
  • 一般不会手动去通过数值加点,可能会用于地形的一条线碰撞体的制作。

胶囊碰撞器


Size 大小
  • 胶囊的宽高。
Direction 方向
  • 是竖直胶囊还是水平胶囊。

复合碰撞器


  • 创建一个父物体挂载复合碰撞器,多个子物体挂载盒型碰撞器,勾选使用复合碰撞器的选项,就会把子物体碰撞器重合的部分合并起来进行同一计算,提高性能。
Geometry Type 几何学类型

  • 合并碰撞体时,碰撞体顶点将组合为两种不同的几何体类型。
Outlines

  • 空心轮廓,类似边界碰撞器
  • 可以把对象放到内部。
Polygons

  • 实心多边形,类似多边形碰撞器。
Generation Type 生成类型

  • 生成类型,复合碰撞器在何时生成新几何体。
Synchronous
  • 对2D复合碰撞器或使用的其它碰撞器修改时,Unity立即生成新几何体,就是改变对象位置立刻生效。
Manual

  • 手动生成新几何体,通过代码生成或者点击下方的Regenerate Geometry生成按钮
  • 就是改变对象位置,碰撞器还是和未改变的时候一样。要用代码设置或者点击下面的Regenerate Geometry生成按钮才生效。
Vertex Distance 顶点距离
  • 从复合碰撞器收集顶点时允许的最小间距值,就是假如两个顶点的距离很小,那小到一定程度就把他们当成一个点一样融合了。
Offset Distance 偏移位置

  • 相当于复合起来的圆润程度,越高越圆润。
Edge Radius 边缘半径

2D碰撞检测函数

  • 碰撞检测函数和3D碰撞检测函数除了名字不同外其他基本一致。
  • 在这里只简单讲解不赘述,它是非常重要的知识点。
private void OnCollisionEnter2D(Collision2D collision)
{
    
}

private void OnCollisionExit2D(Collision2D collision)
{
    
}

private void OnCollisionStay2D(Collision2D collision)
{
    
}

private void OnTriggerEnter2D(Collider2D collision)
{
    
}

private void OnTriggerExit2D(Collider2D collision)
{
    
}

private void OnTriggerStay2D(Collider2D collision)
{
    
}

18.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson18_2D相关_2D物理系统_碰撞体 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 碰撞器是用来干嘛的?
        //碰撞器是用于在物理系统中 表示物体体积的的(形状或范围)
        //刚体通过得到碰撞器的范围信息进行计算
        //判断两个物体的范围是否接触
        //如果接触 刚体就会模拟力的效果产生速度和旋转
        #endregion

        #region 知识点二 2D碰撞器及其参数讲解
        //1.圆形碰撞器
        //2.盒状碰撞器
        //3.多边形碰撞器
        //4.边界碰撞器
        //5.胶囊碰撞器
        //6.复合碰撞器
        #endregion

        #region 知识点三 碰撞检测函数
        //碰撞检测函数 和 3D碰撞检测函数除了名字不同外其他基本一致
        //在这里只简单讲解不赘述
        //它是非常重要的知识点 
        #endregion
    }


    private void OnCollisionEnter2D(Collision2D collision)
    {

    }

    private void OnCollisionExit2D(Collision2D collision)
    {

    }

    private void OnCollisionStay2D(Collision2D collision)
    {

    }

    private void OnTriggerEnter2D(Collider2D collision)
    {

    }

    private void OnTriggerExit2D(Collider2D collision)
    {

    }

    private void OnTriggerStay2D(Collider2D collision)
    {

    }
}

18.3 练习题

在之前练习题的基础上,请用2D刚体和碰撞器制作一个玩家,它可以在一个平台上移动跳跃。(注意:移动和跳跃都通过刚体的API进行制作,类似3D物理系统中刚体加力和给速度,之前练习题是通过直接改变坐标移动位置的)

给Player添加碰撞体和刚体,创建几个方形精灵图片添加盒型碰撞器作为要跳跃的平台

Update函数内。注释原来使用Translate API移动的逻辑。根据输入改变刚体的速度来进行移动。注意只改变x轴的,不改y轴的。否则重力会受影响。按下J键时给刚体添加力,作为跳跃。由于给Player添加的是胶囊碰撞器,所以要锁定刚体的旋转,免的移动时倒了。

h = Input.GetAxis("Horizontal"); //获取水平输入

//原来是用Translate API移动的
//this.transform.Translate(5 * Time.deltaTime * Vector3.right * h);

//由于 重力 会给予对象 y方向的值 所以我们左右移动 应该只是改变左右速度 y的速度应该保留原有的值
rigidBody2D.velocity = new Vector2(h * moveSpeed, rigidBody2D.velocity.y); //改变刚体速度

if (h < 0)
    sr.flipX = true; //翻转SpriteRenderer
else if (h > 0)
    sr.flipX = false; //不翻转SpriteRenderer

if (Input.GetKeyDown(KeyCode.Space))
{
    //创建子弹预设体
    GameObject obj = Instantiate(Resources.Load<GameObject>("BulletObj"), this.transform.position + new Vector3(sr.flipX ? -0.3f : 0.3f, 0.5f, 0), Quaternion.identity);
    //告诉子弹应该朝哪里动
    obj.GetComponent<BulletObj>().ChangeMoveDir(sr.flipX ? Vector3.left : Vector3.right);
}

if (Input.GetKeyDown(KeyCode.J))
{
    //给它一个向上的瞬时力
    rigidBody2D.AddForce(Vector2.up * 300); //给刚体添加向上的力
}

18.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson18_练习题_PlayerObject : MonoBehaviour
{
    public float moveSpeed = 5; //定义移动速度
    private float h; //定义水平输入

    private SpriteRenderer sr; //定义SpriteRenderer组件

    private Rigidbody2D rigidBody2D; //定义Rigidbody2D组件

    void Start()
    {
        sr = this.GetComponent<SpriteRenderer>(); //获取SpriteRenderer组件

        rigidBody2D = this.GetComponent<Rigidbody2D>(); //获取Rigidbody2D组件
    }


    void Update()
    {
        h = Input.GetAxis("Horizontal"); //获取水平输入

        //原来是用Translate API移动的
        //this.transform.Translate(5 * Time.deltaTime * Vector3.right * h);

        if(h!=0)
        //由于 重力 会给予对象 y方向的值 所以我们左右移动 应该只是改变左右速度 y的速度应该保留原有的值
        rigidBody2D.velocity = new Vector2(h * moveSpeed, rigidBody2D.velocity.y); //改变刚体速度

        if (h < 0)
            sr.flipX = true; //翻转SpriteRenderer
        else if (h > 0)
            sr.flipX = false; //不翻转SpriteRenderer

        if (Input.GetKeyDown(KeyCode.Space))
        {
            //创建子弹预设体
            GameObject obj = Instantiate(Resources.Load<GameObject>("BulletObj"), this.transform.position + new Vector3(sr.flipX ? -0.3f : 0.3f, 0.5f, 0), Quaternion.identity);
            //告诉子弹应该朝哪里动
            obj.GetComponent<BulletObj>().ChangeMoveDir(sr.flipX ? Vector3.left : Vector3.right);
        }

        if (Input.GetKeyDown(KeyCode.J))
        {
            //给它一个向上的瞬时力
            rigidBody2D.AddForce(Vector2.up * 300); //给刚体添加向上的力
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏