Unity 4.3 – 2D,如何以编程方式将sprite分配给对象

我正在尝试创建一个负责创建和显示不同精灵的对象,因此我想以编程方式直接访问assets / sprite,而不是在该对象下的层次结构中拖放精灵。

有一种方法可以以编程方式创建一个新的sprite并分配我在assets文件夹中的内容吗?

我也希望有一种数据结构,在游戏开始时加载一些图像,数组或字典或类似的东西,所以我可以根据我需要显示的图像的某些情况进行更改。 但是,因为我刚开始使用Unity,所以让我感到困惑的是如何使用assets文件夹以编程方式创建一个sprite引用精灵。

编辑进度:

我创建了一个像这样的sprite:

public Sprite[] mySprites; 

在Unity中我手动在数组中添加了精灵(我只是在变量数组中拖动了png)所以实际上在这个对象中我有一个组件,这个数组充满了精灵

在组件内部我也做到了这一点:

 public SpriteRenderer renderer; renderer = transform.GetComponent(); renderer.sprite = (Sprite)mySprites [0]; 

我没有错误,直到我运行游戏,然后没有分配精灵,我得到了这个:

“解除引用时PPtr强制失败!从Texture2D到Sprite的Castin!”

即使没有强制转换(Sprite)我也得到了这个错误。顺便说一句我不知道为什么他告诉我关于Texture2D的事情,因为它被设置为精灵

以编程方式创建精灵可能有点难度。 您可能需要在内存中创建纹理,填充数据,然后在磁盘上写入该纹理。 之后,您应该能够使用C#的文件或Unity的WWW.LoadFromCacheOrDownload来读取它。

以下是动态创建纹理的方法: http : //answers.unity3d.com/questions/9919/how-do-i-create-a-texture-dynamically-in-unity.html


要以编程方式加载精灵(不是动态创建的精灵),它们需要位于名为Resources(这是一个特殊文件夹 )的文件夹下 。

即假设您在名为Sprites的文件夹下有一个名为MySprite.png的精灵,该文件夹位于名为Resources的文件夹下。 然后你会像这样加载它:

 renderer.sprite = Resources.Load("Sprites/MySprite"); 

(注意你不包括Resources文件夹和精灵的扩展名)

您可以在“运行时加载资源”文档中找到更多详细信息。


取消引用时,PPtr转换失败!

我做了一些搜索,并从这个论坛post中发现,当你有一个类型的列表然后将其更改为另一种类型时,通常会发生这种情况。 即如果mySprites在某些时候GameObject []并且您链接了一堆Sprite,然后将其更改为Sprite []。 而且因为它专门说Texture2D,我假设您的Sprites(或其中一些)的导入设置被设置为Texture而不是Sprite:

精灵导入设置


此外, 所有MonoBehaviours都有一个名为renderer的字段 ,它是Renderer类型。 我建议您重命名该字段以避免混淆,除非您仅将其用作示例。

这是真正的代码..会帮助你

 void SetSprite(UI2DSprite uiSprite, Sprite[] sprites, string strKey) { foreach (Sprite stexture in sprites) { if (stexture.name == strKey) { uiSprite.sprite2D = stexture; break; } } } 

按照方式使用它..

 UI2DSprite[] uiSprites = tmpObject.GetComponentsInChildren(); Sprite[] sprites = Resources.LoadAll("Textures"); string resName = "icon_favorite_2"; foreach (UI2DSprite uiSprite in uiSprites) { if(uiSprite.name = "icon") SetSprite(uiSprite, sprites , resName); }