首页 > 解决方案 > 如何从 Box Collider2D 中获取随机点

问题描述

我试图在 Box Collider2D 的随机点产生粒子效果。我知道如何为 PolygonCollider2D 执行此操作,但只是想知道是否有类似的方法可以为 Box Collider2D 执行此操作。我正在尝试将此代码转换为 Box Collider。有人可以指出我正确的方向吗?

PolygonCollider2D col = GetComponent<PolygonCollider2D>();
int index = Random.Range(0, col.pathCount);
Vector2[] points = col.GetPath(index)
Vector2 spawnPoint = Random.Range(0, points.Length);

标签: c#unity3dcollider

解决方案


不,您没有 Box Collider 表面的任何坐标数据。但是你可以计算出来。

假设你的盒子是 2a 宽和 2b 高。

当然你可以先分配两个随机值来决定,x = abs(a) || y = abs(b)从而对应y = rand(-b,b) || x = rand(-a, a)。但这并不优雅(至少我认为)。

因此,让我们在极坐标中进行如下操作,其中您只能生成一个从 0 到 360 的随机值作为 theta。

Vector2 calCoor(double theta, int a, int b)
{
    double rad = theta * Math.PI / 180.0;
    double x, y;
    double tan = Math.Tan(rad);
    if (Math.Abs(tan) > b/ (double)a)
    {
        x = tan > 0 ? a : -a;
        y = b / Math.Tan(rad);
    } else
    {
        x = a * Math.Tan(rad);
        y = tan < 0 ? b : -b;
    }
    return new Vector2(x,y);
}

不要忘记将此 vector2 添加回您的 Box Collider 的坐标。

您可以在此处找到将矩形从笛卡尔坐标转换为极坐标的 eqn 。


推荐阅读