检测Sprite的GameObject完全重叠

问题描述 投票:0回答:2

所以我有一个预制件,我从资源文件夹中随机地在随机位置实例化它,如下所示,并且目前只是一个带有 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[]

有人停下来!说真的,我已经尝试这样做好几天了。

谢谢你。

c# unity-game-engine sprite unityscript unity3d-2dtools
2个回答
1
投票

尝试使用 Physics2D.OverlapCircle 来检测重叠。另一个值得一试的选项是:Physics2D.OverlapArea。如果这两个选项只能提供部分解决方案,请尝试使用Physics2D.OverlapPoint,通过检查多个点,使得每个点都需要重叠;例如,如果球完全位于一个正方形内,请检查该正方形内四个点的重叠情况。


0
投票

下面您将找到我的 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
© www.soinside.com 2019 - 2024. All rights reserved.