我在Unity中创建一个2D块堆叠游戏,您可以从x轴平移spawner对象中实例化块。我面临的问题是当筹码量过高而接近产生者时,我需要将产卵器和游戏摄像机向上移动到Y轴上。我正在测量一堆预制件以获得他们的高度使用Bounds所以我知道什么时候移动我的相机和spawner。我遇到的问题是当我调用我的GetMaxBounds函数并封装其他点时,它没有添加到我的parentBounds变量。我的parentBounds.max.y永远不会增加。我是编程和C#的新手。提前致谢。
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;
}
答案 0 :(得分:3)
保留一个计数器,该计数器将存储堆栈中有多少对象存在于屏幕上,并在每次在堆栈中添加项目时递增。然后,考虑到您保存了一个项目的大小,您只需要将您的大小乘以堆栈中存在的项目数。只需将此尺寸与场景的当前垂直尺寸进行比较,并在堆叠达到屏幕垂直尺寸的80%时移动相机。
执行此操作时,请记住重置项目数,因为您可能会移动相机,并且隐藏了堆叠较低级别的大部分项目。例如,如果在移动相机时只能看到3个立方体,只需将堆叠中的项目数量设置为3即可。
由于您的问题似乎包括不会以相同方式堆叠的对象,另一种解决方案是使用Bounds。想象您正在保留堆栈中所有项目的列表,您可以评估将在表示堆栈的父对象中添加的每个对象的边界,并通过封装每个子边界来评估垂直大小。您可以在this answer中找到一个示例:
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;
}
然后,您可以通过将已评估的max
对象的Bounds
y值减去min
y值来评估垂直大小。所以你可以有类似的东西:
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;
}
同样,如果您要移动相机,请确保仅对屏幕上实际显示的项目使用此解决方案。