c# - 创建新的 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的旧版本?
我怎样才能解决这个问题,这样我就不必改变我的概念了?
解决方案
一般来说,你不使用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);
}
}
只要确保每个可能的分支都返回一些东西(或者无论如何都以抛出结束)。
推荐阅读
- sql-server - SQL Server LEFT OUTER JOIN HAVING 条件限制结果
- python - Tkinter 更好的背景
- reactjs - 未定义的 css 模块类名
- google-app-maker - 如何向组织外部的用户公开我的应用程序制造商应用程序
- ssis - SSIS 2016 系统变量 System::ErrorDescription 缺失?
- kubernetes - 如何在 N 小时内运行一次 Kubernetes 作业?
- c# - 测试控制器时如何模拟viewModel?
- android - 数字Edittext上的多个点
- azure - Application Insights Analytics 同一会话中的多个事件
- c# - 在 Xamarin Android 中访问 UI 线程