查找并返回最近的带有标签Unity的gameObject



im试图制作一个游戏,其中必须合并2个gameObject才能获得下一个gameObjects。首先,我尝试过,当游戏对象被释放,并且它正在触摸另一个游戏对象时,它会删除这两个对象,然后实例化下一个。但这并没有完全起作用,因为触发器";覆盖";彼此或其他一些不同的。所以我想我可以检测到碰撞,这样每个触摸触发器的游戏对象都会被添加到列表中,然后在退出时被删除。我不想弄清楚的是如何计算gameobject之间的距离,如果它们足够近(mergethreshold(,那么它们都会被销毁,下一个gameobject会被实例化,但我不太清楚如何计算这个距离并返回gameobject。所以我们将不胜感激!(不要遗漏任何细节,因为我是个初学者(谢谢

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

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

}
}
}

如果您要使用列表并已将所有对象添加到此列表中,则可以为每个循环使用一个,并检查您的主对象与列表中所有其他对象之间的距离,如果距离较近,则将其添加到壁橱对象

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

您可以使用LinqOrderBy:按距离排序

using SystemLinq;
...
public void CheckNearest()
{
if(NearGameobjects.Count == 0) return;
// This orders the list so the closest object will be the very first entry
var sorted = NearGameobjects.OrderBy(obj => (col.transform.position - transform.position).sqrMagnitude);
// currently closest
var closest = sorted.First();
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);
}
}

对于任何想知道的人来说,这是由于CubeCraft360而完美工作的全部代码!

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

}

然后我刚刚调用了移动脚本中的函数:

private void OnMouseUp()
{
GetComponent<Merging>().CheckNearest();
}

最新更新