Unity Raycast2D 结果不如预期?
Unity Raycast2D results are not as expected?
我目前正在做一个涉及积木堆叠的练习项目。它有点类似于堆叠游戏(街机游戏),除了我的版本使用自由形式的移动而不是基于网格的移动。
我有 3 个积木预制件:SingleBlock、DoubleBlock、TripleBlock。
我这样构造它们中的每一个:父对象是一个空的游戏对象,我的 MovementScript
移动它们 left/right,而子对象是带有 BoxCollider2D
的方块精灵。
MovementScript 附加到空游戏对象(父对象),以便块集统一移动 left/right,物有所值。
对于实际的堆叠逻辑,我使用Raycast2D 来检测下面是否有块。但问题是我得到的结果是出乎意料的。
这是我当前代码的一个片段:
foreach(Transform t in currentBlockSet.transform)
{
// get all the children of this blockset. to do this, we use the transform beause it is IEnumerable
GameObject block = t.gameObject;
RaycastHit2D hit = Physics2D.Raycast(block.transform.position, Vector3.down, rayCastLength); // 0.5f raycast length
//Debug.DrawRay(block.transform.position, Vector3.down * rayCastLength);
if(hit.collider != null)
{
// this means there is a block below, we hit something
Debug.Log("True");
}
else
{
Debug.Log("False");
}
}
每次玩家停止正在移动的当前块集时都会调用此代码。
问题是我的日志中总是出现 true
,即使我故意没有正确对齐块集。我从来没有得到 false
即使我偏离了我的对齐方式。为什么会这样?
我想说的是场景中没有其他东西。只是方块而已,不可能有别的物体碰撞。
我的逻辑或使用方式是否有问题 Raycast2D
?
感谢任何帮助。
我相信正在发生的事情是 Raycast2D 正在检测它发射的方块。由于您使用块的 transform.position
作为 Raycast 的原点,这意味着 Raycast 将从块的中心发射。
为了对此进行测试,我稍微修改了您的代码,以便它以相同的方式触发 Raycast,但不是只记录 "True" 我记录了被击中的对象的名称。
void Update ()
{
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, Vector3.down, 0.5f); // 0.5f raycast length
if (hit.collider != null)
{
Debug.Log(hit.collider.gameObject.name);
}
else
{
Debug.Log("False");
}
当 运行 时,Raycast 检测到的对象正如预期的那样是 Raycast 的来源对象。
为了解决这个问题,我建议将一个空的子游戏对象添加到您的名为 "RaycastOrigin" 的块中。将此 GameObject 放置在块的正下方,使其位于块的盒子碰撞器之外。然后你从 "RaycastOrigin" 而不是方块 transform.position
发射 Raycast 这样,Raycast 就不会击中其发射的方块,而是下方的方块。
我目前正在做一个涉及积木堆叠的练习项目。它有点类似于堆叠游戏(街机游戏),除了我的版本使用自由形式的移动而不是基于网格的移动。
我有 3 个积木预制件:SingleBlock、DoubleBlock、TripleBlock。
我这样构造它们中的每一个:父对象是一个空的游戏对象,我的 MovementScript
移动它们 left/right,而子对象是带有 BoxCollider2D
的方块精灵。
MovementScript 附加到空游戏对象(父对象),以便块集统一移动 left/right,物有所值。
对于实际的堆叠逻辑,我使用Raycast2D 来检测下面是否有块。但问题是我得到的结果是出乎意料的。
这是我当前代码的一个片段:
foreach(Transform t in currentBlockSet.transform)
{
// get all the children of this blockset. to do this, we use the transform beause it is IEnumerable
GameObject block = t.gameObject;
RaycastHit2D hit = Physics2D.Raycast(block.transform.position, Vector3.down, rayCastLength); // 0.5f raycast length
//Debug.DrawRay(block.transform.position, Vector3.down * rayCastLength);
if(hit.collider != null)
{
// this means there is a block below, we hit something
Debug.Log("True");
}
else
{
Debug.Log("False");
}
}
每次玩家停止正在移动的当前块集时都会调用此代码。
问题是我的日志中总是出现 true
,即使我故意没有正确对齐块集。我从来没有得到 false
即使我偏离了我的对齐方式。为什么会这样?
我想说的是场景中没有其他东西。只是方块而已,不可能有别的物体碰撞。
我的逻辑或使用方式是否有问题 Raycast2D
?
感谢任何帮助。
我相信正在发生的事情是 Raycast2D 正在检测它发射的方块。由于您使用块的 transform.position
作为 Raycast 的原点,这意味着 Raycast 将从块的中心发射。
为了对此进行测试,我稍微修改了您的代码,以便它以相同的方式触发 Raycast,但不是只记录 "True" 我记录了被击中的对象的名称。
void Update ()
{
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, Vector3.down, 0.5f); // 0.5f raycast length
if (hit.collider != null)
{
Debug.Log(hit.collider.gameObject.name);
}
else
{
Debug.Log("False");
}
当 运行 时,Raycast 检测到的对象正如预期的那样是 Raycast 的来源对象。
为了解决这个问题,我建议将一个空的子游戏对象添加到您的名为 "RaycastOrigin" 的块中。将此 GameObject 放置在块的正下方,使其位于块的盒子碰撞器之外。然后你从 "RaycastOrigin" 而不是方块 transform.position
发射 Raycast 这样,Raycast 就不会击中其发射的方块,而是下方的方块。