以下用于创建具有不同高度矩形的砌体效果。如何简化并使其更优雅?
private float startX = 0.0f;
private float startY = 0.0f;
private float posX = 0.0f;
private float posY = 0.0f;
private float prevWidth = 0;
private float prevHeight = 0;
private int index = 0;
private int currentCol = 0;
private void AddCard(int index, int col, float width, float height)
{
GameObject goCard = (GameObject)GameObject.Instantiate(pfCard00);
PackedSprite psCard = goCard.GetComponentInChildren<PackedSprite>();
goCard.name = "QuestItemCard" + index.ToString();
goCard.transform.parent = goCardContainer.transform;
psCard.height = height;
if (currentCol != col)
{
posX += width;
posY = 0;
prevHeight = 0;
}
// placement
posY += (prevHeight / 2) + (height / 2);
goCard.transform.localPosition = new Vector3(startX + posX, startY - posY, goCard.transform.position.z);
if (currentCol != col)
{
prevWidth = width;
currentCol = col;
}
prevHeight = height;
}
用法:
AddCard(0, 0, 100, 100);
AddCard(1, 0, 100, 100);
AddCard(2, 0, 100, 100);
AddCard(3, 0, 100, 200);
AddCard(0, 1, 100, 100);
AddCard(1, 1, 100, 100);
AddCard(2, 1, 100, 100);
AddCard(3, 1, 100, 200);
答案 0 :(得分:2)
粗略一瞥的一些提示:
您可能需要考虑使用一些Rectangle
,Size
和Point
结构来封装x/y
和width/height
的集合。例如,void AddCard(int index, int column, Size size)
。我还建议反对缩短变量名称。使用column
代替col
,它最终会向您支付股息。
小心使用+
运算符进行string
连接。对于此示例,可读性可能是可接受的,但是如果您发现自己连接多个字符串,请使用string.Format(...)
。如果您需要动态构建字符串,请使用StringBuilder
和Append
方法,最后使用ToString()
。还要考虑将此逻辑移动到构建工厂/构造函数的名称。
此外,避免使用内联字符串常量,而是在其他位置创建常量变量,例如static readonly string QuestItemCardName = "QuestItemCard"
并使用它。这将有助于减少拼写错误,并且如果将来需要,您还可以在一个地方重构错误。
使用var
关键字(如果您的.NET版本允许)。例如,var gameObject = GameObject.Instantiate(...)
。这样可以减少冗长的代码,并在重构时为您提供一些灵活性。让编译器为您进行类型推理。
为对象类创建通用工厂方法。您的GameObject
似乎有Instantiate()
。您应该将其更改为Instantiate<T>(...)
,这样就无需转换返回值。结合var
,这将是一个更整洁的代码。
至于几何数学,希望其他人可以在这里发声。
更新:根据OP代码的假设,我将在上面列出的更改:
struct Point
{
public float X { get; set; }
public float Y { get; set; }
}
struct Size
{
public float Width { get; set; }
public float Height { get; set; }
}
struct Rectangle
{
public Point Location { get; set; }
public Size Size { get; set; }
}
private Point origin; // startX/Y
private Point position; // posX/Y
private Size previousSize; // previousWidth/Height
private int index = 0;
private int currentColumn;
private static readonly string QuestItemCardPrefix = "QuestItemCard";
private void AddCard(int index, int column, Size size)
{
var card = GameObject.Instantiate(pfCard00);
var cardSprite = card.GetComponentInChildren<PackedSprite>();
card.name = QuestItemCardPrefix + index.ToString();
card.transform.parent = goCardContainer.transform;
cardSprite.height = size.Height;
if (currentColumn != column)
{
position.X += width;
position.Y = 0;
previousSize.Height = 0;
}
// placement
position.Y += (previousSize.Height / 2) + (size.Height / 2);
card.transform.localPosition = new Vector3(origin.X + position.X, origin.Y - position.Y, card.transform.position.z);
if (currentColumn != column)
{
previousSize.Width = size.width;
currentColumn = column;
}
previousSize.Height = size.height;
}