对敌人ai进行多次射线广播

问题描述 投票:-1回答:1

我具有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;
        }
    }
}
unity3d raycasting
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.