如何光线投射只有一个目标Unity c#

本文关键字:目标 Unity 有一个 光线投射 | 更新日期: 2023-09-27 18:10:22

你好伙计们,我一直在我的项目中工作,为AI在FPS游戏中创建FSM,我有一个关于光线投射的问题,如果只有一个目标我的代码工作如此完美,但如果有两个目标或更多我有一些问题,我只是想光线投射只有一个目标,但我不知道如何做到这一点,这里是我使用ontriggerstay的光线投射代码

void OnTriggerStay (Collider other)
{
    if(other.gameObject.tag == "CT")
    {
        collideWithPlayer = true;
        Vector3 direction = other.transform.position - transform.position;
        float angle = Vector3.Angle(direction, transform.forward);
        if(angle < fieldOfViewAngle * 0.5f )
        {
            RaycastHit hit;
            if((Physics.Raycast(transform.position , direction, out hit, col.radius)))
            {
                Debug.DrawRay (transform.position, hit.point - transform.position, Color.cyan);
                if(hit.collider.gameObject.tag == "CT")
                {
                        aliveTarget = hit.point;
                        playerInSight = true;
                        transform.LookAt(aliveTarget);
                }
                else if ((hit.collider.gameObject.tag != "CT") ) {playerInSight = false;  }
                }
        }
    }
}

我尝试了很多方法,但仍然没有工作,我是新手,所以也许你们可以帮助我。这里的问题是,如果一个目标已经在视线范围内(玩家的洞察力应该是真实的),而另一个目标进入视野范围内,但被障碍物覆盖,那么玩家的洞察力将触发错误。这是因为这个脚本会对任何人进行光线投射,所以我只想对一个目标进行光线投射,当视线上有目标时不再进行光线投射。也许这对你们来说是一个新手问题,我很抱歉问了一个新手问题,但我现在压力很大,请帮助我,谢谢。

也许脚本上的问题是在if语句或ontriggerstay()上?

如何光线投射只有一个目标Unity c#

你可以暂时将目标层更改为一个特殊的层,例如,"hittest",并确保现在没有其他游戏对象属于该层,然后仅在该层上进行光线投射。测试结束后记得将目标层恢复到原来的图层。我从手机发帖,所以我不能写代码目前,但我可以提供一些示例代码以后,如果你需要未来的助手。

我不知道你的情况是什么,但这可能有用:

if(angle < fieldOfViewAngle * 0.5f )
{
    RaycastHit hit;
    if(Physics.Raycast(transform.position , direction, out hit, col.radius))
    {
        Debug.DrawRay (transform.position, hit.point - transform.position, Color.cyan);
        if (hit.collider.gameObject.tag == "CT")
        {
            aliveTarget = hit.point;
            playerInSight = true;
            transform.LookAt(aliveTarget);
        }
    }
    else
    {
        playerInSight = false;
    }
}