物体出现在对方的身上

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

我有一个玩家的产卵障碍物,当游戏开始时,障碍物会出现在对方的身上,我试图通过while和物理二维循环来解决这个问题,但当我开始游戏时,Unity崩溃了。我试图通过while和物理二维循环来解决这个问题,但当我开始游戏时,Unity崩溃了.而且我还尝试通过Raycast2D来检查当光束与某种碰撞器碰撞时,改变其位置。但是Ray a small并不总是有效。

第一种方法

 while (!Physics.CheckBox(pos, BlotPref[1].transform.localScale))
    {
         pos = new Vector2(Random.Range(-1f, 1f), YPosSetter());
    }

第二种方式

 while (hit.collider == null)
    {
        transform.position = new Vector2(Random.Range(-1f, 1f), YPosSetter());
    }

产卵器

private void SpawnerPaper()
{

    for (int i = 0; i < PlaningSpawn; i++)
    {
        if (rndType <= _dbPaperSpawn)
        {
            var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)], new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f)), Quaternion.identity);
            blot.transform.SetParent(paper.transform);
        }
    }
}
c# unity3d
1个回答
0
投票

一个解决方案是测试对撞机,如果障碍物附近的随机位置与 Physics2D.OverlapCircleAll 并使用 层次:

当然,障碍物有碰撞器...

private void SpwanerPaper()
{
    for (int i = 0; i < PlaningSpawn; i++)
    {
        if (rndType <= _dbPaperSpawn)
        {
            while (true)
            {
                var position = new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f));
                 // i have choosen radius 1f, you could increase it if needed
                Collider2D[] colliders = Physics2D.OverlapCircleAll(position, 1f, obstacleLayer);

                if (colliders.Length == 0)
                {
                    //so no obstacles present, spawn here
                    var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)],
                        position, Quaternion.identity);
                    blot.transform.SetParent(paper.transform);
                    break;// get out while loop
                }

                // so  obstacles within 1m of the player loop again and give new random position

            }
        }

    }
}

在这种情况下,你也可以使用 物理学2D.CircleCastAll

如果你不知道Layers,你有一个教程YouTube。这里

© www.soinside.com 2019 - 2024. All rights reserved.