所以我有一个预制件,我从资源文件夹中随机地在随机位置实例化它,如下所示,并且目前只是一个带有 Sprite 渲染器的图像:
go = (GameObject)Instantiate(Resources.Load("alienPink"));
每 3 秒后,它们会在不同位置实例化。
我还有一个带有 Sprite 渲染器、Circle Collider 2d 和附加的 Rigid Body 2D 的球,我可以按如下方式访问 RigidBody 2D:
//ray cast from camera to mouse point to detect hit
RaycastHit2D hit = Physics2D.Raycast(mousePos2D , dir);
. . .
RigidBody2D grabbedObject = hit.collider.rigidbody2D;
//do stuff with grabbedObject including change position
我想检测预制件何时与透明的球完全重叠,以便我可以开始对预制件进行操作。 COMPLETE 是这里的关键字,我尝试了多种方法,包括尝试检测预制件的渲染器和球的igidBody2D 之间的重叠,但无济于事。我什至尝试抓取场景中的所有预制件,将它们放入数组中,并通过在每次更新中遍历所有数组来检测重叠,但它不起作用:
GameObject[] prefab =GameObject.FindGameObjectsWithTag("enemies"); //returns GameObject[]
有人停下来!说真的,我已经尝试这样做好几天了。
谢谢你。
尝试使用 Physics2D.OverlapCircle 来检测重叠。另一个值得一试的选项是:Physics2D.OverlapArea。如果这两个选项只能提供部分解决方案,请尝试使用Physics2D.OverlapPoint,通过检查多个点,使得每个点都需要重叠;例如,如果球完全位于一个正方形内,请检查该正方形内四个点的重叠情况。
下面您将找到我的 Unity 代码,用于在游戏中实例化对象之前验证对象是否重叠。
在使用以下代码之前,请检查您在为对象设置的方法
IsOverlappingExistingGameObjects
中是否使用了正确的碰撞器。我正在使用例如 PolygonCollider2D。
[![在此处输入图像描述][1]][1]
var objectCollider = gameObjectToCheck.GetComponent<PolygonCollider2D>();
void SpawnGameObject(GameObject gamePrefab, float minX, float maxX, float minY, float maxY)
{
float positionX = Random.Range(minX, maxX);
float randomY = Random.Range(minY, maxY);
var randomPosition = new Vector3(positionX, randomY, 0);
var instantiateGameObject = Instantiate(gamePrefab, randomPosition, Quaternion.identity);
while (IsOverlappingExistingGameObjects(instantiateGameObject))
{
Destroy(instantiateGameObject);
// Regenerate position of new game object
positionX = Random.Range(minX, maxX);
randomY = Random.Range(minY, maxY);
randomPosition = new Vector3(positionX, randomY, 0);
instantiateGameObject = Instantiate(gamePrefab, randomPosition, Quaternion.identity);
}
}
private bool IsOverlappingExistingGameObjects(GameObject gameObjectToCheck)
{
var objectCollider = gameObjectToCheck.GetComponent<PolygonCollider2D>();
if (objectCollider != null)
{
var colliderHit = objectCollider.OverlapCollider(new ContactFilter2D(), new Collider2D[2]);
if (colliderHit > 0)
{
Debug.Log($"GameObject collider happen {colliderHit}");
return true;
}
}
return false;
}
[1]: https://i.stack.imgur.com/fNMwl.png