Unity3d Raycast仅返回false,即使预期为true

Unity3d Raycast仅返回false,即使预期为true,unity3d,Unity3d,我有以下followingpc游戏对象,如果有直视,它应该跟随Player对象: 这里是播放器对象: BlockingLayer和Player层之间启用了物理碰撞: followNPC附加了以下脚本,该脚本始终返回“未命中”结果:Raycast always false。这不是预期的输出,因为两个对象之间似乎有一个清晰的视图,并且可以毫无问题地绘制调试光线 公共类:单一行为 { 专用矢量3航向、方向; 私人浮动距离; 无效更新() { heading=GameObject.FindGame

我有以下
followingpc
游戏对象,如果有直视,它应该跟随
Player
对象:

这里是
播放器
对象:

BlockingLayer
Player
层之间启用了物理碰撞:

followNPC
附加了以下脚本,该脚本始终返回“未命中”结果:Raycast always false。这不是预期的输出,因为两个对象之间似乎有一个清晰的视图,并且可以毫无问题地绘制调试光线

公共类:单一行为
{
专用矢量3航向、方向;
私人浮动距离;
无效更新()
{
heading=GameObject.FindGameObjectWithTag(“玩家”).transform.position-transform.position;
距离=航向。震级;
方向=航向/距离;
雷卡斯特击中;
if(物理光线投射(变换、位置、方向、出击))
{
if(hit.transform==GameObject.FindGameObjectWithTag(“Player”).transform)
{
Debug.DrawRay(transform.position,direction*distance,Color.red);
Log(“命中播放器”);
}
其他的
{
Debug.DrawRay(transform.position,direction*distance,Color.yellow);
Log(“撞墙”);
}
}
其他的
{
Debug.DrawRay(transform.position,direction*distance,Color.white);
Log(“未命中”);
}
}
}

已解决:

根据建议,此处应使用Physics2D.Raycast。此函数不返回bool,因此这是适用于我的实现:

void Update()
{
heading=GameObject.FindGameObjectWithTag(“玩家”).transform.position-transform.position;
RaycastHit2D hit=Physics2D.Raycast(transform.position,heading.normalized,LayerMask.GetMask(“播放器”);
if(hit.collider!=null)
if(hit.transform==GameObject.FindGameObjectWithTag(“Player”).transform)
Log(“命中播放器”);
其他的
Log(“撞墙”);
其他的
Log(“未命中”);
}

另外,需要注意的是,即使使用了遮罩,光线投射也会使用
FolloginNPC
的碰撞器返回命中,因此我必须禁用它。我必须做一些调查或寻找解决办法。

注意,在Unity中,
物理
物理2D
是完全独立和分离的引擎

  • 内置3D物理(Nvidia PhysX引擎集成)
  • 内置2D物理(Box2D引擎集成)
您有
Rigidbody2D
collizer2d
,因此您更希望使用

您还应该强烈避免在
更新中多次使用
FindGameObjectWithTag
,甚至更糟糕,因为这相当昂贵!而是做一次并存储结果

//如果可能,最好是已经通过Inspector引用了它
[SerilaizeField]私人转换玩家;
//作为后备,在运行时获取一次
私人空间
{
如果(!player)player=GameObject.FindGameObjectWithTag(“player”).transform;
}
无效更新()
{
//事实上,这些不需要是字段
标题=player.position-transform.position;
距离=航向。震级;
//这句话其实没必要
//如果有什么我会用的
//方向=航向。标准化
方向=航向/距离;
var hit=Physics2D.Raycast(transform.position,direction);
if(命中对撞机)
{
if(hit.transform==player)
{
Debug.DrawRay(transform.position,direction*distance,Color.red);
Log(“命中播放器”);
}
其他的
{
Debug.DrawRay(transform.position,direction*distance,Color.yellow);
Log(“撞墙”);
}
}
其他的
{
Debug.DrawRay(transform.position,direction*distance,Color.white);
Log(“未命中”);
}
}

稍后您还应该删除所有这些
Debug.Log
,因为在
Update
中执行这些操作时成本也相当高

注意,在Unity中,
物理
物理2D
是完全独立和分离的引擎

  • 内置3D物理(Nvidia PhysX引擎集成)
  • 内置2D物理(Box2D引擎集成)
您有
Rigidbody2D
collizer2d
,因此您更希望使用

您还应该强烈避免在
更新中多次使用
FindGameObjectWithTag
,甚至更糟糕,因为这相当昂贵!而是做一次并存储结果

//如果可能,最好是已经通过Inspector引用了它
[SerilaizeField]私人转换玩家;
//作为后备,在运行时获取一次
私人空间
{
如果(!player)player=GameObject.FindGameObjectWithTag(“player”).transform;
}
无效更新()
{
//事实上,这些不需要是字段
标题=player.position-transform.position;
距离=航向。震级;
//这句话其实没必要
//如果有什么我会用的
//方向=航向。标准化
方向=航向/距离;
var hit=Physics2D.Raycast(transform.position,direction);
if(命中对撞机)
{
if(hit.transform==player)
{
Debug.DrawRay(transform.position,direction*distance,Color.red);
Log(“命中播放器”);
}
其他的
{
Debug.DrawRay(transform.position,direction*distance,Color.yellow);
Log(“撞墙”);
}