web-dev-qa-db-fra.com

Unity 4.3 - 2D, comment affecter des sprites par programme à un objet

J'essaie de créer un objet qui sera chargé de créer et d'afficher différents sprites, donc je voudrais accéder directement aux actifs/sprites par programmation au lieu de glisser-déposer un sprite dans la hiérarchie sous cet objet.

Il existe un moyen de créer par programme un nouveau Sprite et d'attribuer ce que j'ai dans le dossier d'actifs?

Je voudrais également avoir une sorte de structure de données avec quelques images chargées au début du jeu, un tableau ou un dictionnaire ou quelque chose comme ça afin que je puisse changer en fonction de certaines situations quelles images je dois montrer. Mais ce qui m'embrouille depuis que je suis nouveau dans Unity, c'est comment créer un Sprite en prenant la référence au Sprite par programme en utilisant le dossier des ressources.

modifier avec progrès:

J'ai créé un tableau de sprites comme celui-ci:

public Sprite[] mySprites;

dans Unity j'ai ajouté des sprites à l'intérieur du tableau manuellement (je viens de faire glisser des png à l'intérieur du tableau de variables) donc en fait dans cet objet j'ai un composant avec ce tableau plein de sprites

à l'intérieur du composant, j'ai également fait ceci:

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

Je n'ai eu aucune erreur jusqu'à ce que je lance le jeu, puis le Sprite n'est PAS attribué et j'ai obtenu ceci:

"Le cast PPtr a échoué lors du déréférencement! Castin de Texture2D vers Sprite!"

J'ai eu cette erreur même sans casting (Sprite) et btw je ne sais pas pourquoi il me parle de Texture2D car tout est défini comme Sprite

12
Adarkuccio

Créer un Sprite par programme peut être un peu trop difficile à faire. Vous auriez probablement besoin de créer une texture en mémoire, de remplir les données, puis d'écrire cette texture sur le disque. Après cela, vous devriez pouvoir lire cela à l'aide du fichier C # ou de l'Unity WWW.LoadFromCacheOrDownload .

Voici comment créer une texture dynamiquement: http://answers.unity3d.com/questions/9919/how-do-i-create-a-texture-dynamically-in-unity.html


Pour charger vos sprites par programmation (mais pas ceux créés dynamiquement), ils doivent être sous un dossier avec le nom Resources (qui est un dossier spécial ).

C'est à dire. supposons que vous avez un Sprite nommé MySprite.png sous un dossier nommé Sprites qui se trouve sous un dossier nommé Resources. Vous le chargeriez alors comme ceci:

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

(remarquez comment vous n'incluez pas le dossier Resources et l'extension du Sprite)

Vous pouvez trouver plus de détails dans la documentation Loading Resources at Runtime .


La conversion PPtr a échoué lors du déréférencement!

J'ai fait quelques recherches et découvert à partir de ce message sur le forum que cela se produit généralement lorsque vous avez une liste d'un type, puis que vous la changez en un autre type. C'est à dire. si mySprites était à un moment donné GameObject [] et que vous avez lié un groupe de Sprites, puis que vous l'avez changé en Sprite []. Et comme il dit spécifiquement Texture2D, je suppose que les paramètres d'importation de vos Sprites (ou certains d'entre eux) sont définis sur Texture au lieu de Sprite:

Sprite import settings


Aussi, tous les MonoBehaviours ont déjà un champ nommé renderer , qui est de type Renderer . Je vous suggère de renommer ce champ pour éviter toute confusion, sauf si vous ne l'avez utilisé que comme exemple.

12
pek

Voici le vrai code .. vous aidera

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

utilisez-le en suivant le chemin ..

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

Juste pour jeter ma valeur tuppence. J'ai eu ce problème lorsque j'ai changé un SerializedField de Texture2D à Sprite dans le code. La texture était déjà un Sprite dans l'éditeur mais elle devait être Sprite dans le code. Le champ dans l'éditeur indiquait initialement une incompatibilité de type, puis affichait à nouveau la texture Sprite. Pour y remédier, je mets le champ dans l'éditeur à zéro et le réinitialise au Sprite requis.

0
s1ni5t3r