Unity 2D (C#) - 同一位置有更多对象
Unity 2D (C#) - More objects in same position
我有一些二维对象在相同的变换位置。如何找出同一位置有多少对象以及它们是哪些对象?
编辑:
这是我的代码:
我想保存 transform.position - new Vector3(speed, 0, 0)
上的所有对象
GameObject go = GetObjectAt(transform.position - new Vector3(speed, 0, 0));
public GameObject GetObjectAt(Vector3 position)
{
string pos = position.x + "_" + position.y + "_";
if (obstacleDictionary.ContainsKey(pos + "BigRed"))
{
return obstacleDictionary[pos + "BigRed"];
}
else if (obstacleDictionary.ContainsKey(pos + "SmallRed"))
{
return obstacleDictionary[pos + "SmallRed"];
}
else return null;
}
我认为你可以使用 List<SomeModel>
来保持对象和位置。
创建对象时将对象添加到列表
然后找到 LINQ
使用的相同位置对象
代码示例
Public class ObjectListener
{
public string ObjectName {get; set;}
public Vector2 ObjectVector {get; set;}
}
public class CreateObject : MonoBehaviour
{
List<ObjectListener> _gameObjectListener = new List<ObjectListener>();
void Update()
{
private GameObject _gameObject ; // you must create _gameObject
// and set tranform.Postion maybe you
// can use a method returned gameObject
Instantiate(_gameObject, _gameObject.transform.position, Quaternion.identity);
_gameObjectListener.Add(new ObjectListener
{
ObjectName = _gameObject.Name,
ObjectVector = _gameObject.transform.postion
});
}
}
我不确定这是否正确,但您可以将所有创建的对象名称和位置保留在列表对象中。所以你可以找到有多少对象在同一个对象中
假设所有对象都有一个 Collider2D
on them, you just need to call Physics2D.BoxCastAll(
并且它将 return 一个 RaycastHit2D
的数组,您可以调用 hitItems[i].collider.gameObject
来获取对象。
RaycastHit2D[] hitItems = Physics2D.BoxCastAll(origin, size, angle, direction);
for(int i = 0; i < hitItems.Length; i++)
{
GameObject hitObject = hitItems[i].collider.gameObject;
//Do something with the hit object.
}
下面文章中提到了一种方法
http://answers.unity3d.com/questions/638319/getting-a-list-of-colliders-inside-a-trigger.html
- 以上文章的基础知识
- 确保一切都有碰撞器
- 确保至少有一件事情有触发器
- 用户 "TriggerList" 获取触发器内带有碰撞器的所有项目。
这篇文章是第二个选项
http://answers.unity3d.com/questions/532746/finding-gameobjects-within-a-radius.html
- 基础知识
- 得到一个position/transform
- 获取一个球体内的所有对撞机
- 遍历列表。
我有一些二维对象在相同的变换位置。如何找出同一位置有多少对象以及它们是哪些对象?
编辑:
这是我的代码:
我想保存 transform.position - new Vector3(speed, 0, 0)
GameObject go = GetObjectAt(transform.position - new Vector3(speed, 0, 0));
public GameObject GetObjectAt(Vector3 position)
{
string pos = position.x + "_" + position.y + "_";
if (obstacleDictionary.ContainsKey(pos + "BigRed"))
{
return obstacleDictionary[pos + "BigRed"];
}
else if (obstacleDictionary.ContainsKey(pos + "SmallRed"))
{
return obstacleDictionary[pos + "SmallRed"];
}
else return null;
}
我认为你可以使用 List<SomeModel>
来保持对象和位置。
创建对象时将对象添加到列表
然后找到 LINQ
代码示例
Public class ObjectListener
{
public string ObjectName {get; set;}
public Vector2 ObjectVector {get; set;}
}
public class CreateObject : MonoBehaviour
{
List<ObjectListener> _gameObjectListener = new List<ObjectListener>();
void Update()
{
private GameObject _gameObject ; // you must create _gameObject
// and set tranform.Postion maybe you
// can use a method returned gameObject
Instantiate(_gameObject, _gameObject.transform.position, Quaternion.identity);
_gameObjectListener.Add(new ObjectListener
{
ObjectName = _gameObject.Name,
ObjectVector = _gameObject.transform.postion
});
}
}
我不确定这是否正确,但您可以将所有创建的对象名称和位置保留在列表对象中。所以你可以找到有多少对象在同一个对象中
假设所有对象都有一个 Collider2D
on them, you just need to call Physics2D.BoxCastAll(
并且它将 return 一个 RaycastHit2D
的数组,您可以调用 hitItems[i].collider.gameObject
来获取对象。
RaycastHit2D[] hitItems = Physics2D.BoxCastAll(origin, size, angle, direction);
for(int i = 0; i < hitItems.Length; i++)
{
GameObject hitObject = hitItems[i].collider.gameObject;
//Do something with the hit object.
}
下面文章中提到了一种方法
http://answers.unity3d.com/questions/638319/getting-a-list-of-colliders-inside-a-trigger.html
- 以上文章的基础知识
- 确保一切都有碰撞器
- 确保至少有一件事情有触发器
- 用户 "TriggerList" 获取触发器内带有碰撞器的所有项目。
这篇文章是第二个选项
http://answers.unity3d.com/questions/532746/finding-gameobjects-within-a-radius.html
- 基础知识
- 得到一个position/transform
- 获取一个球体内的所有对撞机
- 遍历列表。