1.用Physics.Raycast进行射线检测
物体必须有Collider碰撞组件。
//定义一条射线,起点为GO1的物体坐标,终点为GO2的物体坐标 Ray ray = new Ray(GO1.transform.position, GO2.transform.position - GO1.transform.position); //定义一个光线投射碰撞 RaycastHit hit; //发射射线长度为100 Physics.Raycast(ray, out hit, 100); if (hit.transform != null) { Debug.Log("blocked:" + hit.transform.name); } //在Scene中生成这条射线,起点为射线的起点,终点为射线与物体的碰撞点
Debug.DrawLine(GO1.transform.position,GO2.transforme.position);
如果射线是以GO2的物体的坐标,终点为GO1的物体的坐标,就得写成以下的方式。
Ray ray = new Ray(GO2.transform.position,GO1.transform.position - GO2.transform.position);
2.用Physics.Linecast进行射线检测
int layA = LayerMask.NameToLayer("Character"); LayerMask bricksLayer = 1 << LayerMask.NameToLayer("Character");//LayerMask bricksLayer = 1 << layA; RaycastHit hit; if (Physics.Linecast(GO1.transform.position, GO2.transform.position, out hit, (1 << layA))) { Debug.Log("blocked:"+hit.transform.name); } Debug.DrawLine(transform.parent.gameObject.transform.position, _player.transform.position);
下面这句话的意思是 射线遮罩,只对物体 的 Layer 是“Character”的物体,进行检测。
Physics.Linecast(GO1.transform.position, GO2.transform.position, out hit, (1 << layA)
总结:以上2种方法都能够 对2个物体之间 进行射线检测,并返回 被阻挡的物体。
参考文章:
1.
How to check if the collision line between two objects is free?
2.
Physics.Linecast
3.
Unity检测目标是不是在攻击范围内
5.
unity射线检测忽略某层的方法