【问题标题】:Mesh Collider that detects transparency检测透明度的网格碰撞器
【发布时间】:2017-04-15 00:33:41
【问题描述】:

我有很多用于放置在四边形上的 2D 项目的网格(作为四边形的材质)。它们就像“地图”;从内部填充,但边缘透明。

我为每个地图制作了一个多边形对撞机并将其放在它上面,这样我就可以使用Physics2D.Raycast() 来检测用户是否将对象放置在地图上或地图外。它们就像形状(多边形)。

制作多边形对撞机的过程非常耗时,而且质量不太好。是否有一些网格对撞机可以检测透明度并因此将自己塑造成地图的形状?或者有没有办法制作一个脚本,将碰撞器塑造成地图的形状?

【问题讨论】:

  • 你可以编写一个脚本来计算你的精灵的非透明像素的凸包来近似碰撞区域。这些点可以连接起来形成你的多边形对撞机
  • 米娜,你有没有偶然解决这个问题?

标签: unity3d


【解决方案1】:

原来Polygon Collider 2D 具有为这种透明网格生成多边形的功能。只需将精灵拖放到多边形碰撞器组件上即可。

【讨论】:

  • 他说他有四边形,而不是精灵。他在 3d 中工作。
  • 这救了我的培根!我陷入了一个试图在每个点上绘制手柄以允许点击和拖动机制的兔子洞!很高兴有这个功能!
【解决方案2】:

解决方法如下:使用 RaycastAll 检索所有命中的对象,然后返回最近的对象,使得像素的 alpha 值不为 0。

private static RaycastHit? RaycastWithTransparency(Ray ray)
{

    var res = Physics.RaycastAll(ray, float.MaxValue).ToList().OrderBy(h => h.distance);


    foreach (var h in res)
    {
        var col = h.collider;


        Renderer rend = h.transform.GetComponent<Renderer>();
        Texture2D tex = rend.material.mainTexture as Texture2D;
        var xInTex = (int) (h.textureCoord.x*tex.width);
        var yInTex = (int) (h.textureCoord.y*tex.height);
        var pix = tex.GetPixel(xInTex, yInTex);

        if (pix.a > 0)
        {
            //Debug.Log("You hit: " + col.name + " position " + h.textureCoord.x + " , " + h.textureCoord.y);
            return h;

        }
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2014-04-16
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多