簡體   English   中英

在 Linerenderer 下檢測游戲對象

[英]Detecting Gameobjects under Linerenderer

我制作了一個LineRenderer並向其中添加了一個EdgeCollider2D

現在我正在嘗試檢測我的GameObjects下的所有游戲LineRenderer 下面的對象也有 Colliders。

  • LineRenderer從第一個鼠標 position 開始,到最后一個鼠標 position 結束
  • LineRenderer有一個EdgeCollider2D
  • 我需要從LineRenderer下的所有對象中獲取價值
  • 項目是二維的

我嘗試了什么:

  • 使用 Raycast,但使用 raycast 我也從 object 獲取值。

    我只想獲取 Linerenderer 下的游戲對象的值,而不是鼠標觸摸的所有游戲對象的值

  • 或者如果有可能在 2 個位置之間獲取游戲對象*所以基本上我需要從 100 個對象中的 10 個對象中獲取值,它們都在一起。FE 我有 100 個蘑菇放在一起,每個蘑菇都有其不同的 int 值。 所以移動我的鼠標我需要 select 只有這 10 個蘑菇並取它的值。

到目前為止,這是我的代碼

RaycastHit2D[] rays = Physics2D.RaycastAll(mousePos, lr.transform.forward);
Debug.DrawRay(new Vector3(startMousePosition.x, startMousePosition.y, 0), Vector3.up, Color.red, 5);
for (int i = 0; i < rays.Length; i++)
{
    RaycastHit2D ray = rays[i];

    if (isTOuched)
    {
        if (ray.collider.gameObject.tag == "Player")
        {
            if (objektiOdRaycast.Contains(ray.collider.gameObject) == false)
            {
                objektiOdRaycast.Add(ray.collider.gameObject);
                for (int t = 0; t < objektiOdRaycast.Count; t++)
                {
                    tekst = objektiOdRaycast[t].GetComponent < GridSquare().tekst;
                }

                words.tekstSlova.text += tekst;
            }
        }
    }
}

Raycast的問題是:它只檢查一個單一的光線方向。 這在您的用例中沒有意義。

你可能想使用Physics2D.OverlapCollider

獲取與給定 Collider 重疊的所有 Collider 的列表。

並做例如

// Reference via the Inspector
public LineRenderer theLine;
// configure via the Inspector
public ContactFilter2D filter;

private Collider2D lineCollider;

private readonly List<Collider2D> overlaps = new List<Collider2D>();
private readonly HashSet<Collider2D> alreadySeen = new HashSet<Collider2D>();

private void Awake()
{
    // as fallback assume same GameObject
    if(!theLine) theLine = GetComponent<LineRenderer>();

    lineCollider = theLine.GetComponent<Collider2D>();
}

public void GetOverlappingObjects()
{
    var amount = Physics2D.OverlapCollider(lineCollider, filter, overlaps);

    for(var i = 0; i < amount; i++)
    {
        var overlap = overlaps[i];

        if(alreadySeen.Contains(overlap)) continue;

        alreadySeen.Add(overlap);

        var overlapObject = overlap.gameObject;

        // These checks are actually kind of redundant
        // the second heck for the component should already be enough
        // instead of the tag you could rather use a Layer and configure the filter accordingly
        if (!overlapObject.CompareTag("Player")) continue;
        if (!overlapObject.TryGetComponent<GridSquare>(out var gridSquare)) continue;
        
        words.tekstSlova.text += gridSquare.tekst; 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM