【问题标题】:Drawing collider boundaries (Unity)绘制碰撞器边界(Unity)
【发布时间】:2020-12-23 15:54:13
【问题描述】:

大家!

我遇到了问题。我需要画出敌人攻击的半径。半径需要与悬挂在其上的 SphereCollider 的半径相等。我试图在绘制圆圈的 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;
    }

【问题讨论】:

  • 嗯.. 你的radius 是什么?你从哪里得到的?还要注意,对撞机的最终大小还取决于对象的有损比例(所有父级和本地比例相结合)
  • 统一的“Gizmos”对这里有帮助吗?
  • @Fattie 听起来应该是在内置而不是在 SceneView 中
  • @derHugo 我不明白“你的半径是多少”是什么意思。我只有一个私有变量“radius”并定义它是这样的:“radius = _collider.radius”。但是你告诉我有损比例尺,因此我有一个问题,如何让我的对撞机更精细?
  • @gh272b 看到这就是我的假设,但没有在您的代码中看到它,我们怎么知道您从哪里获得半径值? ;) 现在下一个问题是:您的对象或其任何父对象的缩放比例是否与1,1,1 不同? .. 那segments + + 2 也是错字吗?

标签: c# unity3d game-development


【解决方案1】:

在您提到的 cmets 中,您的半径来自

float radius = _collider.radius;

其中_collider 是您的SphereCollider

所以请注意SphereCollider.radius

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

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

在我看来,您的对象或其父对象之一的缩放比例与1,1,1 不同,在这种情况下,实际的最终半径将受到该比例的影响。

您需要通过transform.lossyScale 相应地缩放半径,例如

// 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;

【讨论】:

    【解决方案2】:

    这有点笨拙,但我使用球体轮廓精灵来处理这类事情。只需将它放在游戏对象上并确保它的缩放比例与您的对撞机相同。不需要花哨的线条画。

    【讨论】:

      【解决方案3】:

      不要在敌人的攻击范围内使用对撞机组件!

      您应该通过代码和物理添加一个对撞机,而不是添加一个圆形对撞机组件

      你应该怎么做?

      这是一个通过代码和物理使用碰撞器的示例:

      float theCircleRadios = /* You radios */;
      Collider2D[] detectedEnemiesColliders = Physics2D.OverlapCircleAll(theCirclePosition, theCircleRadios, DetectedLayers);
      

      那么请拨打lineRenderer radios == theCircleRadios

      【讨论】:

      • 这是一个变体,但要做到这一点,我需要更改大部分代码。而且我也知道 Unity 的这个特性并在开始时使用它,但在这个项目中很难实现,我决定使用碰撞器。不过还是谢谢你的建议!
      猜你喜欢
      • 2022-06-29
      • 2011-04-21
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多