从GameObject到GameObject的Raycast检测

时间:2016-11-01 09:18:02

标签: c# unity3d

我创建了当前的设置: enter image description here

这基本上是两个网格,其中后面的一个将是不可见的(禁用渲染),但我已将其保留为上下文。

目标是从后面网格中的每个图块创建一个光线投射,检测前面是否有东西,然后更改该图块标记。

我的代码如下所示:

 int tileNumber = 0;
        for (float y = 0; y > mapHeight; y--)
        {
            for (float x = 0; x < mapWidth; x++)
            {
                tile.GetComponent<Renderer>().enabled = true;
                GameObject go = Instantiate(tile, new Vector3(x/3, y/3, -2), Quaternion.identity) as GameObject;
                tileNumber++;
                go.name = "tile" + tileNumber;
                go.tag = "grid";

                RaycastHit hit;
                Vector3 fwd = go.transform.TransformDirection(Vector3.forward);
                Debug.DrawRay(go.transform.position, fwd * 50, Color.green);
                if(Physics.Raycast(go.transform.position, fwd, out hit, 200)){
                    go.tag = "walkableGrid";
                }

            }
        }

但是调试光线甚至没有显示,标签也没有改变。

显示光线的图像确实有效,只是没有检测到我的地图网格: enter image description here

编辑:程序员试图帮助我,但他的解决方案对我不起作用。他提到这个问题可能在其他地方,所以如果有人对他感兴趣,继承我的项目:https://www.dropbox.com/s/535soeswrgq37b4/MTA16336_Project_Boardgame.rar?dl=0

1 个答案:

答案 0 :(得分:0)

  

它没有任何价值,我的&#34; Map&#34;对象既没有   rigibody也不是对撞机。

Physics.Raycast 从不在没有碰撞器的情况下工作。

由于这是2D游戏,您必须使用 Box collider 2D 。 另外,请附上Rigidbody 2D

最后,Physics.Raycast仅用于 2D对撞机。您必须将其替换为RaycastHit2D.Raycast。此外,RaycastHit应该被替换为RaycastHit2D

为了方便起见,只需更改:

RaycastHit hit;
Vector3 fwd = go.transform.TransformDirection(Vector3.forward);
Debug.DrawRay(go.transform.position, fwd * 50, Color.green);
if (Physics.Raycast(go.transform.position, fwd, out hit, 200))
{
    go.tag = "walkableGrid";
}

RaycastHit2D hit;
Vector3 fwd = go.transform.TransformDirection(Vector3.forward);
Debug.DrawRay(go.transform.position, fwd * 50, Color.green);
hit = Physics2D.Raycast(go.transform.position, fwd, 200);

if (hit)
{
    go.tag = "walkableGrid";
}

只要Box Collider 2D附加到每个块,现在就可以工作了。同时将Rigidbody 2D附加到他们身上。如果它正在下降,请将重力比例设置为0