我目前正在从事一个涉及堆积积木的实践项目。它有点类似于堆叠器游戏(街机游戏),除了我的版本使用自由形式的移动而不是基于网格的移动。
我有3个预制块:SingleBlock,DoubleBlock,TripleBlock。
我按照这样的方式对每个人进行了结构化:父对象是一个空的游戏对象,我的BoxCollider2D
向左/向右移动它们,而子对象是带有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");
}
}
的块精灵。
MovementScript附加到空游戏对象(父对象),以便块集向左/向右均匀移动,以实现它的价值。
对于实际的堆叠逻辑,我使用Raycast2D来检测下面是否有一个块。但问题是我得到的结果是出乎意料的。
以下是我当前代码的片段:
true
每次播放器停止正在移动的当前块集时,都会调用此代码。
问题是我总是在我的日志中获得false
,即使我故意没有正确对齐块集。即使离开我的路线,我也永远不会得到Raycast2D
。为什么会这样?
我想提一下场景中没有别的东西。它只是块,所以不能与另一个物体碰撞。
逻辑是否有问题,或者我使用owl:class1 rdfs:subClassOf [restriction1...], [restriction2...], [restriction3].
owl:class2 rdfs:subClassOf [restriction1...], [restriction2...].
的方式是什么?
感谢任何帮助。
答案 0 :(得分:1)
我相信发生的事情是他们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源自的对象。
为了解决这个问题,我建议将一个空的子GameObject添加到名为" RaycastOrigin"的块中。将此GameObject放置在块的下方,使其位于块的盒子对撞机之外。然后你从" RaycastOrigin"中解雇你的Raycast。而不是块transform.position
这样一来,Raycast就不会碰到它的射击,而是在它下面的一个区块。