首页 > 解决方案 > 创建新的 Sprite() C# Unity

问题描述

我正在尝试创建一个与基于项目类型的图标匹配的函数。当我找到项目类型时,我想将适当的图像分配给 Sprite 对象并返回它。

但是,我不断收到错误消息“元素精灵不包含接受以下数量参数的构造函数”。

private Sprite ReturnItemIcon(BaseItem item)
    {
        Sprite icon = new Sprite();

        if(item.ItemType == BaseItem.ItemTypes.ELIXIR)
        {
            BaseElixirItem elixiritem = (BaseElixirItem)item;

            if(elixiritem.ElixirType == BaseElixirItem.ElixirTypes.ORDINARY)
            {
                icon = Resources.Load<Sprite>("ItemIcons/ordinaryelixir");
            } 
            else if (elixiritem.ElixirType == BaseElixirItem.ElixirTypes.RARE)
            {
                icon = Resources.Load<Sprite>("ItemIcons/rareelixir");
            } 
            else if (elixiritem.ElixirType == BaseElixirItem.ElixirTypes.LEGENDARY) 
            {
                icon = Resources.Load<Sprite>("ItemIcons/legendaryelixir");
            }
        } 
        else if(item.ItemType == BaseItem.ItemTypes.EQUIPMENT)
        {
            //sprawdzenie typow przedmiotow
        } 
        else if(item.ItemType == BaseItem.ItemTypes.CHEST)
        {
            //i tu tez
        }

        return icon;
    }

我将添加我遵循教程:TUTORIAL

教程中不会出现此问题。我猜是因为Unity的旧版本?

我怎样才能解决这个问题,这样我就不必改变我的概念了?

标签: c#unity3d

解决方案


一般来说,你不使用new你使用Sprite.Create,例如

sprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f);

但是,在您的情况下,您只需要使用icon = null. 无需创建无论如何都会扔掉的精灵。

private Sprite ReturnItemIcon(BaseItem item)
{
    Sprite icon = null;

    // then you should better use switch-case blocks
    switch(item.ItemType)
    {
        case BaseItem.ItemTypes.ELIXIR:
            BaseElixirItem elixiritem = (BaseElixirItem)item;

            switch(elixiritem.ElixirType)
            {
                case BaseElixirItem.ElixirTypes.ORDINARY:
                    icon = Resources.Load<Sprite>("ItemIcons/ordinaryelixir");
                    break;

                case BaseElixirItem.ElixirTypes.RARE:
                    icon = Resources.Load<Sprite>("ItemIcons/rareelixir");
                    break;

                case BaseElixirItem.ElixirTypes.LEGENDARY:
                    icon = Resources.Load<Sprite>("ItemIcons/legendaryelixir");
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(elixiritem.ElixirType), elixiritem.ElixirType, null);
            }
            break;

        case BaseItem.ItemTypes.EQUIPMENT:
            //sprawdzenie typow przedmiotow
            break;

        case BaseItem.ItemTypes.CHEST:
            //i tu tez
            break;

        default:
            throw new ArgumentOutOfRangeException(nameof(item.ItemType), item.ItemType, null);
    }

    return icon;
}

或者干脆不使用“全局”变量,但尽可能接近使用情况声明它们:

private Sprite ReturnItemIcon(BaseItem item)
{
    switch(item.ItemType)
    {
        case BaseItem.ItemTypes.ELIXIR:
            BaseElixirItem elixiritem = (BaseElixirItem)item;

            switch(elixiritem.ElixirType)
            {
                case BaseElixirItem.ElixirTypes.ORDINARY:
                    return Resources.Load<Sprite>("ItemIcons/ordinaryelixir");

                case BaseElixirItem.ElixirTypes.RARE:
                    return Resources.Load<Sprite>("ItemIcons/rareelixir");

                case BaseElixirItem.ElixirTypes.LEGENDARY:
                    return Resources.Load<Sprite>("ItemIcons/legendaryelixir");

                default:
                    throw new ArgumentOutOfRangeException(nameof(elixiritem.ElixirType), elixiritem.ElixirType, null);
            }

        case BaseItem.ItemTypes.EQUIPMENT:
            //sprawdzenie typow przedmiotow
            break;

        case BaseItem.ItemTypes.CHEST:
            //i tu tez
            break;

        default:
            throw new ArgumentOutOfRangeException(nameof(item.ItemType), item.ItemType, null);
    }
}

只要确保每个可能的分支都返回一些东西(或者无论如何都以抛出结束)。


推荐阅读