文章目录
- 组件介绍
- 1.盒碰撞器(Box Collider)
- 2.椭圆碰撞器(Sphere Collider)
- 3.胶囊碰撞器(Capsule Collider)
- 4.网格碰撞器(Mesh Collider)
- 碰撞器和触发器
- 属性
- 方法
- 射线检测
- Ray射线
- 属性
- 方法
- RaycastHit
- 属性
- 方法
- QueryTriggerInteraction
- 属性
组件介绍
1.盒碰撞器(Box Collider)
1.Edit Colloder:手动编辑Collider
2.Is Trigger:是否为触发器
3.Material:材质
4.Center:碰撞器的中心点,相对于物体的自身坐标
5.Size:碰撞器的大小
2.椭圆碰撞器(Sphere Collider)
1.Edit Colloder:手动编辑Collider
2.Is Trigger:是否为触发器
3.Material:材质
4.Center:碰撞器的中心点,相对于物体的自身坐标
5.Radius:碰撞器的半径大小
3.胶囊碰撞器(Capsule Collider)
1.Edit Colloder:手动编辑Collider
2.Is Trigger:是否为触发器
3.Material:材质
4.Center:碰撞器的中心点,相对于物体的自身坐标
5.Radius:碰撞器的半径大小
6.Height:圆柱体高度
7.Direction:方向
4.网格碰撞器(Mesh Collider)
1.Convex:凸面体,勾选后物体的碰撞体凹凸不平的地方都将被填平
2.Is Trigger:是否为触发器
3.Cooking Options:烘焙选项4.Material:材质
5.Mesh:选择网格
碰撞器和触发器
首先,要想实现物体间的碰撞效果则需要一个必要条件:一刚二碰
两个要进行碰撞的物体必须都具备碰撞体,且至少有一个物体带有钢体才可进行碰撞检测,同样,触发器作为碰撞器的一个开关(只需要把Is Trigger选项勾选即可变为触发器),也需具备如上条件才可进行触发检测。
属性
名称 | 作用 |
attachedRigidbody | 碰撞器附加的刚体 |
bounds | 碰撞器在世界坐标空间的边界框 |
contactOffset | 当他们的collider相差为多少距离的时候开始检测碰撞(触发器修改这个值无效) |
enabled | bool型,启用碰撞器将会碰撞其他碰撞器,禁用碰撞器就不会碰撞其他碰撞器 |
isTrigger | 是否开启触发器 |
material | 材质 |
sharedMaterial | 共享材质 |
方法
名称 | 方法 |
OnCollisionEnter(Collision collision) | 碰撞开始⼀瞬间时调⽤⼀次 |
OnCollisionExit(Collision collision) | 碰撞分离⼀瞬间时调⽤ |
OnCollisionStay(Collision collision) | 碰撞过程中相对运动时持续调⽤,每帧⼀次 |
OnTriggerEnter(Collider other) | 进⼊触发器的时候调⽤⼀次 |
OnTriggerExit(Collider other) | 退出触发器的时候调⽤⼀次 |
OnTriggerStay(Collider other) | 处于某个触发器之中的时候持续调⽤,每帧⼀次 |
ClosestPoint(Vector3 position) | 返回对撞机上最接近给定位置的点 |
ClosestPointOnBounds(Vector3 position) | 到附加碰撞器的边界框最近的点 |
射线检测
Collider.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance)
ray 射线的起点和方向。
hitInfo 如果返回true,hitInfo则将包含有关撞到碰撞器的位置的更多信息
maxDistance 射线的最大长度。
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Collider coll;
void Start() {
coll = GetComponent<Collider>();
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
//ScreenPointToRay将屏幕上的⼀个点转换成射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (coll.Raycast(ray, out hit, 100.0F))
transform.position = ray.GetPoint(100.0F);
}
}
}
Ray射线
属性
名称 | 作用 |
direction | 射线的方向 |
origin | 射线的起点 |
方法
Ray.GetPoint(float distance); 返回distance沿射线单位的点
RaycastHit
属性
名称 | 作用 |
barycentricCoordinate | 所碰到的三角形的重心坐标 |
collider | 碰到的碰撞器,如果什么也没有碰到,此属性为null |
distance | 从射线的原点到撞击点的距离 |
lightmapCoord | 光照图坐标 |
normal | 射线所碰到的表面的法线 |
point | 在世界空间中,射线碰到碰撞器的碰撞点 |
rigidbody | 射线碰到碰撞器的刚体,如果什么也没有碰到,此属性为null |
textureCoord | 在碰撞点的UV纹理坐标 |
textureCoord2 | 碰撞点的第二个UV纹理坐标 |
transform | 碰到的刚体或碰撞器的变换 |
triangleIndex | 三角形索引 |
方法
Physics.Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
origin 射线在世界坐标中的起点。
direction 射线的方向。
maxDistance 射线应检查碰撞的最大距离。
layerMask 一种图层蒙版,用于在投射射线时有选择地忽略“碰撞器”。
queryTriggerInteraction 指定此查询是否应命中触发器。
Physics.Raycast 发射物理射线,返回⼀个碰撞检测对象RaycastHitbool值
——————————————————————————————————————
——————————————————————————————————————
Physics.RaycastAll(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
ray 射线的起点和方向
maxDistance 射线应检查碰撞的最大距离.
layerMask 一种图层蒙版,用于在投射射线时有选择地忽略“碰撞器”
queryTriggerInteraction 指定此查询是否应命中触发器.
RaycastHit [] HitAll = Physics.RaycastAll;发射物理射线,返回所有碰撞检测对象
——————————————————————————————————————
——————————————————————————————————————
Physics.Linecast(Vector3 start, Vector3 end, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
start 起点
end 终点
layerMask 一种图层蒙版,用于在投射射线时有选择地忽略“碰撞器”
queryTriggerInteraction 指定此查询是否应命中触发器
Physics.Linecast 从开始位置到结束位置做一个光线投射,如果与碰撞体交互,返回真
QueryTriggerInteraction
属性
名称 | 作用 |
UseGlobal | 查询使用全局Physics.queriesHitTriggers设置 |
Ignore | 查询从不报告触发器命中 |
Collide | 查询总是报告触发器命中 |