Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D-如何测量一堆对象的高度?_C#_Unity3d_Game Physics_Unity2d - Fatal编程技术网

C# Unity3D-如何测量一堆对象的高度?

C# Unity3D-如何测量一堆对象的高度?,c#,unity3d,game-physics,unity2d,C#,Unity3d,Game Physics,Unity2d,我在Unity中创建了一个2D积木堆叠游戏,你可以从一个x轴平移的产卵器对象中实例化积木。我面临的问题是,当堆栈变得太高且靠近产卵器时,我需要在Y轴上将产卵器和游戏摄影机向上移动。我正在测量一堆预制件,以使用边界获得其高度,以便知道何时移动摄影机和产卵器。我面临的问题是,当我调用GetMaxBounds函数并封装它没有添加到parentBounds变量中的附加点时。我的父母,max.y从不增加。我对编程和C#是新手。提前谢谢 if(Input.GetMouseButtonDown(0)){ 实

我在Unity中创建了一个2D积木堆叠游戏,你可以从一个x轴平移的产卵器对象中实例化积木。我面临的问题是,当堆栈变得太高且靠近产卵器时,我需要在Y轴上将产卵器和游戏摄影机向上移动。我正在测量一堆预制件,以使用边界获得其高度,以便知道何时移动摄影机和产卵器。我面临的问题是,当我调用GetMaxBounds函数并封装它没有添加到parentBounds变量中的附加点时。我的父母,max.y从不增加。我对编程和C#是新手。提前谢谢

if(Input.GetMouseButtonDown(0)){
实例化(fallingBrick、spawnPosObj.transform.position、Quaternion.identity、parentStack.transform);
var parentBounds=GetMaxBounds(parentStack);
Debug.Log(parentBounds.max.y);
}
}
边界GetMaxBounds(游戏对象g){
var b=新边界(g.transform.position,Vector3.zero);
foreach(g.GetComponentsInChildren()中的渲染器r){
b、 封装(r.bounds);
}
返回b;
}

保留一个计数器,用于存储屏幕上堆栈中存在的对象数量,并在每次堆栈中添加项目时递增该计数器。然后,考虑到您保存了一个项目的大小,您只需将您的大小乘以堆栈上存在的项目数即可。只需将此大小与场景的当前垂直大小进行比较,并在堆栈达到屏幕垂直大小的80%时移动相机

执行此操作时,请记住重置项目数,因为您可能会向上移动相机,并且堆栈较低级别中的大多数项目都将隐藏。例如,如果移动相机时只显示3个立方体,只需将堆栈中的项目数设置为3即可

由于您的问题似乎包括不以相同方式堆叠的对象,因此另一种解决方案是使用。假设您正在保留堆栈中所有项目的列表,您可以计算将添加到表示堆栈的父对象中的每个对象的边界,并通过封装每个子边界来计算垂直大小。您可以在以下内容中找到一个示例:


同样,如果要向上移动相机,请确保仅在屏幕上实际显示的项目上使用此解决方案。

保留一个计数器,用于存储屏幕上堆栈中的对象数量,并在每次向堆栈中添加项目时递增该计数器。然后,考虑到您保存了一个项目的大小,您只需将您的大小乘以堆栈上存在的项目数即可。只需将此大小与场景的当前垂直大小进行比较,并在堆栈达到屏幕垂直大小的80%时移动相机

执行此操作时,请记住重置项目数,因为您可能会向上移动相机,并且堆栈较低级别中的大多数项目都将隐藏。例如,如果移动相机时只显示3个立方体,只需将堆栈中的项目数设置为3即可

由于您的问题似乎包括不以相同方式堆叠的对象,因此另一种解决方案是使用。假设您正在保留堆栈中所有项目的列表,您可以计算将添加到表示堆栈的父对象中的每个对象的边界,并通过封装每个子边界来计算垂直大小。您可以在以下内容中找到一个示例:



同样,如果要向上移动相机,请确保仅在屏幕上实际显示的项目上使用此解决方案。

只需在堆栈中添加独立对象的高度即可。谢谢。问题是它们的堆叠并不总是均匀的。这些木块有时会掉落、旋转,最后到达不同的高度。您是否在检查木块是否堆放在塔架上?如果是这样的话,你可以通过每一个成功堆叠的物体,乘以一个方块的高度。我是这样的,但它们的堆叠方式并不总是一样的。当前正在尝试确定是否可以使用下面的边界建议获取包含所有子块对象的父堆栈对象的高度。只需在堆栈中添加独立对象的高度即可。谢谢。问题是它们的堆叠并不总是均匀的。这些木块有时会掉落、旋转,最后到达不同的高度。您是否在检查木块是否堆放在塔架上?如果是这样的话,你可以通过每一个成功堆叠的物体,乘以一个方块的高度。我是这样的,但它们的堆叠方式并不总是一样的。目前正在尝试确定是否可以使用下面的边界建议获取包含所有子块对象的父堆栈对象的高度。谢谢,这很有意义。问题是堆栈增量并不总是一个块的高度。有时它们会掉落并旋转,因此最终会在下面的平台上乱成一团。在这种情况下,有没有办法进行测量?我可以缩小平台,使其只能一块一块地垂直堆叠,并使用这种方法。如果他存储所有成功堆叠的积木,他应该仍然能够将单个积木的大小和未掉落的成功堆叠积木的数量成倍增加。@Lewie我为您的建议了另一种解决方案案件。@Isuka-谢谢你。对于我的情况,使用边界似乎是正确的解决方案,因为对象并不总是以相同的方式堆叠。目前正在实施此建议。@Isuka-我能够将我的块实例化为父堆栈对象。我将代码添加到帖子中。你能给我看一下GetMaxBounds函数的实现吗?在这个实现中,我将通过将返回对象的最大y值减去最小y值来计算垂直大小?谢谢,这很有意义。问题是堆栈增量并不总是一个块的高度。有时它们会掉落并旋转,所以最终会变得杂乱无章
if  (Input.GetMouseButtonDown(0)) {
        Instantiate (fallingBrick, spawnPosObj.transform.position, Quaternion.identity, parentStack.transform);
        var parentBounds = GetMaxBounds (parentStack);
        Debug.Log (parentBounds.max.y);
    }

}

Bounds GetMaxBounds(GameObject g) {
    var b = new Bounds(g.transform.position, Vector3.zero);
    foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
        b.Encapsulate(r.bounds);
    }
    return b;
}
Bounds GetMaxBounds(GameObject stack) {
   var b = new Bounds(stack.transform.position, Vector3.zero);
   foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
     b.Encapsulate(r.bounds);
   }
   return b;
}
float GetVerticalSize(GameObject stack) {
   var b = new Bounds(stack.transform.position, Vector3.zero);
   foreach (Renderer r in g.GetComponentsInChildren<Renderer>()) {
     b.Encapsulate(r.bounds);
   }

   float size = b.max.y - b.min.y;
   return size;
}