C# 阻止光线投射穿过墙壁

C# 阻止光线投射穿过墙壁,c#,artificial-intelligence,raycasting,C#,Artificial Intelligence,Raycasting,所以我在做一个游戏,你必须能够躲开敌人。敌人看到我时会跟着我,但当我在我们之间筑起一堵墙时,光线投射忽略了这堵墙,使敌人仍然跟着我。我不使用图层,因为我真的不明白它们是做什么的。而且我甚至不知道我是否应该使用它们。这是我的敌人ai脚本,用c#: 使用UnityEngine; 使用系统集合; 公共类EnemyAI:MonoBehavior{ 私人游戏对象玩家目标; 私人球形校准器; 公共转型目标; 公共交通速度; 公共内部旋转速度; 公共距离; 私有变换; 公共国际射线测距仪; 公共向量3位置;

所以我在做一个游戏,你必须能够躲开敌人。敌人看到我时会跟着我,但当我在我们之间筑起一堵墙时,光线投射忽略了这堵墙,使敌人仍然跟着我。我不使用图层,因为我真的不明白它们是做什么的。而且我甚至不知道我是否应该使用它们。这是我的敌人ai脚本,用c#:

使用UnityEngine;
使用系统集合;
公共类EnemyAI:MonoBehavior{
私人游戏对象玩家目标;
私人球形校准器;
公共转型目标;
公共交通速度;
公共内部旋转速度;
公共距离;
私有变换;
公共国际射线测距仪;
公共向量3位置;
公共浮球;
无效开始()
{
playerTarget=GameObject.FindGameObjectWithTag(“玩家”);
col=GetComponent();
myTransform=转换;
GameObject go=GameObject.FindGameObjectWithTag(“玩家”);
character=GetComponent();
目标=go.transform;
var对角线=变换。变换方向(1,0,1);
位置=变换。位置变换。右*3;
}
字符控制器字符;
无效更新(){
}
void OnTriggerStay(碰撞器其他)
{
if(other.gameObject==playerTarget)
{   
雷卡斯特击中;
Vector3 dir=target.position-myTransform.position;dir.y=0;
Vector3 fwd=transform.TransformDirection(Vector3.forward*光线距离);
if(物理光线投射(变换位置、前进、出击、10))
{
if(hit.transform.gameObject==playerTarget)
{
Debug.Log(“输入Raycast”);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(dir),rotationSpeed*Time.deltaTime);
如果(方向幅值>最大距离)
{ 
character.Move(myTransform.forward*moveSpeed*Time.deltaTime);
} 
}
}
Debug.DrawRay(transform.position,fwd,Color.green);
Vector3 slightright=变换.TransformDirection(新的Vector3(光线方向,0,2)*光线距离);
if(Physics.Raycast(transform.position,SleetRight,out hit,10)){
if(hit.transform.gameObject==playerTarget)
{
Debug.Log(“输入右光线投射”);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(dir),rotationSpeed*Time.deltaTime);
如果(方向幅值>最大距离)
{ 
Log(“输入左光线投射移动函数”);
character.Move(myTransform.forward*moveSpeed*Time.deltaTime);
} 
}
}
Debug.DrawRay(transform.position,right,Color.magenta);
Vector3 right=transform.TransformDirection(新Vector3(光线方向,0,1)*光线距离);
if(Physics.Raycast(transform.position,right,out-hit,10)){
if(hit.transform.gameObject==playerTarget)
{
Log(“输入右光线投射”);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(dir),rotationSpeed*Time.deltaTime);
如果(方向幅值>最大距离)
{ 
character.Move(myTransform.forward*moveSpeed*Time.deltaTime);
} 
}
}
Debug.DrawRay(transform.position,right,Color.blue);
Vector3 left=变换.TransformDirection(新的Vector3(-RayDir,0,1)*RayDist);
if(物理光线投射(变换位置,左,外击,10)){
if(hit.transform.gameObject==playerTarget)
{
Log(“输入左光线投射”);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(dir),rotationSpeed*Time.deltaTime);
如果(方向幅值>最大距离)
{ 
Log(“输入左光线投射移动函数”);
character.Move(myTransform.forward*moveSpeed*Time.deltaTime);
} 
}
}
Debug.DrawRay(transform.position,左,Color.red);
Vector3 slinkleft=transform.TransformDirection(新Vector3(-RayDir,0,2)*RayDist);
if(物理光线投射(变换位置,轻微左击,外击,10)){
if(hit.transform.gameObject==playerTarget)
{
Log(“输入左光线投射”);
myTransform.rotation=Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(dir),rotationSpeed*Time.deltaTime);
如果(方向幅值>最大距离)
{ 
Log(“输入左光线投射移动函数”);
character.Move(myTransform.forward*moveSpeed*Time.deltaTime);
} 
}
}
Debug.DrawRay(transform.position,sliteleft,Color.cyan);
}
}

}

您没有检查被光线投射击中的对象是否确实是玩家。所以你的代码基本上是这样的:“如果这个光线投射命中了任何东西,跟随玩家。”要检查哪个对象被光线投射击中,只需创建一个光线投射命中对象并将其作为参数添加到物理中。光线投射调用。因此,您的第一个光线投射将如下所示:

RaycastHit hit;
if(Physics.Raycast(transform.position, fwd, out hit ,10))
{
    if (hit.transform.gameObject == playerTarget)
    {
        Debug.Log ("Raycast entered ");
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(dir), rotationSpeed * Time.deltaTime); 
        if (dir.magnitude > maxDistance) 
        { 
            character.Move(myTransform.forward * moveSpeed * Time.deltaTime); 
        }
    }
}

谢谢,但现在它给出了错误:NullReferenceException:Object reference未设置为对象的实例EnemyAI.OnTriggerStay(UnityEngine.Collider-other)(位于Assets/EnemyAI.cs:56)是否在光线投射调用中的“hit”前面添加了“out”?谢谢你,我想我还没那么清醒呢!它不再给出任何错误。我想我还是漏掉了一块?还是没用吗?确保你的墙有一个用于光线投射到hitI的对撞机在我的场景中有一个立方体和一个盒子对撞机,但是光线仍然穿过,敌人仍然聚焦在玩家身上。
RaycastHit hit;
if(Physics.Raycast(transform.position, fwd, out hit ,10))
{
    if (hit.transform.gameObject == playerTarget)
    {
        Debug.Log ("Raycast entered ");
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(dir), rotationSpeed * Time.deltaTime); 
        if (dir.magnitude > maxDistance) 
        { 
            character.Move(myTransform.forward * moveSpeed * Time.deltaTime); 
        }
    }
}