如何简化并使其更优雅?

时间:2013-12-12 21:51:05

标签: c# unity3d

以下用于创建具有不同高度矩形的砌体效果。如何简化并使其更优雅?

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);

1 个答案:

答案 0 :(得分:2)

粗略一瞥的一些提示:

  • 您可能需要考虑使用一些RectangleSizePoint结构来封装x/ywidth/height的集合。例如,void AddCard(int index, int column, Size size)。我还建议反对缩短变量名称。使用column代替col,它最终会向您支付股息。

  • 小心使用+运算符进行string连接。对于此示例,可读性可能是可接受的,但是如果您发现自己连接多个字符串,请使用string.Format(...)。如果您需要动态构建字符串,请使用StringBuilderAppend方法,最后使用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;
}