我有一个带有3个射线投射的圆锥形,但是如果玩家在3条线中的任何一条上,则敌人只会检测到玩家,我想向敌人添加更多的射线投射。我问了一下,有人说用for循环添加更多的raycast,但是我不熟悉raycasting,所以我需要帮助。下面的照片附件是我现在拥有的以及我想要的ai raycast。
public class enemyControl : MonoBehaviour
{
Ray enemyRay;
public Color rayColor;
RaycastHit rayHit;
bool follow;
public float sightDist;
private float timer = 0f;
public float heightMultiplier;
private Vector3 investigateSpot;
public float visionAngle;
private NavMeshAgent agent;
public GameObject him;
void Start()
{
agent = GetComponent<NavMeshAgent>();
him = GameObject.FindGameObjectWithTag("Player");
heightMultiplier = 1.36f;
}
void Update()
{
timer += Time.deltaTime;
enemyRay = new Ray(transform.position, transform.forward * sightDist);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, transform.forward* sightDist, rayColor);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, (transform.forward + transform.right).normalized * sightDist, rayColor);
Debug.DrawRay(transform.position + Vector3.up * heightMultiplier, (transform.forward - transform.right).normalized * sightDist, rayColor);
if (Physics.Raycast(transform.position + Vector3.up * heightMultiplier, transform.forward, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
if (Physics.Raycast(transform.position + Vector3.up* heightMultiplier, (transform.forward + transform.right).normalized, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
if (Physics.Raycast(transform.position + Vector3.up* heightMultiplier, (transform.forward - transform.right).normalized, out rayHit, sightDist))
{
if (rayHit.collider.gameObject.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = rayHit.collider.gameObject;
}
}
}
void OnTriggerEnter(Collider coll)
{
if (coll.tag == "Player")
{
agent.SetDestination(him.transform.position);
him = coll.gameObject;
}
}
}
答案 0 :(得分:1)
对其进行了尝试并为我工作,它可以检测到与多个射线广播相撞的播放器。但是很难将玩家定位到这个位置
因为它接近射线的起源调试成功
脚本中的本机变量
public Color rayColor;
RaycastHit rayHit;
public float sightDist;
public float heightMultiplier;
public float visionAngle;
public GameObject him;
我添加了这些变量:
private bool rayIsDrawn = false;
[SerializeField]
private int raycastCount = 10;
private float RightRay;
private float LeftRay;
“ raycastCount”定义了光线的总数。
void Start()
enter code here
void Start()
{
him = GameObject.FindGameObjectWithTag("Player");
heightMultiplier = 1.36f;
}
void Update()。这是绘制射线的代码。 Ray0是笔直向前绘制的,而下一条光线是根据i数左右绘制的;我将射线方向的y轴用于右射线,visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay
,将左射线设置为-visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay
。
void Update()
{
if (rayIsDrawn == false) {
for (int i = 0; i < raycastCount; i++) {
if (i == 0) {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, transform.forward * sightDist, rayColor, Mathf.Infinity);
} else if (i % 2 != 0) {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay, 0) * transform.forward * sightDist, rayColor, Mathf.Infinity);
RightRay++;
} else {
Debug.DrawRay (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, -visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay, 0) * transform.forward * sightDist, rayColor, Mathf.Infinity);
LeftRay++;
}
}
rayIsDrawn = true;
}
RightRay = 0;
LeftRay = 0;
这是射线源和方向与绘制的射线相同的射线投射。
for (int i = 0; i < raycastCount; i++) {
if (i == 0) {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
} else if (i % 2 != 0) {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, visionAngle / 2 - visionAngle / (raycastCount-1) * RightRay, 0) * transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
RightRay++;
} else {
if (Physics.Raycast (transform.position + Vector3.up * heightMultiplier, Quaternion.Euler (0, -visionAngle / 2 + visionAngle / (raycastCount-1) * LeftRay, 0) * transform.forward, out rayHit, sightDist)) {
if (rayHit.collider.tag == "Player") {
Debug.Log ("touched by ray "+(i+1));
}
}
LeftRay++;
}
}
RightRay = 0;
LeftRay = 0;
}