如何光线投射只有一个目标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()上?
你可以暂时将目标层更改为一个特殊的层,例如,"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;
}
}