查找并返回带有标签的最近的游戏对象,Unity

Luk*_*lte 0 c# list distance unity-game-engine gameobject

我正在尝试制作一款游戏,您必须合并 2 个游戏对象才能获得下一个游戏对象,依此类推。首先我尝试,当游戏对象被释放并且它接触另一个游戏对象时,它会删除这两个游戏对象,然后实例化下一个游戏对象。但这并不太有效,因为触发器相互“覆盖”或其他一些奇怪的东西。所以我想我可以检测到碰撞,以便每个接触触发器的游戏对象都会添加到列表中,然后在退出时删除。我不想弄清楚的是如何计算游戏对象之间的距离,如果它们足够近(合并阈值),那么它们都会被销毁并且下一个游戏对象被实例化,但我不太清楚如何获得这个距离计算并返回游戏对象是什么。因此,所有帮助将不胜感激!(不要遗漏任何细节,因为我是初学者)谢谢!

这是到目前为止我得到的代码:

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);
            
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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

}
Run Code Online (Sandbox Code Playgroud)