【问题标题】:Unity2D - Randomly instantiated objects need to not spawn close to each otherUnity2D - 随机实例化的对象不需要彼此靠近生成
【发布时间】:2018-04-01 22:18:23
【问题描述】:

我是 Unity 的初学者。我正在创建一个随机产生三个潜在答案的教育蛇游戏。它正在工作,但是我不需要让它们彼此靠近。我也不需要在玩家/蛇附近产卵。有人已经尝试过帮助我,我向他寻求帮助,但似乎他无法解决问题,并且物体仍然彼此靠近。

void GeneratePotentialAnswers()
{
    allAnswers.Clear();
    List<Vector3> AnswerPositions = new List<Vector3>();
    AnswerPositions.Add(player.transform.position);
    for (int i = 0; i < potentialAnswers.Count; i++)
    {
        GameObject ans = Instantiate(enemyAnswerPrefab);

        Vector3 pos;
        int index = 0;
        bool tooClose = false;
        do
        {
            float rndWidth = Random.Range(15f, Screen.width - 25f);
            float rndHeight = Random.Range(15f, Screen.height - 105f);
            pos = Camera.main.ScreenToWorldPoint(new Vector3(rndWidth, rndHeight, 0f));
            pos.z = -1f;
            foreach (Vector3 p in AnswerPositions)
            {
                float distance = (pos - p).sqrMagnitude;
                if (distance < 3f)
                {
                    tooClose = true;
                }
            }
            index++;
        }

        while (tooClose == true && index < 500);
        Debug.Log(index);

        AnswerPositions.Add(pos);

        ans.transform.localPosition = pos;
        ans.GetComponent<Answer>().potentialAnswer = potentialAnswers[i];
        ans.GetComponent<Answer>().addToScore = scorePerCorrectAnswer;
        ans.GetComponent<Answer>().SetAnswer();
        allAnswers.Add(ans.GetComponent<Answer>());
    }
}

【问题讨论】:

  • 请编辑您的答案,以说明您和其他人迄今为止为调查您的问题所做的工作。您认为代码中的哪一行会导致问题?那个随机的while 循环在做什么? (它看起来像一个无限循环。)如果您使用相同的参数实例化所有对象,则期望类似的行为。确定位置的逻辑在哪里?就目前而言,这看起来像是一个“帮我解决这个问题”的问题,而不是一个“这是一个我不明白的错误”的问题。
  • @NonCreature0714 我是一个绝对的初学者,我真的不知道我在做什么。对不起,这个项目对我来说太难了,但我需要能够完成它。再次,我非常抱歉。我一个人呆着,不知道该怎么办。
  • 也许尝试在网格而不是连续范围内生成坐标?

标签: c# unity3d


【解决方案1】:

回答

  1. 手动放置充当生成点的游戏对象,为每个对象附加一个 SpawnPoint 脚本。
  2. 放置答案时,让所选生成点的 SpawnPoint 脚本使用 SphereCastAll 检查附近区域是否空闲,如果不是,则应选择另一个生成点,直到找到空闲区域。
  3. 找到空闲生成点后,在其位置实例化答案。

阐述

一个简单的解决方案是使用 SpawnPoint 脚本。这将是一个脚本放在您手动放置的一组单独的生成点上,其中可能有 20 个在地图的不同点。

然后,SpawnPoint 脚本可以使用 SphereCastAll 方法,该方法在给定大小的区域中以球体的形状收集对撞机的集合。 (应该在 3d 中工作,但可能不是 2d,在这种情况下找到除 SphereCastAll 之外的另一种演员表类型)。

这里是关于如何制作 SphereCastAll 的文档,请注意您可以设置 spherecast 的半径。

https://docs.unity3d.com/ScriptReference/Physics.SphereCastAll.html

如果任何物体被 SphereCastAll 击中,它们将存储在它返回的 RaycastHit[] 中。您可以通过它进行搜索,每个 RaycastHit 都会引用它所击中的对撞机,以及该对撞机的 GameObject。这意味着您拥有一个区域内所有对象的列表。

然后您可以检查这些对象以查看它们是玩家还是其他答案。

这是 RaycastHit 的文档。

https://docs.unity3d.com/ScriptReference/RaycastHit.html

请注意,要获得对生成点的访问权,拥有它们的列表或可以为您选择一个的各种管理器脚本会很有用。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2019-07-03
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多