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