C# 绘制碰撞器边界(统一)

C# 绘制碰撞器边界(统一),c#,unity3d,game-development,C#,Unity3d,Game Development,各位! 我遇到了这个问题。我需要画出敌人攻击的半径。半径必须等于悬挂在其上的球形准直器的半径。我试着在画圆的LineRenderer的帮助下做这件事。是的,实际上它画的圆是正确的,但是我的圆的半径小于它上面碰撞器的半径,尽管我已经从GetComponent中给出了一个变量的值 有人知道问题出在哪里吗 我的部分代码: float x; float z; float change = 2 * (float)Math.PI / segments; float angl

各位!

我遇到了这个问题。我需要画出敌人攻击的半径。半径必须等于悬挂在其上的球形准直器的半径。我试着在画圆的LineRenderer的帮助下做这件事。是的,实际上它画的圆是正确的,但是我的圆的半径小于它上面碰撞器的半径,尽管我已经从GetComponent中给出了一个变量的值

有人知道问题出在哪里吗

我的部分代码:

    float x;
    float z;

    float change = 2 * (float)Math.PI / segments;
    float angle = change;

    x = Mathf.Sin(angle) * radius;
    _line.SetPosition(0, new Vector3(x, 0, Mathf.Cos(angle) * radius));

    for (int i = 1; i < (segments + + 2); i++)
    {
        x = Mathf.Sin(angle) * radius;
        z = Mathf.Cos(angle) * radius;

        yield return new WaitForSeconds(drawSpeed);
        _line.SetPosition((int)i, new Vector3(x, 0, z));

        angle += change;
    }

这有点粗糙,但我用了一个球体轮廓精灵来做这类事情。只需将其放在游戏对象上,并确保其缩放与碰撞器相同。不需要画花哨的线条。

不要在敌人的攻击范围内使用对撞机组件! 您应该通过代码和物理创建一个碰撞器,而不是添加一个圆碰撞器组件

你该怎么办? 这是一个通过代码和物理使用碰撞器的示例:


然后将线条渲染器的半径设置为=圆。

在您提到的注释中,从中获取半径

float radius = _collider.radius;
对撞机是你的球体对撞机

所以请注意

在对象的局部空间中测量的球体半径

球体半径将按变换的比例缩放

在我看来,您的对象或其父对象的缩放方式不同于1,1,1,在这种情况下,实际的最终半径将受到该缩放的影响

您需要相应地按如下方式缩放半径:

// Get the lossyScale
// this is the localScale of all parent objects and this localScale combined
var lossyScale = _collider.transform.lossyScale;

// find the biggest extends of the lossyScale
// if you already know they are always equal anyway simply use e.g. lossyScale.x instead   
float maxScale = 0;
for(var i = 0; i < 3; i++)
{
   maxScale = Mathf.Max(maxScale, Mathf.Abs(lossyScale[i]);
}

float radius = _collider.radius * maxScale;

好你的半径是多少?从哪里得到的?另外请注意,碰撞器的最终大小也取决于有损比例所有父对象和对象的本地比例的组合unity中的Gizmos有帮助吗?@Fattie听起来应该是内置的,而不是内置的SceneView@derHugo我不明白你的半径是多少。我只是有一个私有变量radius,定义如下:radius=\u collider.radius。但是你告诉我有损尺度,正因为如此,我有一个问题,如何得到我的对撞机的精细尺寸?@gh272b看到这是我假设的,但在你的代码中没有看到它,我们怎么知道你从哪里得到半径的值;现在,下一个问题是:您的对象或其任何父对象是否以某种方式缩放为不同的1,1,1。。另外,segments++2是一个打字错误吗?它是一个变体,但要做到这一点,我需要修改我的大部分代码。我也知道Unity的这个特性,并在一开始就使用了它,但在这个项目中很难实现,我决定用Collider来实现它。不过还是要谢谢你的建议!
// Get the lossyScale
// this is the localScale of all parent objects and this localScale combined
var lossyScale = _collider.transform.lossyScale;

// find the biggest extends of the lossyScale
// if you already know they are always equal anyway simply use e.g. lossyScale.x instead   
float maxScale = 0;
for(var i = 0; i < 3; i++)
{
   maxScale = Mathf.Max(maxScale, Mathf.Abs(lossyScale[i]);
}

float radius = _collider.radius * maxScale;