C# 找到并返回最近的带有标签Unity的游戏对象

C# 找到并返回最近的带有标签Unity的游戏对象,c#,list,unity3d,distance,gameobject,C#,List,Unity3d,Distance,Gameobject,我正在尝试做一个游戏,你必须合并两个游戏对象,才能得到下一个,所以一个。首先,我试着让当游戏对象被释放并且它接触到另一个游戏对象时,它会删除这两个对象,然后实例化下一个。但这并不完全有效,因为触发器相互“覆盖”或其他一些wierd。所以我想我可以检测到碰撞,这样每一个接触到触发器的游戏对象都会被添加到一个列表中,然后在退出时被删除。我不想弄明白的是如何计算游戏对象之间的距离,如果它们足够近(mergingthreshold),那么它们都会被破坏,下一个游戏对象会被实例化,但我不太明白如何计算和返

我正在尝试做一个游戏,你必须合并两个游戏对象,才能得到下一个,所以一个。首先,我试着让当游戏对象被释放并且它接触到另一个游戏对象时,它会删除这两个对象,然后实例化下一个。但这并不完全有效,因为触发器相互“覆盖”或其他一些wierd。所以我想我可以检测到碰撞,这样每一个接触到触发器的游戏对象都会被添加到一个列表中,然后在退出时被删除。我不想弄明白的是如何计算游戏对象之间的距离,如果它们足够近(mergingthreshold),那么它们都会被破坏,下一个游戏对象会被实例化,但我不太明白如何计算和返回这个距离,即什么是游戏对象。因此,所有的帮助将不胜感激!(不要漏掉任何细节,因为我是初学者) 谢谢

以下是迄今为止我得到的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Merging : MonoBehaviour
{
    List<GameObject> NearGameobjects = new List<GameObject>();


    void Start()
    { 
    }

    void Update()
    {
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == gameObject.tag)
        {
            Debug.Log("Enter!");
            NearGameobjects.Add(col.gameObject);
        }
    }


    void OnTriggerExit2D(Collider2D col)
    {
        if (col.gameObject.tag == gameObject.tag)
        {
            Debug.Log("Exit!");
            NearGameobjects.Remove(col.gameObject);
            
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类合并:单一行为
{
List NearGameobjects=新列表();
void Start()
{ 
}
无效更新()
{
}
无效OnTriggerEnter2D(碰撞的R2D列)
{
if(col.gameObject.tag==gameObject.tag)
{
Log(“回车!”);
NearGameobjects.Add(col.gameObject);
}
}
无效OnTriggerExit2D(碰撞的R2D列)
{
if(col.gameObject.tag==gameObject.tag)
{
Log(“退出!”);
NearGameobjects.Remove(col.gameObject);
}
}
}

如果要使用列表并将所有对象添加到此列表中,则可以使用for each循环检查主对象与列表中所有其他对象之间的距离(如果距离较近),并将其添加到Closes对象

    public class NewBehaviourScript : MonoBehaviour {
    List<GameObject> NearGameobjects = new List<GameObject>();
    GameObject closetsObject;
    private float oldDistance = 9999;


    private void Something()
    {
        foreach (GameObject g in NearGameobjects)
        {
            float dist = Vector3.Distance(this.gameObject.transform.position, g.transform.position);
            if (dist < oldDistance)
            {
                closetsObject = g;
                oldDistance = dist;
            }
        }
    }

}
公共类NewBehaviourScript:MonoBehavior{
List NearGameobjects=新列表();
游戏对象关闭对象;
私人浮动距离=9999;
私人的
{
foreach(NearGameobjects中的游戏对象g)
{
float dist=Vector3.距离(this.gameObject.transform.position,g.transform.position);
如果(距离<旧距离)
{
closetsObject=g;
oldDistance=距离;
}
}
}
}

对于任何想知道的人来说,这是由于CubeCrafter360而完美运行的全部代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;

public class Merging : MonoBehaviour
{
    List<GameObject> NearGameobjects = new List<GameObject>();
    GameObject closetsObject;
    private float oldDistance = 9999;
    public GameObject NextPF;
    public float mergingThreshold = 0.3f;


    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == gameObject.tag)
        {
            Debug.Log("Enter!");
            NearGameobjects.Add(col.gameObject);
        }
    }


    void OnTriggerExit2D(Collider2D col)
    {
        if (col.gameObject.tag == gameObject.tag)
        {
            Debug.Log("Exit!");
            NearGameobjects.Remove(col.gameObject);

        }
    }
    
    public void CheckNearest()
    {
        foreach (GameObject g in NearGameobjects)
        {
            float dist = Vector3.Distance(this.gameObject.transform.position, g.transform.position);
            if (dist < oldDistance)
            {
                closetsObject = g;
                oldDistance = dist;
  
            }
        }
        if (Vector3.Distance(this.gameObject.transform.position, closetsObject.transform.position) < mergingThreshold)
        {
            Destroy(gameObject);
            Destroy(closetsObject);
            Instantiate(NextPF, transform.position, Quaternion.identity);
        }
    }



}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.Timeline;
公共类合并:单一行为
{
List NearGameobjects=新列表();
游戏对象关闭对象;
私人浮动距离=9999;
公共游戏对象NextPF;
公共浮点数阈值=0.3f;
无效OnTriggerEnter2D(碰撞的R2D列)
{
if(col.gameObject.tag==gameObject.tag)
{
Log(“回车!”);
NearGameobjects.Add(col.gameObject);
}
}
无效OnTriggerExit2D(碰撞的R2D列)
{
if(col.gameObject.tag==gameObject.tag)
{
Log(“退出!”);
NearGameobjects.Remove(col.gameObject);
}
}
公共无效检查()
{
foreach(NearGameobjects中的游戏对象g)
{
float dist=Vector3.距离(this.gameObject.transform.position,g.transform.position);
如果(距离<旧距离)
{
closetsObject=g;
oldDistance=距离;
}
}
if(Vector3.Distance(this.gameObject.transform.position,closetsObject.transform.position)
然后我在我的动作脚本中调用了这个函数:

private void OnMouseUp()
{
GetComponent().CheckNearest();
}

您可以使用以下命令按距离排列列表:

使用SystemLinq;
...
公共无效检查()
{
如果(NearGameobjects.Count==0)返回;
//这将对列表进行排序,以便最接近的对象将是第一个条目
OrderBy(obj=>Vector3.Distance(col.transform.position,transform.position)).ToList();
//目前最接近的
var-nearest=NearGameobjects[0];
if(Vector3.Distance(this.gameObject.transform.position,closest.transform.position)
非常感谢,这正是我要找的!
private void OnMouseUp()
    {
        GetComponent<Merging>().CheckNearest();
    }
using SystemLinq;

...

public void CheckNearest()
{
    if(NearGameobjects.Count == 0) return;

    // This orders the list so the closest object will be the very first entry
    NearGameobjects.OrderBy(obj => Vector3.Distance(col.transform.position, transform.position)).ToList();

    // currently closest
    var closest = NearGameobjects[0];

    if (Vector3.Distance(this.gameObject.transform.position, closest.transform.position) < mergingThreshold)
    {
        Destroy(gameObject);
        Destroy(closetsObject);
        Instantiate(NextPF, transform.position, Quaternion.identity);
    }
}

private void OnTriggerEnter2D(Collider2D col)
{
    // Rather use CompareTag
    if (col.CompareTag(tag))
    {
        Debug.Log("Enter!");
        NearGameobjects.Add(col.gameObject);
    }
}

private void OnTriggerExit2D(Collider2D col)
{
    if (col.CompareTag(tag))
    {
        Debug.Log("Exit!");
        NearGameobjects.Remove(col.gameObject);
    }
}