对敌人AI进行多路雷播

时间:2018-10-20 07:02:38

标签: unity3d raycasting

我有一个带有3个射线投射的圆锥形,但是如果玩家在3条线中的任何一条上,则敌人只会检测到玩家,我想向敌人添加更多的射线投射。我问了一下,有人说用for循环添加更多的raycast,但是我不熟悉raycasting,所以我需要帮助。下面的照片附件是我现在拥有的以及我想要的ai raycast。

EnemyRaycastImage

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;
    }
}

}

1 个答案:

答案 0 :(得分:1)

对其进行了尝试并为我工作,它可以检测到与多个射线广播相撞的播放器。但是很难将玩家定位到这个位置 Collision position 因为它接近射线的起源调试成功 Ray Debug

脚本中的本机变量

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;    
}

enter image description here