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