gpt4 book ai didi

unity3d - 根据 Horizo​​ntalLayoutGroup 等,更正 Unity3D 中的 'FlowLayoutGroup'

转载 作者:行者123 更新时间:2023-12-04 00:34:35 28 4
gpt4 key购买 nike

说你要普通冲洗左流在 Unity 用户界面中。例子:
enter image description here
enter image description here
其实回答THIS question我已经实现了“艰难的方式”同花顺左流。在 Unity 自动布局中设置“垂直行组”,在顶层附加 FattieFlow,

public class FattieFlow : MonoBehaviour
{
public GameObject modelRow;
public GameObject modelItem;
public void Flow()
{
screen = GetComponent<RectTransform>().rect.width;

// move downwards any which need to be moved downwards
int row = 0;
while (row < transform.childCount) // (dynamic)
{
if (transform.GetChild(row).gameObject.activeSelf) FlowRow(row);
++row;
}
// et cetera....
}
}
FattieFlow将完全重新流动它与左齐平(通过操纵线条,艰难的方式)。这是一个脚本、演示等: the hard way .
但这是一个糟糕的解决方案。
理想情况下,从
UI.HorizontalLayoutGroupUI.VerticalLayoutGroup
应该可以创建 FlowLayoutGroup布局,向左齐平,进入一个街区。 (事实上​​,它应该根据需要扩展块,依此类推……与 HorizontalLayoutGroup 的行为完全一样)。
看来您必须从 HorizontalOrVerticalLayoutGroup 开始并从那里开始工作。
如何做到这一点(如果它不存在 已经存在 )?

最佳答案

到目前为止,我想出了这个:

FlowLayoutGroup

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[AddComponentMenu("Layout/Flow Layout Group", 153)]
public class FlowLayoutGroup : LayoutGroup
{
public enum Corner {
UpperLeft = 0,
UpperRight = 1,
LowerLeft = 2,
LowerRight = 3
}

public enum Constraint {
Flexible = 0,
FixedColumnCount = 1,
FixedRowCount = 2
}

protected Vector2 m_CellSize = new Vector2(100, 100);
public Vector2 cellSize {
get { return m_CellSize; }
set { SetProperty(ref m_CellSize, value); }
}

[SerializeField] protected Vector2 m_Spacing = Vector2.zero;
public Vector2 spacing {
get { return m_Spacing; }
set { SetProperty(ref m_Spacing, value); }
}

protected FlowLayoutGroup()
{}

#if UNITY_EDITOR
protected override void OnValidate()
{
base.OnValidate();
}

#endif

public override void CalculateLayoutInputHorizontal()
{
base.CalculateLayoutInputHorizontal();

int minColumns = 0;
int preferredColumns = 0;

minColumns = 1;
preferredColumns = Mathf.CeilToInt(Mathf.Sqrt(rectChildren.Count));

SetLayoutInputForAxis(
padding.horizontal + (cellSize.x + spacing.x) * minColumns - spacing.x,
padding.horizontal + (cellSize.x + spacing.x) * preferredColumns - spacing.x,
-1, 0);
}

public override void CalculateLayoutInputVertical()
{
int minRows = 0;

float width = rectTransform.rect.size.x;
int cellCountX = Mathf.Max(1, Mathf.FloorToInt((width - padding.horizontal + spacing.x + 0.001f) / (cellSize.x + spacing.x)));
// minRows = Mathf.CeilToInt(rectChildren.Count / (float)cellCountX);
minRows = 1;
float minSpace = padding.vertical + (cellSize.y + spacing.y) * minRows - spacing.y;
SetLayoutInputForAxis(minSpace, minSpace, -1, 1);
}

public override void SetLayoutHorizontal()
{
SetCellsAlongAxis(0);
}

public override void SetLayoutVertical()
{
SetCellsAlongAxis(1);
}

int cellsPerMainAxis, actualCellCountX, actualCellCountY;
int positionX;
int positionY;
float totalWidth = 0;
float totalHeight = 0;

float lastMaxHeight = 0;

private void SetCellsAlongAxis(int axis)
{
// Normally a Layout Controller should only set horizontal values when invoked for the horizontal axis
// and only vertical values when invoked for the vertical axis.
// However, in this case we set both the horizontal and vertical position when invoked for the vertical axis.
// Since we only set the horizontal position and not the size, it shouldn't affect children's layout,
// and thus shouldn't break the rule that all horizontal layout must be calculated before all vertical layout.

float width = rectTransform.rect.size.x;
float height = rectTransform.rect.size.y;

int cellCountX = 1;
int cellCountY = 1;

if (cellSize.x + spacing.x <= 0)
cellCountX = int.MaxValue;
else
cellCountX = Mathf.Max(1, Mathf.FloorToInt((width - padding.horizontal + spacing.x + 0.001f) / (cellSize.x + spacing.x)));

if (cellSize.y + spacing.y <= 0)
cellCountY = int.MaxValue;
else
cellCountY = Mathf.Max(1, Mathf.FloorToInt((height - padding.vertical + spacing.y + 0.001f) / (cellSize.y + spacing.y)));

cellsPerMainAxis = cellCountX;
actualCellCountX = Mathf.Clamp(cellCountX, 1, rectChildren.Count);
actualCellCountY = Mathf.Clamp(cellCountY, 1, Mathf.CeilToInt(rectChildren.Count / (float)cellsPerMainAxis));

Vector2 requiredSpace = new Vector2(
actualCellCountX * cellSize.x + (actualCellCountX - 1) * spacing.x,
actualCellCountY * cellSize.y + (actualCellCountY - 1) * spacing.y
);
Vector2 startOffset = new Vector2(
GetStartOffset(0, requiredSpace.x),
GetStartOffset(1, requiredSpace.y)
);

totalWidth = 0;
totalHeight = 0;
Vector2 currentSpacing = Vector2.zero;
for (int i = 0; i < rectChildren.Count; i++)
{
SetChildAlongAxis(rectChildren[i], 0, startOffset.x + totalWidth /*+ currentSpacing[0]*/, rectChildren[i].rect.size.x);
SetChildAlongAxis(rectChildren[i], 1, startOffset.y + totalHeight /*+ currentSpacing[1]*/, rectChildren[i].rect.size.y);

currentSpacing = spacing;

totalWidth += rectChildren[i].rect.width + currentSpacing[0];

if (rectChildren[i].rect.height > lastMaxHeight)
{
lastMaxHeight = rectChildren[i].rect.height;
}

if (i<rectChildren.Count-1)
{
if (totalWidth + rectChildren[i+1].rect.width + currentSpacing[0] > width )
{
totalWidth = 0;
totalHeight += lastMaxHeight + currentSpacing[1];
lastMaxHeight = 0;
}
}
}
}
}

如何使用
  • 将此脚本附加到您的面板,就像您使用其他布局组(如 GridViewLayout
  • )一样
  • 添加 UI 元素(按钮、图像等)作为面板的子元素。
  • 添加 ContentSizeFitter子组件并设置 Horizontal FitVertical Fit属性到 首选尺寸
  • 添加 Layout Element组件到子组件并设置 Preferred WidthPreferred Height值。这些值将控制 UI 元素的大小。您也可以使用 Min WidthMin Height反而。
  • 添加任意数量的元素并应用相同的程序以获得所需的大小。

  • 这是在检查器窗口中的样子:

    Preview

    用不同尺寸的按钮测试过,效果很好。

    This is how it looks like

    注意:
  • 我修改了 GridLayoutGroup从 Unity UI 代码中获取所需的类
    行为。因为它源自 LayoutGroup哪个控制
    child RectTransform特性。我们需要使用ContentSizeFitterLayoutElement在 child 改变他们的
    尺寸。
  • GridLayout 不同,它仅适用于从左上角开始的水平流。这允许从垂直开始并从其他角落开始。我不认为这是一个限制,因为这只是 可以预期的行为。流布局组 .
  • 我还添加了一个 Repository on GithHub如果有人想为此做出贡献。

  • 谢谢!

    关于unity3d - 根据 Horizo​​ntalLayoutGroup 等,更正 Unity3D 中的 'FlowLayoutGroup',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38336835/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com