射线检测步骤
- 在代码中声明一个射线,可以是自定义的射线,也可以是鼠标位置或者其他什么的射线,自定义射线(通过定义射线的起始位置和发射方向):
Ray mRay = new Ray(transform.position, transform.forward);
或者鼠标射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- 声明碰撞结果的类
RaycastHit
,RaycastHit _mHitInfo
- 给要碰撞的物体添加
Tag
- 调用物理检测方法
Physics.Raycast(Ray , out RaycastHit , float distance)
具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shooting : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
void Update()
{
}
public void Shoot()
{
//位置,方向确定一个射线,设置射线不碰撞触发器
Ray mRay = new Ray(GunBarrelEnd.transform.position, GunBarrelEnd.transform.forward);
//或者是
//Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//结果类
RaycastHit hitInfo;
if (Physics.Raycast(mRay, out hitInfo))
{
if (hitInfo.collider.tag == "Enemy")
{
//todo...
}
}
Invoke("EndShoot",0.02f);
}
private void EndShoot()
{
//todo...
}
}
设置层级,对特定层级的进行检测
- 添加层级,并赋值
- 得到层级的index``private EnemyIndex = LayerMask.GetMask(“Enemy”);
- 检测方法
Physics.Raycast()
中有很多重载,使用带有层级的那个即可
- 其他的步骤和上面的一致
但是这样的射线检测,碰撞检测,触发检测都会发生反应,有的时候我们不想让trigger
触发检测进行,因为碰撞检测一般用来物体不能重叠的效果,而出发检测用来进行AI的目标收集,自动攻击什么其他的效果,所以要进行射线发生触发检测
那么,我们可以在untiy面板中进行设置,如下:
Edit
->project setting
->Physics
->Queries Hit Triggers