【问题标题】:Unity 4.3 - 2D, how to assign programmatically sprites to an objectUnity 4.3 - 2D,如何以编程方式将精灵分配给对象
【发布时间】:2014-04-21 05:59:33
【问题描述】:

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

有一种方法可以以编程方式创建新精灵并分配资产文件夹中的内容吗?

我还希望有一种数据结构,其中包含在游戏开始时加载的一些图像、数组或字典或类似的东西,这样我就可以根据需要显示的图像进行更改。但是,由于我是 Unity 新手,所以让我感到困惑的是如何使用 assets 文件夹以编程方式创建一个引用精灵的精灵。

编辑进度:

我创建了一个这样的精灵数组:

public Sprite[] mySprites;

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

在组件内部我也这样做了:

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

在我运行游戏之前我没有收到任何错误,然后精灵没有被分配,我得到了这个:

“解除引用时 PPtr 转换失败!从 Texture2D 转换为 Sprite!”

即使没有强制转换(Sprite)我也遇到了这个错误,顺便说一句,我不知道他为什么告诉我有关 Texture2D 的事情,因为一切都设置为 sprite

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    以编程方式创建精灵可能有点太难了。您可能需要在内存中创建一个纹理,填充数据,然后将该纹理写入磁盘。之后,您应该可以使用 C# 的 File 或 Unity 的 WWW.LoadFromCacheOrDownload 来阅读它。

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


    要以编程方式加载您的 sprite(不是动态创建的),它们需要位于名为 Resources 的文件夹下(即 special folder)。

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

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

    (请注意您如何不包含 Resources 文件夹和精灵的扩展名)

    您可以在Loading Resources at Runtime 文档中找到更多详细信息。


    解除引用时 PPtr 转换失败!

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


    还有all MonoBehaviours have already a field named renderer,它的类型是Renderer。我建议您重命名该字段以避免混淆,除非您仅将其用作示例。

    【讨论】:

      【解决方案2】:

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

      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<UI2DSprite>();
       Sprite[] sprites = Resources.LoadAll<Sprite>("Textures");
       string resName = "icon_favorite_2";
      
       foreach (UI2DSprite uiSprite in uiSprites)
       {
       if(uiSprite.name = "icon")
        SetSprite(uiSprite, sprites , resName);
      
       }
      

      【讨论】:

        【解决方案3】:

        只是为了投入我的价值。当我在代码中将 SerializedField 从 Texture2D 更改为 Sprite 时,我遇到了这个问题。纹理在编辑器中已经是精灵,但在代码中它需要是精灵。编辑器中的字段最初表示类型不匹配,然后再次显示精灵纹理。 为了解决这个问题,我将编辑器中的字段设置为无并将其重置为所需的精灵。

        【讨论】:

          猜你喜欢
          • 2015-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-09
          相关资源
          最近更新 更多