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(“撞墙”);
}