【问题标题】:Calculating Minecraft Explosions计算 Minecraft 爆炸
【发布时间】:2018-07-26 16:17:48
【问题描述】:

我有一个体素世界,类似于 Minecraft。每个体素(块)的大小为 1x1x1。

我想用给定的爆炸半径计算某个位置的爆炸破坏,这意味着游戏将围绕该位置破坏体素(给定所需的半径)。

意思是我想要某种功能:

void DestroyBlocks(Vector3 position, int radius){   
if(block is on radius)   
destroy(blockPosition);
}

我该怎么做?

【问题讨论】:

  • 你是否将块存储在某个地方(例如列表、数组)或在块上有标签?
  • 您可以使用 Vector3.Distance,检查给定块的中心与爆炸中心之间的距离。
  • @Andreaジーティーオー 我明白了,所以我只是计算距离,看看它是否不大于半径?
  • 首先检查边界框if (dx <= radius || dy <= radius) ...,然后检查实际距离Vector3.Distance。要计算距离,您必须计算增量的平方根sqrt(),这会花费很多。但是如果它在边界框之外肯定会更远,所以首先检查它会给你一个巨大的加速。
  • @SpoocyCrep:完全正确

标签: c# unity3d


【解决方案1】:

这是通过Physics.OverlapSphere 函数完成的:

void DestroyBlocksWithinRadius(Vector3 center, float radius)
{
    Collider[] result = Physics.OverlapSphere(center, radius);
    for (int i = 0; i < result.Length; i++)
        Destroy(result[i].gameObject);
}

如果没有碰撞器,则通过标签找到它们并检查距离来手动完成:

void DestroyBlocksWithinRadius(Vector3 center, float radius)
{
    GameObject[] result = GameObject.FindGameObjectsWithTag("Voxels");
    for (int i = 0; i < result.Length; i++)
    {
        Transform tempTrans = result[i].transform;
        float distanceSqr = (center - tempTrans.position).sqrMagnitude;
        if (distanceSqr < radius)
            Destroy(tempTrans.gameObject);
    }
}

【讨论】:

  • 如果我的体素世界是一个网格和一个对撞机,我不确定它是否会起作用。我的体素没有自己的碰撞器,或者我不明白解决方案
  • 查看我的编辑以获取无对撞机解决方案。如果体素是网格格式,那么你应该阅读thisthis,其中有用于爆炸网格体素的代码示例。
  • 当然,我会提到,如果您的每个体素都是完整的GameObject,那么您将很快真的达到可见区域的内存限制。渲染距离为 10 个区块的 Minecraft(假设地平面为 64)加载了大约 1,982,464 个区块。 Minecraft 可以做到这一点,因为每个占用 1 个字节的内存。完整的游戏对象方式远不止于此。
  • @Draco18s “你将很快达到可见区域的内存限制” 现在支持 GPU 实例化并内置在 Unity 中,这就是需要它的地方。
  • 我在考虑非图形内存问题,但很高兴知道这一点。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2016-03-05
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多