Unity物理系统常用知识总结
碰撞器 XX Collider
碰撞器组件,有多种类型,图上的这个是盒状碰撞器,绿色边缘,表示这个物体可以接受碰撞。
常用API
1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision) 当逗留碰撞器
触发器
当Collider组建中的 Is Trigger为True时,此时就代表这个物体为触发器。
触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器
2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器
3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器
碰撞器与触发器最大的区别就是,当该物体有刚体时,碰撞器与物体碰撞,碰撞器与碰撞的那个物体都会受到力的作用,但是触发器不会,只是触发。例如我在华为项目中的弹幕功能,当弹幕从右向左飘,飘过制定的触发器时,就代表该行可以继续发送弹幕。
刚体 Rigidbody组件
刚体可以理解为“力”的组件,只有当物体拥有刚体组件的时候,才能受到力的作用。否则只能作为碰撞器或者触发器。
目前我用到过的API
rigidbody.AddForceAtPosition();
rigidbody.AddForce();
rigidbody.AddForceAtPosition()
Constant Force
如果想给物体施加一个恒定的力,可以添加Contant Force组件
射线
射线常用的情况:
第一种情况:
屏幕发射射线
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);
文章评论