C# 计算地雷爆炸

C# 计算地雷爆炸,c#,unity3d,C#,Unity3d,我有一个体素世界,类似于Minecraft。每个体素(块)的大小为1x1x1 我想计算在某个特定位置爆炸的破坏力,该位置具有给定的爆炸半径,这意味着游戏将在该位置周围破坏体素(给定所需的半径) 这意味着我需要某种函数来实现: void DestroyBlocks(Vector3 position, int radius){ if(block is on radius) destroy(blockPosition); } 如何执行此操作?这是通过以下函数完成的: void Destr

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

我想计算在某个特定位置爆炸的破坏力,该位置具有给定的爆炸半径,这意味着游戏将在该位置周围破坏体素(给定所需的半径)

这意味着我需要某种函数来实现:

void DestroyBlocks(Vector3 position, int radius){   
if(block is on radius)   
destroy(blockPosition);
}
如何执行此操作?

这是通过以下函数完成的:

void DestroyBlocksWithinRadius(Vector3 center, float radius)
{
    Collider[] result = Physics.OverlapSphere(center, radius);
    for (int i = 0; i < result.Length; i++)
        Destroy(result[i].gameObject);
}
swithinradius(矢量3中心,浮动半径)
{
对撞机[]结果=物理。重叠球体(中心、半径);
for(int i=0;i

如果没有碰撞器,则通过标记查找碰撞器并检查距离来手动执行此操作:

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);
    }
}
swithinradius(矢量3中心,浮动半径)
{
GameObject[]结果=GameObject.FindGameObjectsWithTag(“体素”);
for(int i=0;i
是否将块存储在某个位置(如列表、数组)或在块上有标记?可以使用Vector3.Distance检查给定块中心与爆炸中心之间的距离。@Andreaジーティーオー 我明白了,所以我只是计算距离,看看它是否大于半径?首先检查一个边界框
if(dx@SpoocyCrep:确切地说,如果我的体素世界是一个网格和一个碰撞器,我不确定它是否会起作用。我的体素没有自己的碰撞器,或者可能我不了解解决方案。请参阅我的编辑以获得无碰撞器解决方案。如果体素是网格格式,那么你应该阅读,其中还有用于分解网格体素的代码示例。当然,我会记住如果你的每个体素都是一个完整的
游戏对象
,你会很快达到你可见区域的内存限制大约加载了1982464个区块。Minecraft可以这样做,因为每个区块占用1字节的内存。一个完整的游戏对象远不止这些。@Draco18s“你将很快达到可见区域的内存限制”GPU实例现在被支持并内置到Unity中,这正是需要它的地方。我曾经考虑过非图形内存的问题,但很高兴知道这一点。