首页 > 解决方案 > 对敌人 AI 进行多次射线投射

问题描述

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

敌人RaycastImage

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

标签: unity3draycasting

解决方案


试过了,对我有用,它可以检测到与多个光线投射发生碰撞的玩家。但是很难将玩家定位到这个位置 碰撞位置 ,因为它靠近射线原点。调试和工作 射线调试

脚本中的本机变量

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' 定义了光线的总数。

无效开始()

enter code here
void Start()
{
    him = GameObject.FindGameObjectWithTag("Player");
    heightMultiplier = 1.36f;
}

无效更新()。这是绘制射线的代码。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;    
}

在此处输入图像描述


推荐阅读