如何仅投射一个目标Unity C#

时间:2015-08-29 05:04:20

标签: c# unity3d raycasting

你好我们一直致力于我的项目在FPS游戏上为AI创建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;  }
                }
        }
    }
}

我已经尝试了很多方法,但仍然没有工作,我还是新手:D所以也许你们可以帮助我。这里的问题是,如果一个目标已经在视线中(玩家洞察力应该是真的)而另一个目标进入视野内但被障碍覆盖,玩家的洞察力将触发错误。这是因为这个剧本会让任何人都进入那个视野,所以我只是想要只有一个目标进行光线投射而不是再次进行光线投射。也许这对你们来说是一个新手问题,我很抱歉问一个新手问题,但我现在非常紧张,请帮助我谢谢你。

脚本上的问题可能是if语句或ontriggerstay()?

2 个答案:

答案 0 :(得分:0)

您可以暂时将目标图层更改为特殊图层,例如“hittest”,并确保现在没有其他游戏对象属于此图层,然后仅在该图层上进行光线投射。记得在测试完成后将目标层恢复到原始层。我是用手机发帖的,所以我目前无法编写代码,但如果你需要将来的助手我可以提供一些示例代码。

答案 1 :(得分:0)

我不知道你的情景是什么,但这可能会奏效:

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