web-dev-qa-db-ja.com

Unity 4.3-2D、プログラムでスプライトをオブジェクトに割り当てる方法

さまざまなスプライトの作成と表示を担当するオブジェクトを作成しようとしているので、そのオブジェクトの下の階層にスプライトをドラッグアンドドロップするのではなく、プログラムから直接アセット/スプライトにアクセスしたいと思います。

プログラムで新しいスプライトを作成し、アセットフォルダーにあるものを割り当てる方法はありますか?

また、ゲームの開始時に読み込まれるいくつかの画像、配列または辞書などの一種のデータ構造を用意して、表示する必要がある画像に基づいて変更できるようにしたいと考えています。しかし、Unityを初めて使用するので混乱するのは、アセットフォルダーを使用してプログラムでSpriteへの参照を取得するSpriteを作成する方法です。

進行に合わせて編集:

私はこのようなスプライトの配列を作成しました:

public Sprite[] mySprites;

unityでは、手動で配列内にスプライトを追加しました(変数配列内にpngをドラッグしただけです)。このオブジェクトには、実際には、この配列にスプライトが満載されたコンポーネントがあります。

コンポーネントの内部でもこれを行いました:

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

ゲームを実行するまでエラーは発生しませんでしたが、スプライトは割り当てられず、これが発生しました。

「逆参照時にPPtrキャストが失敗しました!Texture2DからSpriteへのCastin!」

(Sprite)をキャストしなくてもこのエラーが発生しましたが、非常にすべてがSpriteとして設定されているため、なぜ彼がTexture2Dについて私に言っているのかわかりません

12
Adarkuccio

プログラムでSpriteを作成するのは、少し難しいかもしれません。メモリ内にテクスチャを作成し、データを入力して、そのテクスチャをディスクに書き込む必要があるでしょう。その後、C#のファイルまたはUnityの WWW.LoadFromCacheOrDownload を使用してそれを読み取ることができるはずです。

ここでは、動的にテクスチャを作成する方法を示します。 http://answers.unity3d.com/questions/9919/how-do-i-create-a-texture-dynamically-in-unity.html


(動的に作成されたスプライトではなく)プログラムでスプライトをロードするには、Resourcesという名前のフォルダーの下にある必要があります(これは 特別なフォルダー です)。

つまりResourcesという名前のフォルダーの下にあるSpritesという名前のフォルダーの下にMySprite.pngという名前のSpriteがあるとします。次に、次のようにロードします。

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

(ResourcesフォルダーとSpriteの拡張子を含めない方法に注意してください)

詳細については、 実行時のリソースの読み込み のドキュメントを参照してください。


逆参照時にPPtrキャストが失敗しました!

私はいくつかの検索を行い、- このフォーラムの投稿 から見つけました。これは通常、あるタイプのリストがあり、それを別のタイプに変更したときに発生します。つまりmySpritesがある時点でGameObject []であり、一連のSpriteをリンクしてから、それをSprite []に​​変更した場合。また、具体的にはTexture2Dと表示されているため、Sprites(またはその一部)のインポート設定がSpriteではなくTextureに設定されていると想定しています。

Sprite import settings


また、 すべてのMonoBehavioursには既にレンダラーという名前のフィールドがあります で、タイプは Renderer です。例としてのみ使用している場合を除き、混乱を避けるためにそのフィールドの名前を変更することをお勧めします。

12
pek

これが実際のコードです。

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

 }
1
gitstar

私のタッペンの価値を投入するだけです。コードでSerializedFieldをTexture2DからSpriteに変更すると、この問題が発生しました。テクスチャはすでにエディタではスプライトでしたが、コードではスプライトである必要がありました。エディタのフィールドは、最初はタイプが一致しないと言っていたため、スプライトテクスチャを再度表示していました。これを修正するには、エディターのフィールドをnoneに設定し、必要なSpriteにリセットします。

0
s1ni5t3r