碰撞器 XX Collider
![在这里插入图片描述](https://img-blog.csdnimg.cn/260723c346104f1f851f01b005724e3c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCs6Zuo55yg5Lio,size_20,color_FFFFFF,t_70,g_se,x_16)
碰撞器组件,有多种类型,图上的这个是盒状碰撞器,绿色边缘,表示这个物体可以接受碰撞。
常用API
1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision) 当逗留碰撞器
触发器
![在这里插入图片描述](https://img-blog.csdnimg.cn/e97521395327421ab8acd5df2e5c07bd.png)
当Collider组建中的 Is Trigger为True时,此时就代表这个物体为触发器。
触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器
2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器
3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器
碰撞器与触发器最大的区别就是,当该物体有刚体时,碰撞器与物体碰撞,碰撞器与碰撞的那个物体都会受到力的作用,但是触发器不会,只是触发。例如我在华为项目中的弹幕功能,当弹幕从右向左飘,飘过制定的触发器时,就代表该行可以继续发送弹幕。
刚体 Rigidbody组件
![在这里插入图片描述](https://img-blog.csdnimg.cn/ecb5e51162094429a5ef94c1d0779994.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCs6Zuo55yg5Lio,size_17,color_FFFFFF,t_70,g_se,x_16)
刚体可以理解为“力”的组件,只有当物体拥有刚体组件的时候,才能受到力的作用。否则只能作为碰撞器或者触发器。
目前我用到过的API
rigidbody.AddForceAtPosition();
rigidbody.AddForce();
rigidbody.AddForceAtPosition()
Constant Force
如果想给物体施加一个恒定的力,可以添加Contant Force组件
![在这里插入图片描述](https://img-blog.csdnimg.cn/10d942a618be4d85a8cc0d2e2d38a8cf.png)
射线
射线常用的情况:
第一种情况:
屏幕发射射线
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100f))
{
cube = hit.collider.gameObject;
Destroy(cube);
}
}
第二种
从一个点向另一个点发射射线
transform.Rotate(new Vector3(0, 1, 0));
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 100f))
{
Destroy(hit.collider.gameObject);
}
第三种
从一个点向另一个点发射射线,并且筛选层级 ~是除了当前选中的所有层,相当于非,| 符号相当于或
transform.Rotate(new Vector3(0, 1, 0));
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 100f, 1 << 8))
{
Destroy(hit.collider.gameObject);
}
第四种
//针对物体速度过快,导致无法检测碰撞时,可以使用射线,每一帧都进行检测
float speed = 1000f;
float length = 10f;
RaycastHit hit;
Vector3 oldPosition = transform.position;
transform.Translate(transform.forward * speed * Time.deltaTime);
//行进的方向
Vector3 dir = transform.position - oldPosition;
//行进的距离
float dis = dir.magnitude;
if (Physics.Raycast(oldPosition,transform.forward,out hit,dis))
{
if (hit.collider.gameObject.name == "Cube")
{
Debug.Log("击中物体,坐标为" + hit.point);
}
}
ps:枪战游戏如果是通过屏幕射击,希望留下的弹痕贴近表面,
可以使用 transform.LookAt(hit.point - hit.normal);