这基本上是两个网格,其中后面的一个将是不可见的(禁用渲染),但我已将其保留为上下文。
目标是从后面网格中的每个图块创建一个光线投射,检测前面是否有东西,然后更改该图块标记。
我的代码如下所示:
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";
}
}
}
但是调试光线甚至没有显示,标签也没有改变。
编辑:程序员试图帮助我,但他的解决方案对我不起作用。他提到这个问题可能在其他地方,所以如果有人对他感兴趣,继承我的项目:https://www.dropbox.com/s/535soeswrgq37b4/MTA16336_Project_Boardgame.rar?dl=0答案 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
。